Carla中6种Camera传感器的使用方法

作者 | 李慢慢1990  编辑 | 车路漫漫

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【仿真测试】技术交流群

本文只做学术分享,如有侵权,联系删文

a9a60ee68e26892f2d525da98a41a633.png

本周末开始学习一些关于图像识别的东西。

Carla仿真模拟器中提供了很多种传感器,其中摄像头(camera)就有6种,他们分别是:

1、rgb:红绿蓝

2、semantic segmentation:语义分割

3、instance segmentation:实例分割

4、depth:深度

5、dvs:动态视觉

6、optical_flow:光流

各种传感器的效果如下:

b4d3767cdc7f27f58bb20db973eed429.png

其实摄像头传感器本质上只有一个,摄像头拍摄到的RGB图像,经过各种图像识别算法,就能转换成语义分割、实例分割、深度图等。但是Carla比较人性化,直接将各种图像识别的算法做成了不同种类的摄像头传感器模型,方便开发人员调用,直接拿到各种算法结果的真值。

下面简单记录下Carla种创建这6种摄像头的过程:

第一步:在仿真世界中创建主车。

# 创建一个客户端,连接到服务器端口
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 获取当前的仿真世界
world = client.get_world()
# 获取当前世界中的蓝图库
blueprint_library = world.get_blueprint_library()
# 从蓝图库中筛选出来特斯拉的‘model3’ 这个车车
bp = blueprint_library.filter('model3')[0]
print("the vehicle blueprint:", bp)
# 从地图中获取生成点
spawn_points = world.get_map().get_spawn_points()
# 利用车辆蓝图和地图生成点,创建车辆
vehicle_ego = world.spawn_actor(bp, spawn_points[1])
# 设置车辆为自动驾驶模式
vehicle_ego.set_autopilot(True)
# 将车辆加入参与者列表,方便后期统一删除
actor_list.append(vehicle_ego)

第二步:在主车上创建各种摄像头。

# 从蓝图库中筛选出来‘camera’蓝图,查看有哪些摄像头模型可以使用
camera_bp_list = blueprint_library.filter('camera')
for camera_bp_i in camera_bp_list:
    print("found sensor, id:", camera_bp_i.id)


# 创建一个坐标位置
sensor_location = carla.Transform(carla.Location(x=-4, z=2))
image_size_x = 400
image_size_y = 300
# 创建一个rgb摄像头传感器到主车上
bp_camera_rgb = blueprint_library.find('sensor.camera.rgb')
bp_camera_rgb.set_attribute('image_size_x', str(image_size_x))
bp_camera_rgb.set_attribute('image_size_y', str(image_size_y))
my_camera_rgb = world.spawn_actor(bp_camera_rgb, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_rgb)


# 创建一个semantic摄像头传感器到主车上
bp_camera_sem = blueprint_library.find('sensor.camera.semantic_segmentation')
bp_camera_sem.set_attribute('image_size_x', str(image_size_x))
bp_camera_sem.set_attribute('image_size_y', str(image_size_y))
my_camera_sem = world.spawn_actor(bp_camera_sem, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_sem)


# 创建一个instance摄像头传感器到主车上
bp_camera_ins = blueprint_library.find('sensor.camera.instance_segmentation')
bp_camera_ins.set_attribute('image_size_x', str(image_size_x))
bp_camera_ins.set_attribute('image_size_y', str(image_size_y))
my_camera_ins = world.spawn_actor(bp_camera_ins, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_ins)


# 创建一个depth摄像头传感器到主车上
bp_camera_dep = blueprint_library.find('sensor.camera.depth')
bp_camera_dep.set_attribute('image_size_x', str(image_size_x))
bp_camera_dep.set_attribute('image_size_y', str(image_size_y))
my_camera_dep = world.spawn_actor(bp_camera_dep, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_dep)


# 创建一个dvs摄像头传感器到主车上
bp_camera_dvs = blueprint_library.find('sensor.camera.dvs')
bp_camera_dvs.set_attribute('image_size_x', str(image_size_x))
bp_camera_dvs.set_attribute('image_size_y', str(image_size_y))
my_camera_dvs = world.spawn_actor(bp_camera_dvs, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_dvs)


# 创建一个optical_flow摄像头传感器到主车上
bp_camera_opt = blueprint_library.find('sensor.camera.optical_flow')
bp_camera_opt.set_attribute('image_size_x', str(image_size_x))
bp_camera_opt.set_attribute('image_size_y', str(image_size_y))
my_camera_opt = world.spawn_actor(bp_camera_opt, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_opt)

第三步、获取各种摄像头的仿真结果。

image_w = bp_camera_rgb.get_attribute("image_size_x").as_int()
image_h = bp_camera_rgb.get_attribute("image_size_y").as_int()
image_size = (image_h, image_w, 4)
sensor_data = {"image_rgb": np.zeros(image_size),
               "image_sem": np.zeros(image_size),
               "image_ins": np.zeros(image_size),
               "image_dep": np.zeros(image_size),
               "image_dvs": np.zeros(image_size),
               "image_opt": np.zeros(image_size)}  # init
my_camera_rgb.listen(lambda image: callback_camera_rgb(image, sensor_data))
my_camera_sem.listen(lambda image: callback_camera_sem(image, sensor_data))
my_camera_ins.listen(lambda image: callback_camera_ins(image, sensor_data))
my_camera_dep.listen(lambda image: callback_camera_dep(image, sensor_data))
my_camera_dvs.listen(lambda image: callback_camera_dvs(image, sensor_data))
my_camera_opt.listen(lambda image: callback_camera_opt(image, sensor_data))

第四步、创建opencv窗口,显示各种传感器数据。

window_name = "li-man-man: Camera Image Display"
cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE)
# 初始化顯示窗口:黑色
# combine all camera data as one.
top_row = np.concatenate((sensor_data["image_rgb"],sensor_data["image_sem"],sensor_data["image_ins"]), axis=1)
low_row = np.concatenate((sensor_data["image_dep"],sensor_data["image_dvs"],sensor_data["image_opt"]), axis=1)
tiled = np.concatenate((top_row, low_row), axis=0)
cv2.imshow(window_name, tiled)
cv2.waitKey(1)


while True:
    # sensor_data 在被listen不断更新,因此窗口在持续更新
    top_row = np.concatenate((sensor_data["image_rgb"], sensor_data["image_sem"], sensor_data["image_ins"]), axis=1)
    low_row = np.concatenate((sensor_data["image_dep"], sensor_data["image_dvs"], sensor_data["image_opt"]), axis=1)
    tiled = np.concatenate((top_row, low_row), axis=0)
    cv2.imshow(window_name, tiled)
    # cv2.imshow(window_name, sensor_data["image_rgb"])
    # print("tiled.shape:", tiled.shape)
    if cv2.waitKey(1) == ord("q"):  # 按‘q’退出窗口
        break
cv2.destroyAllWindows()

ok,上述代码组合起来运行,就是下面视频的效果啦:

代码真的是好难调试呀。

能看到几个传感器都正常显示出图像来,真的是快哭了。

本文完。

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署协同感知语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

8f64179db6e1aabcb5cf6419205e73a9.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

b01f3c6921d24697fb26eb252a885dff.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

cd4e1dbf233fd255af0bd80c9cb03caa.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

e33881a2f21a74b5c8b2399fc4d03d03.jpeg

猜你喜欢

转载自blog.csdn.net/CV_Autobot/article/details/133398676