Skip to content

主题命名空间#

概述#

ROS 允许对主题、参数和节点进行命名空间,这提供了以下好处:

  • 同一节点类型的多个实例不会导致命名冲突.
  • 节点发布的主题可以自动使用节点的命名空间进行命名空间,从而提供有意义且易于查看的连接.
  • 防止根命名空间混乱.
  • 有助于保持关注点分离.

本页重点介绍如何在 Autoware 中使用命名空间,并展示一些有用的示例.有关主题命名空间的基本信息,请参阅 本教程.

在 node 中应该如何命名主题#

Autoware 将节点划分为以下功能类别,并根据类别为节点添加 start 命名空间.

-地方化 -知觉 -规划 -控制 -传感 -车辆 -地图 -系统

当节点在命名空间中运行时,该节点发布的所有主题都将获得相同的命名空间.Autoware 堆栈中的所有节点都必须支持命名空间,方法是避免在全局命名空间中发布主题等做法.

通常,主题应根据生成它们的节点的功能而不是使用它们的节点(或多个节点)进行命名空间.

根据节点订阅或发布的主题,将主题分类为输入或输出主题.在节点中,输入主题名为 input/topic_name ,输出主题名为 output/topic_name .

在节点的启动文件中配置主题.以 joy_controller 节点为例,以下示例中设置 joy_controller.launch.xml 文件中的输入输出主题并重新映射主题.

<launch>
  <arg name="input_joy" default="/joy"/>
  <arg name="input_odometry" default="/localization/kinematic_state"/>

  <arg name="output_control_command" default="/external/$(var external_cmd_source)/joy/control_cmd"/>
  <arg name="output_external_control_command" default="/api/external/set/command/$(var external_cmd_source)/control"/>
  <arg name="output_shift" default="/api/external/set/command/$(var external_cmd_source)/shift"/>
  <arg name="output_turn_signal" default="/api/external/set/command/$(var external_cmd_source)/turn_signal"/>
  <arg name="output_heartbeat" default="/api/external/set/command/$(var external_cmd_source)/heartbeat"/>
  <arg name="output_gate_mode" default="/control/gate_mode_cmd"/>
  <arg name="output_vehicle_engage" default="/vehicle/engage"/>

  <node pkg="joy_controller" exec="joy_controller" name="joy_controller" output="screen">
    <remap from="input/joy" to="$(var input_joy)"/>
    <remap from="input/odometry" to="$(var input_odometry)"/>

    <remap from="output/control_command" to="$(var output_control_command)"/>
    <remap from="output/external_control_command" to="$(var output_external_control_command)"/>
    <remap from="output/shift" to="$(var output_shift)"/>
    <remap from="output/turn_signal" to="$(var output_turn_signal)"/>
    <remap from="output/gate_mode" to="$(var output_gate_mode)"/>
    <remap from="output/heartbeat" to="$(var output_heartbeat)"/>
    <remap from="output/vehicle_engage" to="$(var output_vehicle_engage)"/>
  </node>
</launch>

代码中的主题名称#

  1. 具有 ~,以便应用启动配置中的命名空间(不应从根 / 开始).

  2. 在主题名称前有 ~/input ~/output 命名空间,用于与其他节点通信.

例如,在节点 obstacle_avoidance_planner 中,使用 ~/input/topic_name 类型的主题名称订阅主题.

objects_sub_ = create_subscription<PredictedObjects>(
 "~/input/objects", rclcpp::QoS{10},
 std::bind(&ObstacleAvoidancePlanner::onObjects, this, std::placeholders::_1));

例如,在节点 obstacle_avoidance_planner 中,使用 ~/output/topic_name 类型的主题名称来发布主题.

traj_pub_ = create_publisher<Trajectory>("~/output/path", 1);
  1. 可视化或调试目的主题应具有 ~/debug/ 命名空间.

例如,在节点 obstacle_avoidance_planner 中,为了调试或可视化主题,使用 ~/debug/topic_name 类型的主题名称来发布信息.

debug_markers_pub_ =
 create_publisher<visualization_msgs::msg::MarkerArray>("~/debug/marker", durable_qos);

debug_msg_pub_ =
 create_publisher<tier4_debug_msgs::msg::StringStamped>("~/debug/calculation_time", 1);

启动配置的命名空间将之前添加主题,因此主题名称将如下所示:

/planning/scenario_planning/lane_driving/motion_planning/obstacle_avoidance_planner/debug/marker /planning/scenario_planning/lane_driving/motion_planning/obstacle_avoidance_planner/debug/calculation_time

  1. 基本原理:我们希望从启动文件重新映射和配置主题名称.