0%

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参数服务器还是最常用的,但是参数服务器的名称同样也有命名空间的限制,也分私有参数和公有参数等等。。这两个的区别我其实现在还没有搞清楚= =

Treat me some coffee XD