ROS入门(四):使用参数服务器

本文介绍了ROS中参数服务器的使用,包括直接编写节点设置参数和通过cfg文件配置。详细讲解了如何获取、设置、删除参数,以及如何通过可视化界面动态调整参数。同时,给出了示例代码和操作步骤。
摘要由CSDN通过智能技术生成

当我们需要控制一个包含很多可移动部件的机器人时,每个部件的位置应该存储在参数服务器以方便其它节点在校正位置时调取。本节将介绍两种设置参数服务器的方法以及如何在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" 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值