Skip to content

迁移参数

在 ROS 1 中,参数与一个中央服务器关联,允许在运行时通过网络 API 检索参数。 在 ROS 2 中,参数与每个节点关联,并可在运行时通过 ROS 服务进行配置。

在 ROS 1 中,roscore 充当全局参数黑板,所有节点都可以在其中获取和设置参数。 由于 ROS 2 中没有中央 roscore,该功能不再存在。 ROS 2 中推荐的做法是使用与使用它们的节点紧密关联的每节点参数。 如果仍然需要全局黑板,可以为此目的创建一个专用节点。 ROS 2 在 ros-{DISTRO}-demo-nodes-cpp 软件包中附带了一个名为 parameter_blackboard 的节点;可以通过以下命令运行:

Terminal window
ros2 run demo_nodes_cpp parameter_blackboard

parameter_blackboard 的代码在这里。

本指南描述了如何为 ROS 2 改编 ROS 1 参数文件,并说明了从节点级别访问参数方式的差异。

ROS 1 和 ROS 2 都使用 YAML 来编写参数文件。 ROS 2 的主要区别在于必须使用节点名称来寻址参数。 除了完全限定的节点名称外,我们使用键 ros__parameters 来标记节点参数的开始。

例如,以下是 ROS 1 中的一个参数文件:

lidar_name: foo
lidar_id: 10
ports: [11312, 11311, 21311]
debug: true

假设前两个参数用于名为 /lidar_ns/lidar_node_name 的节点,下一个参数用于名为 /imu 的节点,最后一个参数我们想在两个节点上都设置。

我们将构建如下的 ROS 2 参数文件:

/lidar_ns:
lidar_node_name:
ros__parameters:
lidar_name: foo
id: 10
imu:
ros__parameters:
ports: [2438, 2439, 2440]
/**:
ros__parameters:
debug: true

注意使用通配符 (/**) 来指示参数 debug 应该设置在任何命名空间中的任何节点上。

假设我们想在 C++/Python 节点内使用 lidar_name 参数。 在 ROS 1 中,我们使用斜杠来分隔节点名称和命名空间 —— "lidar_ns/lidar_node_name/lidar_name"。 在 ROS 2 中,我们使用点号代替斜杠 —— "lidar_ns.lidar_node_name.lidar_name"。

ROS 1 参数文件的某些功能在 ROS 2 中不存在:

  • 列表中的混合类型尚不支持(相关问题)
  • 不支持 deg 和 rad 替换

将参数组从 ROS 1 迁移到 ROS 2 时,有一些重要的差异需要考虑。 在 ROS 1 中,dynamic_reconfigure 以原子方式处理参数组,这意味着重配置请求中的所有参数在单个回调中一起处理。 在 ROS 2 中,set_parameters 服务逐个处理每个参数,这可能导致多次回调调用。 要从 dynamic_reconfigure 迁移时保持原子行为,请使用 set_parameters_atomically 服务,该服务验证并应用所有参数作为单个操作。 如果任何参数验证失败,则不会更新任何参数。