1.参数模型(全局字典)
各个节点都可以进行访问。可以理解参数是全局变量的一个存储空间。
2.创建功能包
在~/catkin_ws/src的目录下:
打开终端,输入指令:
catkin_create_pkg learning_parameter roscpp rospy std_srvs
3. rosparam的用法
ros在运行时,参数存储在rosparam中
wood@wood:~$ 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
以小海龟程序为例,启动小海龟:
roscore
rosrun turtlesim turtlesim_node
3.1 查看参数(list)
启动小海龟后,再新终端输入rosparam list查看参数
rosparam list
wood@wood:~$ rosparam list
/rosdistro
/roslaunch/uris/host_wood__37517
/rosversion
/run_id
/turtlesim/background_b //RGB表示背景的颜色
/turtlesim/background_g
/turtlesim/background_r
3.2 获得参数值 (get)
获得参数的值可以通过rosparam get来获得:
例如: rosparam get /turtlesim/background_b 获得背景颜色RGB的B值。
wood@wood:~$ rosparam get /turtlesim/background_b
255
wood@wood:~$ rosparam get /turtlesim/background_g
86
wood@wood:~$ rosparam get /turtlesim/background_r
69
3.3 设置参数(set)
设置参数使用set,例如来修改小海龟的背景颜色:
wood@wood:~$ rosparam set /turtlesim/background_b 100
wood@wood:~$ rosparam get /turtlesim/background_b
100
改变了参数的值,但是为何背景的颜色没有变?
这是因为不是实时更新的,需要发送一个请求之后,小海龟仿真器会刷新自己的参数。
rosservice call /clear "{}"
把RGB三个数都换成255之后,背景将变成白色:
rosparam set /turtlesim/background_b 255
rosparam set /turtlesim/background_r 255
rosparam set /turtlesim/background_g 255
rosservice call /clear "{}"
3.4 保存参数的值(dump)
dump命令:
rosparam dump param.yaml
运行后完全没有什么提示,但是刚刚设置的参数数值(未设置的就是原来的,3.1中列出来的)已经保存到param.yaml文件中,路径与当前终端的位置保持一致,即主目录下。
3.5 加载参数文件 (load)
在3.4中保存了参数,亦可以直接在文件中修改参数。例如把背景RGB都改成0:
保存后退出。
加载参数文件:
wood@wood:~$ rosparam load param.yaml
wood@wood:~$
wood@wood:~$ rosparam get /turtlesim/background_b
0
wood@wood:~$ rosparam get /turtlesim/background_g
0
wood@wood:~$ rosparam get /turtlesim/background_r
0
wood@wood:~$
wood@wood:~$ rosservice call /clear "{}"
wood@wood:~$
3.6 删除一个参数(delete)
例如删除g颜色:rosparam delete /turtlesim/background_g
刷新之后,颜色是变了的:
4. 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;
//修改之前的参数值
// 读取背景颜色参数
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;
}
5.设置编译规则
千万不要写错字母什么的,大小写,拼写。第二行打错了会有满屏的“未定义的引用”。
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
6.编译和运行
在~/catkin_ws目录下打开终端,运行 catkin_make
编译成功:
运行小海龟:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_parameter parameter_config