1.8.1 全局字典
在ROS Master 里面有一个参数服务器Parameter Server,他是一个全局字典,各个节点都可以全局访问,各个节点可以在不同的PC里面,只要在同样的ROS环境里面都可以通过Parameter Server去查询全局字典的参数
1.8.2创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_parameter roscpp rospy std_srvs
1.8.3 YAML参数文件
当我们的参数较多时,我们将其放到YAML参数文件中,在用的时候可以一次性将其加载到Parameter Server中
1.8.4 rosparam
rosparam命令可以完成大部分的参数的查询、设置、保存到文件、读取文件等
⚫ 列出当前多有参数
$ rosparam list
⚫ 显示某个参数值
$ rosparam get param_key
⚫ 设置某个参数值
$ rosparam set param_key param_value
⚫ 保存参数到文件
$ rosparam dump file_name
⚫ 从文件读取参数
$ rosparam load file_name
⚫ 删除参数
$ rosparam delete param_key
1.8.5 rosparam 使用
我们利用小海龟来学习该部分内容,先运行节点管理器,再运行海龟仿真器,再在一个新的终端里输入rosparam,按回车便可以显示出他后面可以跟的参数
(1)rosparam list可以查看当前所有参数
(2)rosparam get 可以获取参数的值,后面跟rosparam list所显示出来的参数,如rosparam get /turtlesim/background_b
(3)rosparam set可以重新设定参数的值,后面跟的第一个参数是参数的名字,第二个参数是新的值。如rosparam set /turtlesim/background_b 255 将/turtlesim/background_b 的值设定为255,这时可以运用rosparam get来查看现在/turtlesim/background_b的值是否变为了255,/turtlesim/background_b 、/turtlesim/background_r 、/turtlesim/background_g 这三个参数用来设定仿真器的背景色,但是经过上面的改动后,背景色并没有改变,因为仿真器还需要发送一个请求rosservice call /clear “{}” 它会去查询背景的rgb值有没有发生改变,若改变会刷新背景的颜色,如下所示
(4)rosparam dump命令可以将参数保存为文件,后面跟的参数是文件名如 rosparam dump param.yaml 默认路径会存放在主文件夹下
(5)我们可以在以上的文件中对参数进行修改,保存后再利用rosparam load命令将其中的参数导入,后面跟的参数是文件名,如rosparam load param.yaml (同样需要运行rosservice call /clear “{}”背景色才会变)
(6)rosparam delete命令可以删除某个参数,后面跟的是参数名,如rosparam delete /turtlesim/background_r
1.8.6 C++代码
/**
* 该例程设置/读取海龟例程中的参数
*/
#include <string>
#include <ros/ros.h>
#include <std_srvs/Empty.h>
int main(int argc, char **argv)
{
int red, green, blue;
// ROS节点初始化
ros::init(argc, argv, "parameter_config");
// 创建节点句柄
ros::NodeHandle node;
// 读取背景颜色参数 ********************red、green和blue是C++中的整型变量,用来表示颜色的三个分量,
ros::param::get("/turtlesim/background_r", red);
ros::param::get("/turtlesim/background_g", green);
ros::param::get("/turtlesim/background_b", blue);
/**
* ros::param::get函数使用了参数名"/background_r"、"/background_g"和"/background_b",
* 这些参数名是在ROS参数服务器中存储的背景颜色的三个分量,对应于red、green和blue变量。
* 例如:方程add:x+y=2,其中add是参数,x和y是变量
*/
ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue);
// 设置背景颜色参数
ros::param::set("/turtlesim/background_r", 255);
ros::param::set("/turtlesim/background_g", 255);
ros::param::set("/turtlesim/background_b", 255);
ROS_INFO("Set Backgroud Color[255, 255, 255]");
// 读取背景颜色参数
ros::param::get("/turtlesim/background_r", red);2
ros::param::get("/turtlesim/background_g", green)
ros::param::get("/turtlesim/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;
}
std_srvs::Empty
是ROS中的一个标准服务类型,它不需要任何参数。它的定义如下:
# Empty request message
---
# Empty response message
可以看到,std_srvs::Empty
服务类型有一个空的请求消息(即---
),以及一个空的响应消息(即也是---
)。
在ROS服务通信中,服务请求和响应都是以消息的形式进行交换的。因此,在使用服务客户端向服务端发送请求时,需要创建一个消息对象,并将其作为参数传递给服务客户端的call
函数。在这里,std_srvs::Empty
服务类型的请求消息为空,因此可以创建一个空的请求对象srv
,用于向/clear
服务发送请求。
1.8.7 设置编译
接下来同样是在CMakeLists.txt文件中设置编译的规则,将以下语句复制到CMakeLists文件中
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
1.8.8 编译
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_parameter parameter_config