本专栏教程将记录从安装carla到调用carla的pythonAPI进行车辆操控并采集数据的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制.
第六节 基于carla-ros-bridge构建一个小型比赛赛道
本节的主要内容是介绍一个小项目,项目内容为使用carla构建一个赛道以供参赛者使用.要求使用一个脚本就可以很方便的构建出这个赛道,赛道包括一个固定的起点和终点,中间具有几个固定的障碍物,参赛的车辆都是同一款车型,仿真环境中的天气光照等都保持一致.
-
章节内容介绍:
本节共分为5个小节.
第1小节介绍了仿真环境中包含的要素:地图,车辆,障碍物,起点和终点.
第2小节介绍了小车的传感器接口,包括相机,激光雷达,GNSS,IMU等.
第3小节介绍了小车的控制接口.
第4小节介绍了比赛成绩评判.
第5小节对整个比赛需要参赛队员执行的代码进行了汇总. -
接口查阅链接:
CARLA Python API在线网站 -
配套代码:
gitte代码库 -
适配版本
本教程主要适用于采用apt方式安装的 carla
1.比赛仿真环境要素
1.1 地图
地图的修改只需要在运行launch文件时增加 town:="town07"
的参数即可.
- 如果想要永久修改默认参数,参考以下方法:
在下面的carla_ros_bridge.launch
文件中找到10行, 把’town’的default值改为Town07
.
sudo gedit /opt/carla-ros-bridge/melodic/share/carla_ros_bridge/launch/carla_ros_bridge.launch
然后保存即可.
1.2 车辆
1.2.1 定制化修改- 通过在启动命令时引入参数:
我们在官方的 carla_example_ego_vehicle.launch
后面附上生成点spawn_point
,车辆滤波器vehicle_filter
,就可以轻松实现定制车辆的功能了.
roslaunch carla_ego_vehicle carla_example_ego_vehicle.launch spawn_point:="68.219688,-37.028912,0.5,2.649131,4.661454,104.526855" role_name:="ego_vehicle" vehicle_filter:="vehicle.audi.a2"
当然,我们也可以一步到位,直接在carla_ros_bridge_with_example_ego_vehicle.launch
中附带参数:
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch spawn_point:="68.219688,-37.028912,0.5,2.649131,4.661454,104.526855" role_name:="ego_vehicle" vehicle_filter:="vehicle.audi.a2" town:="town07"
为了方便展示,用文字描述一下上述代码:
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch spawn_point:=“68.219688,-37.028912,0.5,2.649131,4.661454,104.526855”
town:=“town07”
ego_vehicle_role_name:=“ego_vehicle”
vehicle_filter:=“vehicle.audi.a2”
运行上述脚本进行车辆遥控的内容可以参考[carla入门教程]-5 使用ROS与carla通信的3.2节.
然后我们再配合使用rviz就可以查看传感器数据:
rosrun rviz rviz -d carla_tutorial/rviz_carla_sensor.rviz
这里有一个小bug,车辆出生后没有拉手刹,然后会溜车.需要手动按B
然后按空格
拉手刹.
如果想要修改默认参数,参考1.2.2和1.2.3.
1.2.2 官方生成脚本分析
自带的车辆生成demo的launch文件如下
sudo gedit /opt/carla-ros-bridge/melodic/share/carla_ego_vehicle/launch/carla_example_ego_vehicle.launch
这个文件实际上是调用另一个launch文件:
/opt/carla-ros-bridge/melodic/share/carla_ego_vehicle/launch/carla_ego_vehicle.launch
carla_ego_vehicle.launch
实现对车辆的生成,传递的参数包括:
<arg name='host' default='localhost'/>
<arg name='port' default='2000'/>
<arg name='timeout' default='10'/>
<arg name="vehicle_filter" default="vehicle.*" />
<arg name="sensor_definition_file" default="$(find carla_ego_vehicle)/config/sensors.json"/>
<arg name="role_name" default="ego_vehicle"/>
<!-- use comma separated format "x,y,z,roll,pitch,yaw" -->
<arg name="spawn_point" default=""/>
<arg name="spawn_ego_vehicle" default="True" />
1.2.3 定制化修改- 通过配置文件
- 车的类型
通过修改carla_ego_vehicle.launch
中的vehicle_filter
,我们将车辆类型改为vehicle.audi.a2
,也就是奥迪A2.
- 出生点
我们首先利用修改后的脚本生成一台车,此时由于默认是不指定出生点的,所以程序会从地图里面随机选取一个出生点,这个出生点不是我们想要的,但是没关系,我们可以手动把车辆遥控到指定的出生点.
调用官方提供的脚本呼出车辆控制界面,然后遥控到出生点:
roslaunch carla_manual_control carla_manual_control.launch
位于Town07的这个位置:
从控制界面中读取位置信息:
转换成(x,y,z,pitch,roll,yaw)的格式填入spawn_point
参数即可,如下:
<arg name="spawn_point" default='70.3,4.8,2.0,0.0,0.0,69.0'/>
特别需要注意的是:
spawn_point中的参数分别是(x,y,z,roll,pich,-raw)
.请注意这里的偏航角度raw前面有一个负号.
spawn_point中三个旋转角与carla.Rotation 的顺序并不相同,carla.Rotation的顺序为:(pitch,yaw,roll)
1.3 障碍物
1.3.1 障碍物的创建方法
在路线上添加多个不会移动的车辆作为静态障碍物.这里为了便于快速创建车辆,写了一个python脚本.carla_tutorial/generate_car.py
.
[carla入门教程]-3 在carla中遥控汽车并采集传感器数据中介绍了如何使用pythonAPI生成车辆,这里主要需要解决的是如何确定障碍物的生成位姿.
这里我们也是采取手动标记的方法,通过carla_manual_control.launch
控制小车到我们需要的点,采集小车的位置.为了准确获得小车位置,我们写了一个小脚本carla_tutorial/get_location.py
打印输出小车当前的位姿.然后把障碍物的位姿统计到carla_tutorial/障碍物坐标.txt
文档中.
注意!!
在设置spawn_point时,一定要设置好z坐标
,因为carla中的地图贴图存在地下结构
,所以如果z设置的比我们预期的值小,会出现车生成在地底下
的情况.为了避免这种情况,我们设置z坐标
时可以比原定数值大0.5m
.
1.3.2 障碍物的分布介绍
创建的障碍物一共有5处,其中有2处放置在路口处,是为了隔断道路.另外3处放置在道路上,是为了考验避障能力.
第一处:隔断路口
第二处:隔断路口
第三处:考验避障
第四处:考验避障
第五处:考验避障
1.4 起点和终点
起点都用Town07地图的全局坐标表示.
起点坐标:(68.810539, -34.828873, 1.834847)
终点坐标:(-197.405151, y=-169.926147, z=-0.007765)
2.传感器接口
本小节主要介绍汽车上传感器的参数,对应的 ros消息名称.
所有传感器的参数,例如相机内参,雷达内参都位于以下文件中:
/opt/carla-ros-bridge/melodic/share/carla_ego_vehicle/config/sensors.json
如果觉得某个参数不合适,可以自行调整.
2.1 RGB相机:
一共有两个,一个是前视相机,一个是第三人称相机.
-
第三人称相机
Ros_topic:/carla/ego_vehicle/camera/rgb/view/image_color
Type: sensor_msgs/Image -
前视相机,
Ros_topic:/carla/ego_vehicle/camera/rgb/front/image_color
Type: sensor_msgs/Image
2.2 激光雷达
- 单线激光雷达
Ros_topic:/carla/ego_vehicle/lidar/lidar1/point_cloud
Type: sensor_msgs/PointCloud2
激光雷达可以改成多线的,如果需要请自行修改雷达配置文件中的channels
.
2.3 GNSS
- 全球定位导航
Ros_topic:/carla/ego_vehiclgnss/gnss1/fix
Type: sensor_msgs/NavSatFix
2.4 IMU
- 加速度计
Ros_topic:/carla/ego_vehicle/imu/imu1
Type: sensor_msgs/Imu
2.5 里程计
- localpose坐标
Ros_topic:/carla/ego_vehicle/odometry
Type: nav_msgs/Odometry
2.6 车道线交叉检测器
- carla中的虚拟传感器,当车辆穿越车道线时,会发出车道线类型的消息.
Ros_topic:/carla/ego_vehicle/lane_invasion
Type: carla_msgs/CarlaLaneInvasionEvent
2.7 碰撞检测器
- carla中的虚拟传感器,碰撞检测器.当发生碰撞时,会发出信号,显示出碰撞的目标.
Ros_topic:/carla/ego_vehicle/collision
Type: carla_msgs/CarlaCollisionEvent
3. 控制接口
- 控制油门,刹车,档位.
Ros_topic:/carla/ego_vehicle/vehicle_control_cmd
Type: carla_msgs/CarlaEgoVehicleControl
4. 比赛成绩评判
- 比赛限时
20min. - 打分标准
是否完赛,通过时间,碰撞次数,车道线跟踪精度等等.
5.比赛执行代码(参赛队员使用)
(1)打开carla服务器
./CarlaUE4.sh
(2)加载官方demo
按照设定参数加载carla_ros_bridge_with_example_ego_vehicle.launch
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch spawn_point:="68.219688,-37.028912,0.5,2.649131,4.661454,104.526855" role_name:="ego_vehicle" vehicle_filter:="vehicle.audi.a2" town:="town07"
(3)加载rviz
cd carla_tutorial
rosrun rviz rviz -d rviz_carla_sensor.rviz
(4)加载汽车障碍物
conda activate py27 # 切换到python2.7环境
python generate_car.py
(5)开始比赛
自行编写脚本,订阅传感器的ros消息,控制车运动,让车能够到达终点.