当我们需要控制一个包含很多可移动部件的机器人时,每个部件的位置应该存储在参数服务器以方便其它节点在校正位置时调取。本节将介绍两种设置参数服务器的方法以及如何在ROS运行过程中通过可视化界面动态调整参数。两种方法分别参考rospy_tutorials示例006_parameters以及ros wiki教程.
进入学习之前,我们先查询一下rospy中有哪些涉及参数的函数:
$ pydoc rospy | grep _param
- delete_param(param_name)
- get_param(param_name, default= <rospy.client._Unspecified object>)
- get_param_names()
- has_param(param_name)
- search_param(param_name)
- set_param(param_name, param_value)
从函数命名和参数定义看,主要涉及参数的删除、取值、查询是否存在、新增几个功能。
其中search_param和has_param都是查询参数是否存在。依据help文档,参数名存在时,search_param返回参数键名(看代码更像是返回键值啊?),若不存在,search_param返回None.而has_param返回的是bool值。
这是rospy/client中的源代码。search_param 实际上调用了msproxy 中的search.param函数
def search_param(param_name):
"""
Search for a parameter on the param server
NOTE: this method is thread-safe.
@param param_name: parameter name
@type param_name: str
@return: key of matching parameter or None if no matching parameter.
@rtype: str
@raise ROSException: if parameter server reports an error
"""
_init_param_server()
return _param_server.search_param(param_name)
def has_param(param_name):
"""
Test if parameter exists on the param server
NOTE: this method is thread-safe.
@param param_name: parameter name
@type param_name: str
@raise ROSException: if parameter server reports an error
"""
_init_param_server()
return param_name in _param_server #MasterProxy does all the magic for us
msproxy.search_param
def search_param(self, key):
"""
Search for a parameter matching key on the parameter server
@return: found key or None if search did not succeed
@rtype: str
@raise ROSException: if parameter server reports an error
"""
# #1810 searchParam has to use unresolved form of mappings
mappings = rospy.names.get_mappings()
if key in mappings:
key = mappings[key]
with self._lock:
code, msg, val = self.target.searchParam(rospy.names.get_caller_id(), key)
if code == 1:
return val
elif code == -1:
return None
else:
raise rospy.exceptions.ROSException("cannot search for parameter: %s"%msg)
实在太迂回了,决定等有空的时候再追踪下去。估计在client层_param_server存储的是一个字典,如果在这里搜索不到的话,就到别的域进行搜索。
有点跑偏了,我们回到如何编写和参数服务器通讯的节点。
1. 直接编写设置参数服务器的节点
param_talk.launch
launch文件在参数服务器上登记了四层参数(global->foo->gains->param_talker),其中节点param_talker在最里层gains中。如果有兴趣详细了解launch文件,请看官方文档
<launch>
<!-- set a /global_example parameter -->
<param name="global_example" value="global value" />
<group ns="foo">
<!-- set /foo/utterance -->
<param name="utterance" value="Hello World" />
<param name="to_delete" value="Delete Me"