前面学了三种主要通信机制:
除了以上三种通信机制,还有第四种通信机制,那就是
可以很方便的通过parameter server保存或读取一些不需要经常变动的常量。
常常用来设置一些配置参数等信息,将这些参数信息写入YAML文件中,一般使用以下方法读取YAML文件的信息(具体操作在第二部分):
总的来说,parameter server不适合用于储存或读取动态的数据,与前面学到的subscriber、service或action-server不同,parameter server不会一直追踪输入的数据,一般情况下,节点只会在启动的时候访问一次parameter server获取信息,如果之后配置参数被修改,parameter server不会实时获取这个变更的数据,只能再下一次调用时才能获取变更后的数据。
先介绍一个指令: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文件
① 先进入到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”文件
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
在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