前言:我想验证SLAM代码的效果,所以需要构建一个能提供自己和周围动车的位姿/轨迹和语义分割、bbx的真实值的复杂动态环境(最好能超过目前KITTI-Tracking序列的动态复杂度),所以要能设置CARLA世界中动车的密度、速度、与自己的相对距离、相对方向,和自己的速度;并能记录双目RGB和实例分割、轨迹、BBX。
目录
1.CARLA 简介
2. 安装Carla客户端
3. 基础API的使用
3.1 client_bounding_boxes.py
3.2 draw_skeleton.py
3.3 dynamic_weather.py
3.4 generate_traffic.py
3.5 lidar_to_camera.py
3.6 manual_control.py
3.7 tutorial.py
3.8 tutorial_gbuffer.py
3.9 automatic_control.py
3.10-13 manual_control_carsim.py manual_control_chrono.py manual_control_steeringwheel.py manual_control_gbuffer.py
3.14 no_rendering_mode.py
3.15 open3d_lidar.py
3.16 start_recording.py
3.17 show_recorder_actors_blocked.py
3.18 show_recorder_collisions.py
3.19 show_recorder_file_info.py
3.20 start_replaying.py
3.21 visualize_multiple_sensors.py
3.22 synchronous_mode.py
3.23 sensor_synchronization.py
3.24 vehicle_gallery.py
3.25 vehicle_physics.py
4. 编写自己的脚本
CRALA是一款开源仿真器,用于自动驾驶系统的开发、训练和验证。
1.1 采用服务器多客户端的架构,客户端数量具有可扩展性,多个客户端可挂载在同一或不同节点,来控制不同的“角色”。客户端client通过python脚本作为应用程序接口API来给服务器端下达指令,修改天气、车辆的型号和行为模式、车速等,交给由UnrealEngine引擎构建的服务器端进行虚拟世界的构建和渲染。
1.2 用户可通过CARLA提供的各API来控制仿真环境中的交通状况、行人属性、天气、采用的传感器等。其中,传感器套件包括:LIDARs,多目相机,深度传感器和GPS、IMU等,照片竟然还有畸变和动态模糊效果,用户可以将这些传感器附加attach到不同的车辆来收集各个时刻的数据。
1.3 用于规划和控制的快速仿真模式禁用图形渲染,以快速执行不需要图形的交通模拟和道路行为。
1.4 通过RoadRunner工具,用户可创建自己的地图。
1.5 ScenarioRunner引擎可让用户基于行为模块自定义各种交通环境。
1.6 提供ROS-bridge,让Carla与ROS和Autoware交互。所以建议用Ubuntu18.04-20.04进行安装,否则Win平台与ROS平台容易出现兼容问题。
1.7 提供自动驾驶基线来作为可运行代理,包括AutoWare代理和Conditional Imitation Learning代理。
1.8 OpenAsset模块允许添加自定的物体来给Client调用。
具体安装过程:
手把手教你win11下安装carla并跑演示例子_carla 演示-CSDN博客
2.1 要求:系统是Windows或Linux。至少6GB(推荐8GB)的GPU。有硬盘空间20G。Python是CARLA主要的脚本语言,支持2.7或3.6-3.8。2个TCP端口(默认是2000和2001,确保不被防火墙或其他应用阻塞)和网络连接。如果做自驾开发最好是ubuntu系统。但我电脑没有AHCI数据传输模式所以目前装不了Ubuntu。
2.2 Windows 11安装Anaconda win11系统23年6月最新anaconda安装教程及配置环境变量_anaconda环境变量配置-CSDN博客
配置python3.7环境,这个版本要和carla版本一致。
【anaconda】conda创建、查看、删除虚拟环境(anaconda命令集)_conda 创建环境-CSDN博客
并查看pip版本是否符合CARLA版本的要求。
安装carla依赖库 pip3 install --user pygame numpy。(这个官网提供指令不全,具体见CARLA_0.9.14\WindowsNoEditor\PythonAPI\examples\requirement.txt列出的依赖库。)
2.3 选择Carla 的package安装方式。下载并解压缩CARLA_0.9.14.zip,它包含模拟器的预编译版本,Python API模块和一些用作示例的脚本。
双击运行CARlaUE4.exe,在我电脑上帧率可达到>60fps。
一共25个API,关于API的理解与应用,参考小飞自动驾驶系列分享 - 知乎 (zhihu.com)。
如果报HTTP错连不上Carla Server (default 127.0.0.1:2000),或分辨率太高导致传感器显示不对:
Carla学习笔记(二)——摄像机画面显示错误的解决办法,无法连接后台服务的解决办法_carla显示多窗口-CSDN博客
但有时候HTTP连不上是因为对应脚本里client.set_timeout(2.0)即设置的连接时间上限太短了,可以改大点,我一般改成20。
其中manual_control是功能最全的,功能>automatic_control;tutorial和tutorial_gbuffer是官方提供的辅助入门脚本,有详细注释。
运行界面中,标注自己hero vehicle的包围盒,并manual control,W前,A左转,D右转,S刹车&倒车,空格手刹/制动。
该脚本在主函数中创建BasicSynchronousClient类的实例,并调用该实例的game_loop()函数。
game_loop()是主循环程序,负责 (1) 创建carla的一个客户端实例carla.Client('127.0.0.1', 2000),然后通过该客户端访问虚拟世界client.gt_world()。
(2) 然后调用BasicSynchronousClient类的setup_car()函数,负责:先访问虚拟世界的所有vehicle类型的第一个模型设计蓝图car_bp = world.get_blueprint_library().filter('vehicle.*'),并随机生成虚拟世界地图中一个空白地点location = random.choice(self.world.get_map().get_spawn_points())来作为车辆演员的起始地点,然后生成这个车辆演员car = world.spawn_actor(car_bp, location)。
(3) 因为要观察自己车辆的包围盒,所以要创建一个第三方视角,即一个观测的相机演员。所以调用BasicSynchronousClient类的setup_camera()函数,负责:(3.1)先确定相机相对于这个车辆演员的位置和姿态角camera_transform = carla.Transform(carla.Location(x=-5.5, z=2.8), carla.Rotation(pitch=-15));(3.2)然后调用BasicSynchronousClient类的camera_blueprint()函数,找到RGB相机的设计蓝图camera_bp = world.get_blueprint_library().find('sensor.camera.rgb'),并将pygame界面的宽VIEW_WIDTH、高VIEW_HEIGHT、视场角VIEW_FOV 作为相机像素平面的宽高视场角;(3.3)结合相机模型的设计蓝图camera_bp和这个相对位姿camera_transform ,生成一个相机演员camera = world.spawn_actor(camera_bp, camera_transform, attach_to=car),其中attach_to属性表示相机跟随这个车辆演员运动而运动,相机演员的父节点是这个车辆演员;(3.4)相机接收自己的图像camera.listen(lambda image:weak_self().set_image(weak_self, image)),即如果capture=true,就将采集到的img赋值给BasicSynchronousClient类实例的self.image;(3.5)根据(3.2)中相机的像素平面参数来生成自己的内参矩阵calibration,用于3D BBX到成像平面的投影。
(4) 调用pygame模块,创建显示窗口。
(5) carla默认世界和客户端的时间戳是异步的,而采集RGB等信息并回传至客户端显示,就要保证二者之间是同步的,否则会造成数据丢失。所以调用BasicSynchronousClient类的set_synchronous_mode()函数,负责修改虚拟世界的同步模式world.get_settings().synchronous_mode = true。
(6) 进入控制--渲染循环 while true:(6.1) 调用BasicSynchronousClient类的render(){如果self.image非空,就调用pygame.display进行图像渲染};(6.2)调用ClientSideBoundingBoxes类的get_bounding_boxes()函数{ 返回所有车辆演员的、在相机可见范围内的 Bounding Boxes};(6.3)调用ClientSideBoundingBoxes类的draw_bounding_boxes()函数{将获取的有效bbx投影显示到相机成像平面上};(6.4)调用BasicSynchronousClient类的control(car){获取对car演员的控制权control = car.get_control(),根据用户的键盘按键pygame.key.get_pressed(),如果等于K_w或K_s或K_a或K_d或K_SPACE,就分别制定control动作control.throttle\reverse\steer\hand_brake,然后应用到car演员上car.apply_control(control),返回false;如果按键是K_ESCAPE,就返回true};(6.5)根据control()的返回值,如果按esc键,就停止while循环。
(7)最后,一定要销毁创建的车辆和相机演员.destroy(),否则会存在在世界中使其他程序报错;并恢复carla的异步模式;关闭pygame窗口。
我修改分辨率为1920*1080,否则输出是有问题的(如下图)。
正确显示界面应该如下图,应该包含RGB采集的环境图像和行人演员的骨骼模型,要不然就不用设置tick()进行多传感器输出数据的同步处理了。
在键盘ctrl+c停止运行之前,调用main():
(1)创建pygame窗口,传参宽高视场角。
(2)创建client,访问world。
(3)生成RGB相机演员camera,设置属性宽高视场角。
(4)生成行人演员
首先 world.set_pedestrain_seed(1235)。
随机获取一个行人模型的蓝图ped_bp = random.choice(world.get_blueprint_library().filter("walker.pedestrain.*")),获取一个随机地点trans = carla.Transform.location = world.get_random_location_from_navigation()为起点,生成行人演员ped = world.spawn_actor(ped_bp, trans)。
注意,行人是carla自动控制的,即获取一个行人控制器蓝图walker_controller_bp= world.get_blueprint_library().find('controller.ai.walker')并生成该蓝图的行人控制器演员controller = world.spawn_actor(walker_controller_bp, carla.Transform(), ped),注意要连接控制的行人演员,并设置相对位姿为单位阵。并启动控制器演员controller.start(),生成随机地