
# 创建一个客户端,连接到服务器端口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 = 400image_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)} # initmy_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))
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’退出窗口breakcv2.destroyAllWindows()
ok,上述代码组合起来运行,就是下面视频的效果啦:

