“ 经常有朋友问如何学习仿真测试,于是想着把自己的一些经验和理解分享出来,希望能有所帮助。不过视野和技术有限,所说不一定对,供大家批评和参考。这是第23篇,CARLA的ROS交互接口。”
上一篇介绍了如何在CARLA中运行OpenSCENARIO 1.0和2.0格式的文件,本篇是CARLA系列的最后一篇,说明如何使用carla-ros-bridge。
ros_bridge是CARLA与ROS/ROS2之间的交互接口,实现了CARLA和ROS/ROS2双向通信,便于将基于ROS/ROS2的算法与CARLA连接,实现完整的测试闭环,本篇以ROS2 Foxy为例进行说明。
carla-ros-bridge的安装
(1)建立文件夹并下载代码
cd ~/carla-ros-bridge mkdir -p ~/carla-ros-bridge &&
clone --recurse-submodules https://github.com/carla-simulator/ros-bridge.git src/ros-bridge git
(2)安装ROS依赖
source /opt/ros/foxy/setup.bash
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -r
“sudo rosdep init”时可能包含如下内容的报错“ERROR: cannot download default sources list”,这时先通过“ping raw.githubusercontent.com”查看网站是否可以ping通,若可以ping通的话,则可以尝试按照下述操作在hosts文件中添加相关内容:
打开hosts文件
sudo gedit /etc/hosts
添加如下内容
199.232.28.133 raw.githubusercontent.com
151.101.228.133 raw.github.com
“rosdep install”时可能提示无法安装derived-object-msgs和ackermann-msgs,这时可以通过如下命令手动安装:
$ sudo apt install ros-foxy-derived-object-msgs
$ sudo apt install ros-foxy-ackermann-msgs
(3)编译
在终端运行“colcon build”进行编译。
(4)设置环境变量
为了在运行时能够找到相关的文件,需要设置一些环境变量。打开~/.bashrc文件,并在其结尾加入如下内容:
export SCENARIO_RUNNER_PATH=$SCENARIO_RUNNER_ROOT
(5)试运行
按照如下操作,启动CARLA和carla-ros-bridge样例。
启动CARLA
cd /path/to/carla
./CarlaUE4.sh
打开一个新的终端
cd /path/to/carla-ros-bridge
source ./install/setup.bash
ros2 launch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch.py
此时会在CARLA世界生成ego车,并弹出一个pygame窗口进行ego的的控制,这说明ros-bridge安装成功。
如果使用的是CARLA 0.9.14的话,会有一个报错“[FATAL] [carla_ros_bridge]: CARLA python module version 0.9.13 required. Found: 0.9.14”,这是因为当前的ros-bridge还是匹配的CARLA 0.9.13,读者可将ros-bridge文件夹下的CARLA_VERSION文件的内容更改为0.9.14,并重新编译即可。
carla-ros-bridge的组成
ros-bridge由多个模块组成,各自发挥不同的作用,具体如下表所示。
carla_ad_demo运行实例
下面通过运行carla_ad_demo,并分析启动的各节点的相互关系,介绍ros-bridge的使用方法和效果。
按照如下操作,启动CARLA和carla_ad_demo样例。
启动CARLA
cd /path/to/carla
./CarlaUE4.sh
打开一个新的终端
cd /path/to/carla-ros-bridge
source ./install/setup.bash
ros2 launch carla_ad_demo carla_ad_demo_with_scenario.launch.py
之后会弹出下图所示的RVIZ2窗口,其右侧为各种传感器的可视化,中部是仿真全景,左下角是rviz_carla_plugin,可以查看Ego车的状态并对仿真进行控制。
此时仿真并没有运行,在左下角的“Scenario Execution”位置可以看到将要运行的场景是“FollowLeadingVehicle.xosc”,读者可以通过修改carla_ad_demo/launch/carla_ad_demo_with_scenario.launch.py中“ros_topic_msg_string”中的相关内容,来改变场景文件。
点击“Execute”按钮后,仿真开始运行。按照FollowLeadingVehicle.xosc中的场景设计,生成慢速的前车,由carla_ad_agent控制ego车跟随前车行驶(由于carla_ad_agent中的逻辑极为简单,跟随过程稍显笨拙)。
打开一个新的终端,输入如下命令,打开rqt_graph窗口,其中可显示目前启动的ROS2节点及其消息交互:
cd /path/to/carla-ros-bridge
source ./install/setup.bash
rqt_grqph
主要的消息如下表所示:
对其逻辑简述如下:
carla_ad_demo_with_scenario.launch.py中启动了carla_ros_bridge作为CARLA和ROS2环境间的主要通信接口,从CARLA获取并发布ego车、障碍车、红绿灯相关信息,从ROS2接收对ego车的控制命令并转发给CARLA。
carla_ad_agent中的ad_agent接收ego车目标车速以及ego车、障碍车、红绿灯相关信息,进行简单的逻辑处理后发布ego车的车速控制目标。其逻辑是,若前方一定距离(默认为12m)内有障碍车或者红绿灯则将车速控制目标设置为0,否则设置为其接收到的目标车速。
carla_ad_agent中的local_planner接收目标路径点和车速控制目标,通过PID控制器实现对路径点和车速的跟踪,计算得到对ego车的控制命令并发布。
carla_ros_scenario_runner加载并运行指定的场景文件FollowLeadingVehicle.xosc。如下述xosc文件片段,该文件中为ego车配置了名为“EgoVehicleAgent”的自定义控制器,其实就是carla_ros_scenario_runner下的ros_vehicle_control,该模块可以在场景运行时将xosc中定义的ego车的路径点和目标车速发布出来。