ROS 参数与配置:把"配置项"从代码里外置(六)
通用基础优先 · 第六篇|ROS 通识系列|Docker 实战
一图读懂本文:参数本质 → ROS1/ROS2 架构差异 → 命令行四件套 → 代码声明与监听 → yaml 复现。
采集频率、相机标定系数、是否用仿真时间……这些"配置项"如果写死在代码里,每改一次都要重编译。ROS 的 Parameter 机制就是把这些值外置,运行时可查可改。这一篇讲清 ROS 1 与 ROS 2 的参数差异,以及怎么在代码里用。
一、参数到底是什么
参数是节点的键值对配置(字符串/整数/浮点/布尔/数组/字典)。它和 Topic 的区别:Topic 传的是流数据,参数是静态/慢变配置。
二、ROS 1 vs ROS 2:架构上的关键差异
| ROS 1 | ROS 2 | |
|---|---|---|
| 存储 | 全局 Parameter Server(中心化,挂了全完) | 每个节点自带参数服务(去中心化) |
| 动态调参 | dynamic_reconfigure(额外机制) | 参数本身即可运行时 set |
| 类型 | 弱类型(yaml 字符串) | 强类型(声明类型,set 时校验) |
三、命令行操作(Docker 实战)
# 列出某节点的参数 ros2 param list /my_noderos2 param get /my_node publish_rate
ros2 param set /my_node publish_rate 20
ros2 param dump /my_node > my_node.params.yaml
ros2 run demo_nodes_cpp talker --ros-args --params-file my.yaml。同一场景的"频率 + 话题清单 + 标定"放一个 yaml、进 git——换人、换机、重跑实验,配置零漂移。这是多场景采集平台的基本功。四、在 Python 节点里声明与使用参数
import rclpy from rclpy.node import Nodeclass Cam(Node):
definit(self):
super().init(‘cam_node’)
self.declare_parameter(‘publish_rate’, 10.0)
self.declare_parameter(‘use_sim_time’, False)
rate = self.get_parameter(‘publish_rate’).value
self.get_logger().info(f’采集频率 = {rate} Hz’)
self.add_on_set_parameters_callback(self._on_param)
def _on_param(self, params): for p in params: if p.name == 'publish_rate': self.get_logger().info(f'频率改为 {p.value}') return rclpy.parameter.SetParametersResult(successful=True)rclpy.init(); rclpy.spin(Cam()); rclpy.shutdown()
五、接回数采平台
- 采集频率、录制话题清单、标定内外参都该做成参数,而不是硬编码;
- 用
param dump把一套"某场景采集配置"存成 yaml,可版本化、可一键复现——这对多场景、多本体采集非常关键; - KUAVO(ROS 1)的 dynamic_reconfigure 与 ROS 2 参数语义不同,adapter 层要做映射。
六、小结与下篇
- 参数 = 节点的键值配置,区别于传流数据的 Topic;
- ROS 2 参数去中心化、强类型,比 ROS 1 的全局 Parameter Server 更稳;
- 命令行
list/get/set/dump是日常四件套; - 代码里
declare_parameter+ 回调可响应运行时变更; - 下一篇:坐标系与变换 TF/TF2——相机、末端、基坐标之间"谁在哪儿"怎么表达。