迁移参数
在 ROS 1 中,参数与一个中央服务器关联,允许在运行时通过网络 API 检索参数。 在 ROS 2 中,参数与每个节点关联,并可在运行时通过 ROS 服务进行配置。
-
有关系统模型的更多细节,请参阅 ROS 2 参数设计文档。
-
有关 CLI 工具的工作原理及其与 ROS 1 工具的差异,请参阅 ROS 2 CLI 用法。
全局参数服务器
Section titled “全局参数服务器”在 ROS 1 中,roscore 充当全局参数黑板,所有节点都可以在其中获取和设置参数。
由于 ROS 2 中没有中央 roscore,该功能不再存在。
ROS 2 中推荐的做法是使用与使用它们的节点紧密关联的每节点参数。
如果仍然需要全局黑板,可以为此目的创建一个专用节点。
ROS 2 在 ros-{DISTRO}-demo-nodes-cpp 软件包中附带了一个名为 parameter_blackboard 的节点;可以通过以下命令运行:
ros2 run demo_nodes_cpp parameter_blackboardparameter_blackboard 的代码在这里。
迁移 YAML 参数文件
Section titled “迁移 YAML 参数文件”本指南描述了如何为 ROS 2 改编 ROS 1 参数文件,并说明了从节点级别访问参数方式的差异。
YAML 文件示例
Section titled “YAML 文件示例”ROS 1 和 ROS 2 都使用 YAML 来编写参数文件。
ROS 2 的主要区别在于必须使用节点名称来寻址参数。
除了完全限定的节点名称外,我们使用键 ros__parameters 来标记节点参数的开始。
例如,以下是 ROS 1 中的一个参数文件:
lidar_name: foolidar_id: 10ports: [11312, 11311, 21311]debug: true假设前两个参数用于名为 /lidar_ns/lidar_node_name 的节点,下一个参数用于名为 /imu 的节点,最后一个参数我们想在两个节点上都设置。
我们将构建如下的 ROS 2 参数文件:
/lidar_ns: lidar_node_name: ros__parameters: lidar_name: foo id: 10imu: ros__parameters: ports: [2438, 2439, 2440]/**: ros__parameters: debug: true注意使用通配符 (/**) 来指示参数 debug 应该设置在任何命名空间中的任何节点上。
在节点内访问参数
Section titled “在节点内访问参数”假设我们想在 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替换
参数原子操作
Section titled “参数原子操作”将参数组从 ROS 1 迁移到 ROS 2 时,有一些重要的差异需要考虑。
在 ROS 1 中,dynamic_reconfigure 以原子方式处理参数组,这意味着重配置请求中的所有参数在单个回调中一起处理。
在 ROS 2 中,set_parameters 服务逐个处理每个参数,这可能导致多次回调调用。
要从 dynamic_reconfigure 迁移时保持原子行为,请使用 set_parameters_atomically 服务,该服务验证并应用所有参数作为单个操作。
如果任何参数验证失败,则不会更新任何参数。