官网:https://carla.readthedocs.io/projects/ros-bridge/en/latest/run_ros/
carla_ros_bridge
功能包是运行基本 ROS
桥接功能所需的主要功能包。在本节中,你将学习如何准备 ROS
环境,运行 ROS
桥,如何配置设置,同步模式的使用,控制车辆,以及对可用的订阅、发布和服务的总结。
这个包封装了操作 Carla
服务端的 API
,使用户不用关心 Server
层的东西,直接通过其提供的几个ROS service
创建车辆、传感器、路灯等等各种 objects
,并对其进行了管理,同时将各类传感器数据从 Carla
格式转化为 ROS
消息 publish
出去。
运行的命令取决于你是通过 Debian 软件包还是通过源代码构建来安装 ROS Bridge
。你还需要改变Debian 选项的路径中的 ROS
版本。
# For debian installation of ROS bridge. Change the command according to your installed version of ROS.
source /opt/carla-ros-bridge/<melodic/noetic>/setup.bash
# For GitHub repository installation of ROS bridge
source ~/carla-ros-bridge/catkin_ws/devel/setup.bash
一旦您设置了您的 ROS
环境并运行了 CARLA
服务器,您需要在使用其他软件包之前启动carla_ros_bridge
软件包。要做到这一点,请运行以下命令。
roslaunch carla_ros_bridge carla_ros_bridge.launch
还有一些启动文件结合了上述功能,在启动其他软件包或插件的同时启动 ROS Bridge
。
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
配置应该在 launch
启动文件中设置,或者在从命令行运行文件时作为一个参数传递,例如。
roslaunch carla_ros_bridge carla_ros_bridge.launch passive:=True
carla_ros_bridge.launch
文件内容如下:
<launch>
<param name="use_sim_time" value="True"/>
<arg name='host' default='localhost'/>
<arg name='port' default='2000'/>
<arg name='timeout' default='2'/>
<arg name="passive" default='False'/>
<arg name='synchronous_mode' default='True'/>
<arg name='synchronous_mode_wait_for_vehicle_control_command' default='False'/>
<arg name='fixed_delta_seconds' default='0.05'/>
<arg name='town' default='Town01'/>
<arg name='register_all_sensors' default='True'/>
<arg name='ego_vehicle_role_name' default='["hero", "ego_vehicle", "hero0", "hero1", "hero2", "hero3", "hero4", "hero5", "hero6", "hero7", "hero8", "hero9"]'/>
<node pkg="carla_ros_bridge" name="carla_ros_bridge" type="bridge.py" output="screen" required="true">
<param name="host" value="$(arg host)" unless="$(eval host == '')"/>
<param name="port" value="$(arg port)" unless="$(eval port == '')"/>
<param name="timeout" value="$(arg timeout)" unless="$(eval timeout == '')"/>
<param name="passive" value="$(arg passive)"/>
<param name="synchronous_mode" value="$(arg synchronous_mode)"/>
<param name="synchronous_mode_wait_for_vehicle_control_command" value="$(arg synchronous_mode_wait_for_vehicle_control_command)"/>
<param name="fixed_delta_seconds" value="$(arg fixed_delta_seconds)"/>
<param name="register_all_sensors" value="$(arg register_all_sensors)"/>
<param name="town" value="$(arg town)"/>
<param name="ego_vehicle_role_name" value="$(arg ego_vehicle_role_name)"/>
node>
launch>
其中各个参数含义如下:
use_sim_time
:这应该被设置为 True
,以确保 ROS
使用的是 CARLA
仿真时间而不是系统时间。这个参数将使 ROS
的 /clock
topic 与 CARLA
的仿真时间同步;
host and port
: 使用 Python
客户端连接到 CARLA
的网络设置;
timeout
:等待与服务器成功连接的时间;
passive
:passive
模式用于同步模式。当启用时, ROS Bridge
接将处于次要地位,必须有另一个客户端与世界联系。 ROS Bridge
将等待所有传感器接收所有预期数据;
town
:既可以使用 CARLA
地图 (eg. ‘town01’) 或者 OpenDRIVE 格式地图文件 (ending in .xodr);
ego_vehicle_role_name
:用于识别主车辆的角色名称,相关的主题将被创建,以便这些车辆能够被 ROS
控制;
register_all_sensors
:
false
: 只注册 Bridge
产生的传感器true
(default):仿真中所有的传感器都会被注册synchronous_mode
:
false
:数据发布在每个 world.on_tick()
和每个 sensor.listen()
回调上;true
(默认):ROS Bridge
等待下一个 tick
之前所有的传感器消息。这可能会降低整个模拟的速度,但可以确保结果的可重复性;synchronous_mode_wait_for_vehicle_control_command
:在同步模式下,暂停 tick
,直到完成车辆控制;
fixed_delta_seconds
:仿真步骤之间的仿真时间(增量秒)。它必须小于0.1。请查看文档 时间细节 以了解更多相关信息;
这个参数决定了仿真时间的前进步长,即每两帧之间的仿真时间差,这里需要首先理解仿真时间与真实时间,它们是并行的两条时间线,仿真有自己的独立时间线,它一定程度上与真实时间无关,仿真器永远是一个帧接一个帧去计算,那么两帧之间的仿真时间差决定了仿真器在仿真时间内的运行频率,而仿真器在真实时间中的运行频率则由两帧计算所需要的真实时间决定,这个跟你机器配置、仿真器效果设置都有关系。
举例说明,假如设置了 fixed_delta_seconds=0.05,会可能发生如下情况:
由于每一帧的处理与计算机配置、当前帧需要的计算量都有关系,因此处理该帧所需要的真实时间是有波动的,这也导致仿真时间与真实时间无法对齐。
这个参数之所以很重要,是因为它会跟你设置的传感器频率关联,如果不能理解这个参数,后续传感器频率的配置以及传感器同步都会出问题。
默认情况下,ROS Bridge
工作在同步模式。它将等待当前帧内的所有传感器数据,以确保结果的可重复性。
当以同步模式运行多个客户端时,只允许一个客户端连接全世界。除非启用被动模式,否则 ROS Bridge
将是默认情况下唯一允许连接的客户端。在 ros-bridge/carla_ros_bridge/config/settings.yaml
(0.9.11版本以上的应该在 ros-bridge/carla_ros_bridge/launch/carla_ros_bridge.launch
)中启用被动模式, 将使ROS Bridge
退居二线,并允许另一个客户端连接世界。另一个客户必须连接世界,否则 CARLA
将会被僵住。
如果 ROS Bridge
不是被动模式(ROS Bridge
是正在连接世界的一个客户端),那么有两种方式发送步骤控制给服务器:
/carla/control
主题发送 carla_msgs.CarlaControl 信息;/carla/control
主题中发布。在同步模式下,使用 CARLA
执行如下命令:rqt --standalone rqt_carla_control
有两种模式来控制主车辆:
普通模式:从 /carla/
读取命令
手动模式:从 /carla/
读取命令。这允许手动重写由软件栈发布的车辆控制命令。
你可以通过发布到 /carla/
来切换这两种模式。有关使用此功能的示例,请参阅 Carla Manual Control 。
从命令行测试转向
ROS Bridge
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
/carla//vehicle_control_cmd
# Max forward throttle with max steering to the right
# for ros1
rostopic pub /carla/ego_vehicle/vehicle_control_cmd carla_msgs/CarlaEgoVehicleControl "{throttle: 1.0, steer: 1.0}" -r 10
车辆的当前状态可以通过 topic /carla/
获取到。车辆的静态信息可以通过/carla/
查看到。
可以使用 AckermannDrive 信息来控制主车辆。这可以通过使用 CARLA Ackermann Control 来实现。
Topic | Type | Description |
---|---|---|
/carla/debug_marker | visualization_msgs/MarkerArray | Draws markers in the CARLA world. |
/carla/weather_control | carla_msgs/CarlaWeatherParameters | Set the CARLA weather parameters |
/clock | rosgraph_msgs/Clock | Publishes simulated time in ROS. |
注意:
当使用 debug_marker
时,要注意标记可能会影响传感器发布的数据。支持的标记包括:箭头(由两个点指定)、点、立方体和线条。
Topic | Type | Description |
---|---|---|
/carla/status | carla_msgs/CarlaStatus | Read the current status of CARLA |
/carla/world_info | carla_msgs/CarlaWorldInfo | Information about the current CARLA map. |
/clock | rosgraph_msgs/Clock | Publishes simulated time in ROS. |
/rosout | rosgraph_msgs/Log | ROS logging. |
Topic | Type | Description |
---|---|---|
/carla/destroy_object | carla_msgs/DestroyObject.srv | Destroys an object |
/carla/get_blueprints | carla_msgs/GetBlueprints.srv | Gets blueprints |
/carla/spawn_object | carla_msgs/SpawnObject.srv | Spawn an object |