ROS学习笔记七:parameter server

ROS学习笔记七:parameter server

一.Parameter server

前面学了三种主要通信机制:

  • publishers/subscribers
  • services/clients
  • action-servers/action-clients

除了以上三种通信机制,还有第四种通信机制,那就是

  • parameter server

可以很方便的通过parameter server保存或读取一些不需要经常变动的常量。
常常用来设置一些配置参数等信息,将这些参数信息写入YAML文件中,一般使用以下方法读取YAML文件的信息(具体操作在第二部分):

  1. 通过命令行进入parameter server加载这个YAML文件
  2. 通过launch文件调用它

总的来说,parameter server不适合用于储存或读取动态的数据,与前面学到的subscriber、service或action-server不同,parameter server不会一直追踪输入的数据,一般情况下,节点只会在启动的时候访问一次parameter server获取信息,如果之后配置参数被修改,parameter server不会实时获取这个变更的数据,只能再下一次调用时才能获取变更后的数据。


二.调用YAML文件

先介绍一个指令:rosparam
可以通过这个指令去设置或读取parameter server中的YAML文件信息
先看看在rosparam下还有什么命令,输入:
rosparam
可以看到会有如下输出:

rosparam is a command-line tool for getting, setting, and deleting parameters from the ROS Parameter Server.

Commands:
    rosparam set    set parameter
    rosparam get    get parameter
    rosparam load   load parameters from file
    rosparam dump   dump parameters to file
    rosparam delete delete parameter
    rosparam list   list parameter names

先使用rosparam list查看当前有什么参数,如果事前没有加载过任何YAML文件或使用指令创建参数会是如下输出:

/rosdistro
/roslaunch/uris/host_will_450r5g_450r5u__39459
/rosversion
/run_id

后面将要加载一个YAML文件

方法一:通过rosparam指令加载

① 先进入到ROS的工作空间中的src包中,在src包中用catkin_simple package创建一个名称为”example_parameter_server”的包
cs_create_pkg example_parameter_server roscpp std_msgs

② 进入”example_parameter_server”文件夹,先创建一个launch文件夹,然后再进入launch文件夹创建一个“.yaml”文件,设置一个简单的P.I.D参数:
cd example_parameter_server
mkdir launch
cd launch
touch jnt1_gains.yaml
写入如下代码:

joint1_gains: {p: 1.0, i: 2.0, d: 3.0}

③ 然后通过命令使parameter server加载该YAML文件(要确保当前位置是在YAML文件所在的目录下):
rosparam load jnt1_gains.yaml
此时再用rosparam list可以看到新加载的参数:

/joint1_gains/d
/joint1_gains/i
/joint1_gains/p
/rosdistro
/roslaunch/uris/host_will_450r5g_450r5u__39459
/rosversion
/run_id

上述的头三个参数就是我们在YAML文件中设置的参数名称,现在再用指令查看它们的数值:
rosparam get /joint1_gains/
输出:

{p: 1.0, i: 2.0, d: 3.0}

或查看单个参数 rosparam get /joint1_gains/d
输出:

3.0

也可以通过命令对这些参数进行修改:
rosparam set /joint1_gains/d 5.0
此时再次输入rosparam get /joint1_gains/d
输出的是:

5.0

但是这个参数的变更不会保存到YAML文件中,如果要让这个变更后的参数保存到YAML文件中,输入如下命令:
rosparam dump jnt1_gains.yaml
这时再打开YAML文件,就可以看到原来的代码发生了变化:

joint1_gains: {d: 5.0, i: 2.0, p: 3.0}
rosdistro: 'indigo

  '
roslaunch:
  uris: {host_will_450r5g_450r5u__39459: 'http://will-450R5G-450R5U:39459/'}
rosversion: '1.11.21

  '
run_id: b04c5780-2c1f-11e8-ad95-1449e025a108

同时也有指令可以删除parameter server中的参数,如:
rosparam delete /joint1_gains/
这时再查看参数列表:
rosparam list
输出:

/rosdistro
/roslaunch/uris/host_will_450r5g_450r5u__39459
/rosversion
/run_id

可见,之前添加的参数已经被删除了,如果想要重新添加,只需重新加载即可。

方法二:通过launch文件加载

① 在launch文件夹中创建一个“.launch”文件
cd launch
touch load_gains.launch

② 在“.launch”文件中写入如下代码:

<launch>
<rosparam command="load" file="$(find example_parameter_server)/launch/jnt1_gains.yaml" />
launch>

③ 启动launch文件
roslaunch example_parameter_server load_gains.launch
这时通过命令查看参数列表:
rosparam list
输出:

/joint1_gains/d
/joint1_gains/i
/joint1_gains/p
/rosdistro
/roslaunch/uris/host_will_450r5g_450r5u__39459
/rosversion
/run_id

三.在节点(nodes)中调用parameter server

src文件中创建一个名称为“read_param_from_node.cpp”的文件
cd src
touch read_param_from_node.cpp
写入如下代码:

#include 

int main(int argc, char **argv) {
    ros::init(argc, argv, "param_reader"); // 节点名
    ros::NodeHandle nh; // 节点句柄
    double P_gain,D_gain,I_gain; //定义变量

    //调用parameter server中的参数“/joint1_gains/p” ,保存到变量“P_gain”中
    if (nh.getParam("/joint1_gains/p", P_gain)) {
    ROS_INFO("proportional gain set to %f",P_gain);
    }
    else
    {
    ROS_WARN("could not find parameter value /joint1_gains/p on parameter server");
    }
    //调用parameter server中的参数“/joint1_gains/d” ,保存到变量“D_gain”中
    if (nh.getParam("/joint1_gains/d", D_gain)) {
    ROS_INFO("derivative gain set to %f",D_gain);
    }
    else
    {
    ROS_WARN("could not find parameter value /joint1_gains/d on parameter server");
    }
    //调用parameter server中的参数“/joint1_gains/i” ,保存到变量“I_gain”中
    if (nh.getParam("/joint1_gains/i", I_gain)) {
    ROS_INFO("integral gain set to %f",I_gain);
    }
    else
    {
    ROS_WARN("could not find parameter value /joint1_gains/i on parameter server");
    }
}

然后别忘了在CMakeLists.txt文件中添加生成可执行文件的指令:

cs_add_executable(read_param_from_node src/read_param_from_node.cpp)

跟着编译catkin_make之后就可以运行了(默认已启动roscore)
注意,一定要先运行”.launch”文件加载YAML文件后再启动节点,这样节点才能从parameter server中获得参数消息
roslaunch example_parameter_server load_gains.launch
然后再运行
rosrun example_parameter_server read_param_from_node
有如下输出说明成功读取parameter server的信息:

[ INFO] [1521548844.470463999]: proportional gain set to 3.000000
[ INFO] [1521548844.471017132]: derivative gain set to 5.000000
[ INFO] [1521548844.471511677]: integral gain set to 2.000000

你可能感兴趣的:(ROS,learning)