ROS Bridge 笔记(02)— carla_ros_bridge 功能包(准备 ROS环境、运行 ROS Bridge、配置 CARLA 参数、同步模式下使用 ROS Bridge、主车辆控制)

官网: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 出去。

1. 准备 ROS 环境

运行的命令取决于你是通过 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

2. 运行 ROS Bridge

一旦您设置了您的 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

3. 配置 CARLA 参数

配置应该在 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:等待与服务器成功连接的时间;

  • passivepassive 模式用于同步模式。当启用时, ROS Bridge 接将处于次要地位,必须有另一个客户端与世界联系。 ROS Bridge 将等待所有传感器接收所有预期数据;

  • town:既可以使用 CARLA 地图 (eg. ‘town01’) 或者 OpenDRIVE 格式地图文件 (ending in .xodr);

  • ego_vehicle_role_name:用于识别主车辆的角色名称,相关的主题将被创建,以便这些车辆能够被 ROS 控制;

  • register_all_sensors

    1. false: 只注册 Bridge 产生的传感器
    2. true (default):仿真中所有的传感器都会被注册
  • synchronous_mode

    1. 如果为 false :数据发布在每个 world.on_tick() 和每个 sensor.listen() 回调上;
    2. 如果为 true (默认):ROS Bridge 等待下一个 tick 之前所有的传感器消息。这可能会降低整个模拟的速度,但可以确保结果的可重复性;
  • synchronous_mode_wait_for_vehicle_control_command :在同步模式下,暂停 tick,直到完成车辆控制;

  • fixed_delta_seconds :仿真步骤之间的仿真时间(增量秒)。它必须小于0.1。请查看文档 时间细节 以了解更多相关信息;

    这个参数决定了仿真时间的前进步长,即每两帧之间的仿真时间差,这里需要首先理解仿真时间与真实时间,它们是并行的两条时间线,仿真有自己的独立时间线,它一定程度上与真实时间无关,仿真器永远是一个帧接一个帧去计算,那么两帧之间的仿真时间差决定了仿真器在仿真时间内的运行频率,而仿真器在真实时间中的运行频率则由两帧计算所需要的真实时间决定,这个跟你机器配置、仿真器效果设置都有关系。
    举例说明,假如设置了 fixed_delta_seconds=0.05,会可能发生如下情况:
    ROS Bridge 笔记(02)— carla_ros_bridge 功能包(准备 ROS环境、运行 ROS Bridge、配置 CARLA 参数、同步模式下使用 ROS Bridge、主车辆控制)_第1张图片
    由于每一帧的处理与计算机配置、当前帧需要的计算量都有关系,因此处理该帧所需要的真实时间是有波动的,这也导致仿真时间与真实时间无法对齐。

    这个参数之所以很重要,是因为它会跟你设置的传感器频率关联,如果不能理解这个参数,后续传感器频率的配置以及传感器同步都会出问题。

4. 同步模式下使用 ROS Bridge

默认情况下,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 信息;
  • 使用 Control rqt 插件。这个插件启动一个带有简单界面的新窗口。然后,它用于管理步骤并在 /carla/control 主题中发布。在同步模式下,使用 CARLA 执行如下命令:
rqt --standalone rqt_carla_control

5. 主车辆控制

有两种模式来控制主车辆:

  • 普通模式:从 /carla//vehicle_control_cmd 读取命令

  • 手动模式:从 /carla//vehicle_control_cmd_manual 读取命令。这允许手动重写由软件栈发布的车辆控制命令。

你可以通过发布到 /carla//vehicle_control_manual_override 来切换这两种模式。有关使用此功能的示例,请参阅 Carla Manual Control 。

从命令行测试转向

  1. 使用主车辆启动 ROS Bridge
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
  1. 另外一个终端发布主题到 /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//vehicle_status 获取到。车辆的静态信息可以通过/carla//vehicle_info 查看到。

可以使用 AckermannDrive 信息来控制主车辆。这可以通过使用 CARLA Ackermann Control 来实现。

6. ROS API

6.1 Subscriptions

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 时,要注意标记可能会影响传感器发布的数据。支持的标记包括:箭头(由两个点指定)、点、立方体和线条。

6.2 Publications

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.

6.3 Services

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

你可能感兴趣的:(#,ROS,Bridge,自动驾驶,ROS,bridge)