目录
最近在研究ROS节点(ROS Node)的参数设置方式,由于系统比较复杂,并且会变得更加复杂,因此需要一个统一的参数设置方式。这里就比较一下四种参数获取方案的区别~
命令行/文件输入
由于ROS节点本身也只是普通的可执行程序,因此它可以正常地从启动参数中读取参数,另外也可以从配置文件中读取参数。这两种方法都是常规程序读取参数的方法。从命令行中读取参数有C++的Boost.Program_options
库和Python的argparse
的库,用来解析命令行参数输入,支持可选参数、重复参数、参数分组等等。而从文件输入的话,常见的设置格式有json
,yaml
,toml
甚至ini
等等。从这些文件中读取比较灵活,但是无法利用ROS框架,并且需要自行统一格式。
参数服务器
ROS中很有名的支持参数设置的结构是参数服务器,参数服务器是一个包含在master结点里的集中式字典结构,在ROS的Wiki上有介绍:中文|英文。参数服务器也可以从文件中读取参数,文件格式是yaml
,读取的方式是在.launch
文件中添加<rosparam>
标签,并指定键值或者文件路径。
rosparam
rosparam
是操作参数服务器的一套工具,你可以从程序中调用rosparam
的API,或者使用命令行工具对指定参数进行动态更改。命令行的用法参见ROS Wiki
rosrun
rosrun
和roslaunch
都是运行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参数服务器还是最常用的,但是参数服务器的名称同样也有命名空间的限制,也分私有参数和公有参数等等。。这两个的区别我其实现在还没有搞清楚= =