=
文章目录
- 背景
- 一、平台设计
- 二、视频显示模块实现
- 1、视频模块实现框架
- 2、python-camera数据生成
- 3、labview-camera数据可视化
- 三、效果展示
背景
在使用carla的时候,有平台的话可以提高效率,因此想结合labview和carla设计一个仿真平台-labcar。其实carla对python的兼容性更强,想过用pyqt或者vue+flask方法去设计仿真平台,但是考虑到上位机的UI设计和硬件控制还是labview更有优势一点,加上我的labview用的也比较熟练,所以就选择了labview。
一、平台设计
1、UI的话简单地设计了一下布局,不过后期的话肯定要修改跟完善的,不过下面这些设计基本也够使用的了。
2、平台框架
这种方式不跑在实时机,但是数据如果统一由python调度,加上can端用python-can控制canoe去控制报文发送,这种模式应该还是挺稳定的。
二、视频显示模块实现
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这部分我花了好长时间才试出来,因为网上根本没有案例。。