Carla Simulator自动驾驶模拟器 使用教程

前言:我想验证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. 编写自己的脚本


1.CARLA 简介

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调用。

2. 安装Carla客户端

 具体安装过程:

手把手教你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。

3. 基础API的使用

一共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是官方提供的辅助入门脚本,有详细注释。

3.1 client_bounding_boxes.py

运行界面中,标注自己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窗口。

3.2 draw_skeleton.py 

我修改分辨率为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(),生成随机地

你可能感兴趣的:(自动驾驶,人工智能,机器学习)