通过前面两篇博客的介绍,相信大家对ROS的通讯机制已经有了一个基本的认识,本篇博客我们将学习ROS中的另一种通讯机制–参数服务器。与前两种通信方式不同,参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。
参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
何为字典,其实就是一个个的键值对,我们小时候学习语文的时候,常常都会有一本字典,当遇到不认识的字了我们可以查部首查到这个字,获取这个字的读音、意义等等,而这里的字典可以对比理解记忆。键值kay可以理解为语文里的“部首”这个概念,每一个key都是唯一的,参照下图:
每一个key不重复,且每一个key对应着一个value。也可以说字典就是一种映射关系,在实际的项目应用中,因为字典的这种静态的映射特点,我们往往将一些不常用到的参数和配置放入参数服务器里的字典里,这样对这些数据进行读写都将方便高效。
参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:
其实在ROS Master中就存在一个参数服务器Parameter Server,它是一个全局字典,用来保存各个节点的配置参数,每个节点都是可以访问的,并且会返回需要得到的值。
现在我们来介绍参数服务器的使用方法,首先依然是创建我们的功能包,经过前面两篇博客的介绍,相信大家对这些基本的操作已经很熟悉了:
cd ~/catkin_ws/src
catkin_create_pkg learning_parameter roscpp rospy std_srvs
完成之后如下图:
YAML文件用来保存各种参数,而且这样可以更加方便进行管理。
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
现在我们来具体的操作,首先在下图所示的目录下创建对应的cpp文件,源码在下面:
/**
* 该例程设置/读取海龟例程中的参数
*/
#include
#include
#include
int main(int argc, char **argv)
{
int red, green, blue;
// ROS节点初始化
ros::init(argc, argv, "parameter_config");
// 创建节点句柄
ros::NodeHandle node;
// 读取背景颜色参数
ros::param::get("/background_r", red);
ros::param::get("/background_g", green);
ros::param::get("/background_b", blue);
ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue);
// 设置背景颜色参数
ros::param::set("/background_r", 255);
ros::param::set("/background_g", 255);
ros::param::set("/background_b", 255);
ROS_INFO("Set Backgroud Color[255, 255, 255]");
// 读取背景颜色参数
ros::param::get("/background_r", red);
ros::param::get("/background_g", green);
ros::param::get("/background_b", blue);
ROS_INFO("Re-get Backgroud Color[%d, %d, %d]", red, green, blue);
// 调用服务,刷新背景颜色
ros::service::waitForService("/clear");
ros::ServiceClient clear_background = node.serviceClient<std_srvs::Empty>("/clear");
std_srvs::Empty srv;
clear_background.call(srv);
sleep(1);
return 0;
}
代码本身比较简单,只是调用api接口就可以实现参数的get和set。
然后进行编译,和之前一样,依旧是把有关的编译规则添加到相应的位置:
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
随后进入catkin_ws目录下进行catkin_make即可:
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_parameter parameter_config
可以看到,在运行了rosrun learning_parameter parameter_config
后,我们成功的将小海龟的背景颜色改成了白色。
本篇博客到此结束,相信大家对参数服务器通讯也已经有所了解了,下一篇我们将介绍action的通讯方式。