=


背景

在使用carla的时候,有平台的话可以提高效率,因此想结合labview和carla设计一个仿真平台-labcar。其实carla对python的兼容性更强,想过用pyqt或者vue+flask方法去设计仿真平台,但是考虑到上位机的UI设计和硬件控制还是labview更有优势一点,加上我的labview用的也比较熟练,所以就选择了labview。


一、平台设计

1、UI的话简单地设计了一下布局,不过后期的话肯定要修改跟完善的,不过下面这些设计基本也够使用的了。

在这里插入图片描述

2、平台框架

这种方式不跑在实时机,但是数据如果统一由python调度,加上can端用python-can控制canoe去控制报文发送,这种模式应该还是挺稳定的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1644725ec19e462590b673d89439431b.png

二、视频显示模块实现

1、视频模块实现框架

在这里插入图片描述

2、python-camera数据生成

1)展示python处理视频数据部分,用线程实现,因为后续会有多个camera。这里的内容就比较简单,调用carla生成camera图像,然后再通过camera.listen()去回调函数处理image data,并发送至labview。

class GenarateCamera(threading.Thread):
    def __init__(self, world, ego_vehicle, camera_para):
        super(GenarateCamera, self).__init__()
        self.camera_para = camera_para
        self.tcp_socket = TcpSocketSetup(socket_port=self.camera_para.tcp_port)
        self.ego_vehicle = ego_vehicle
        self.camera_para = camera_para
        self.world = world
        self.camera = None
        self.start()

    def camera_callback(self, data):
        # image是RGBA图像数据
        image = np.frombuffer(data.raw_data, dtype=np.uint8).reshape((data.height, data.width, 4))
        # 从RGBA数据中提取RGB数据
        rgb_image = image[:, :, :3]
        # 将image转换成数组
        rgb_image_bytes = rgb_image.tobytes()
        self.send_image_to_platform(rgb_image_bytes)

    def send_image_to_platform(self, image_bytes):
        self.tcp_socket.send_data(image_bytes)

    def genarate_camera(self):
        camera_bp = self.world.get_blueprint_library().find('sensor.camera.rgb')
        camera_bp.set_attribute('image_size_x', str(self.camera_para.width))
        camera_bp.set_attribute('image_size_y', str(self.camera_para.height))
        relative_x = self.camera_para.relative_x if self.camera_para.relative_x != -999 else 0
        relative_y = self.camera_para.relative_y if self.camera_para.relative_y != -999 else 0
        relative_z = self.camera_para.relative_z if self.camera_para.relative_z != -999 else 0
        pitch = self.camera_para.pitch if self.camera_para.pitch != -999 else 0
        yaw = self.camera_para.yaw if self.camera_para.yaw != -999 else 0
        roll = self.camera_para.roll if self.camera_para.roll != -999 else 0

        # 设置Camera的安装坐标系
        camera_transform = carla.Transform(carla.Location(relative_x, relative_y, relative_z),
                                           carla.Rotation(pitch, yaw, roll))
        # 生成Camera
        self.camera = self.world.spawn_actor(camera_bp, camera_transform, attach_to=self.ego_vehicle,
                                   attachment_type=carla.libcarla.AttachmentType.Rigid)
        #接收camera数据
        self.camera.listen(self.camera_callback)

    def run(self):
        try:
            self.genarate_camera()
            while True:
                pass
        finally:
            self.camera.destroy()

3、labview-camera数据可视化

1)abview通过NI vision模块,将python发送过来的rgb数据可视化,python在传输数据的时候将image data转换成字节流了,labview接收到字节流之后先转换成字节数组,然后3个为一组取出rgb的数据,再根据图像的宽高排列成二维簇数据,然后使用NI vision的IMAQ ColorValueToInteger VI将rgb簇转换成u32位的像素值,最后再使用IMAQ ArrayToColorImage VI将数据可视化。
2)NI这部分我花了好长时间才试出来,因为网上根本没有案例。。

在这里插入图片描述


三、效果展示

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐