ROS 参数设置方法总结

最近在研究 ROS 节点(ROS Node)的参数设置方式,由于系统比较复杂,并且会变得更加复杂,因此需要一个统一的参数设置方式。这里就比较一下四种参数获取方案的区别~

命令行 / 文件输入

由于 ROS 节点本身也只是普通的可执行程序,因此它可以正常地从启动参数中读取参数,另外也可以从配置文件中读取参数。这两种方法都是常规程序读取参数的方法。从命令行中读取参数有 C++ 的 Boost.Program_options 库和 Python 的 argparse 的库,用来解析命令行参数输入,支持可选参数、重复参数、参数分组等等。而从文件输入的话,常见的设置格式有 jsonyamltoml 甚至 ini 等等。从这些文件中读取比较灵活,但是无法利用 ROS 框架,并且需要自行统一格式。

参数服务器

ROS 中很有名的支持参数设置的结构是参数服务器,参数服务器是一个包含在 master 结点里的集中式字典结构,在 ROS 的 Wiki 上有介绍:中文 | 英文。参数服务器也可以从文件中读取参数,文件格式是 yaml,读取的方式是在.launch 文件中添加 <rosparam> 标签,并指定键值或者文件路径。

rosparam

rosparam 是操作参数服务器的一套工具,你可以从程序中调用 rosparam 的 API,或者使用命令行工具对指定参数进行动态更改。命令行的用法参见 ROS Wiki

rosrun

rosrunroslaunch 都是运行 ROS 模块的工具,其中 rosrun 只能运行单个节点,而 roslaunch 则支持更加复杂的启动体系。用 rosrun 进行参数服务器的设置的方式是在启动参数中添加 key:=value

roslaunch

roslaunch 进行参数服务器的设置的方式是在文件中添加 <param> 标签。

实质上功能相似,前者设置的是单个参数,而后者针对的是一套参数。另外 roslaunch 还支持从命令行读取参数,格式也是 key:=value,读取进来后存入的是标签,而如果要使用这类参数的话需要使用 roslaunch $(arg key) 语法。具体的 roslaunch` 语法参见 ROS Wiki

dynamic_reconfigure

ROS 中还提供了另一种机制叫 dynamic_reconfigure也可以用来动态设置参数。它与参数服务器的区别在于它的参数更新是基于回调机制,而参数服务器实际上是轮询机制。ROS 程序会主动询问参数服务器以获取参数,而 dynamic_reconfigure 则是动态地告知 ROS 程序参数更新事件。dynamic_reconfigure 的使用方法是定义.cfg 文件,并在其中通过 Python 程序定义可动态设置的参数。cfg 文件在 CMakeLists.txt 中需要注册,注册语法及顺序参见 CMakeLists.txt 的 Wiki.cfg 文件的 Wiki。个人感觉实际上 dynamic_reconfigure 实现的效果和自己定义 ROS 服务来更新参数是相似的。

最后总结下来的话 ROS 参数服务器还是最常用的,但是参数服务器的名称同样也有命名空间的限制,也分私有参数和公有参数等等。。这两个的区别我其实现在还没有搞清楚 = =