“时间见证一切!”
- 一、简述
- 二、通过命令行操作参数
- -查看参数列表
- -查询参数
- -设置参数
- -删除参数
- -创建和加载参数文件
- 三、在C++代码中操作参数
- -设置参数
- -读取参数
- 四、在启动文件中操作参数
- -设置参数
- -设置私有参数
- -从yaml文件读取参数
- 五、展望
一、简述
参数(rosparameters)机制用以获取节点信息。用参数服务器维护一个变量集的值,包括很多数据类型。由于允许节点查询,故不适用于频繁随时间变更的变量。
二、通过命令行操作参数
以打开一个小乌龟界面为例。以下均为已经打开小乌龟界面操作。
-查看参数列表
rosparam list 效果如下
-查询参数
- 查询单个参数信息:
rosparam get 参数名
信息如下:
- 查询一个命名空间下所有参数信息:
rosparam get 命名空间
-设置参数
这里以设置小乌龟背景为例。
- 设置单个参数
rosparam set 参数名 参数值
效果如下:
- 设置同一命名空间下多个参数(yaml格式):
shell会自动检测双引号结束,请放心换行(enter).
rosparam set 命名空间 "参数1: 值1
参数2: 值2
参数3: 值3"
- 由于节点不会自动感知参数的变化,这里调用如下语句使设置生效:
rosservice call /clear
-删除参数
rosparam delete 参数名
-创建和加载参数文件
以yaml格式储存所有参数,或者读取yaml文集中的参数添加到参数服务器
rosparam dump 文件名 命名空间
rosparam load 文件名 命名空间
三、在C++代码中操作参数
重新创建一个功能包命名为param_change
-设置参数
主要用到ros::param::set()
源码为set_param.cpp,如下:
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <std_srvs/Empty.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "set_bg_color") ;
ros::NodeHandle nh ;
ros::service::waitForService("clear") ;
ros::param::set("background_r", 255);
ros::param::set("background_g", 255);
ros::param::set("background_b", 0);
ros::ServiceClient clearClient = nh.serviceClient<std_srvs::Empty>("/clear") ;
std_srvs::Empty srv ;
clearClient.call(srv);
return 0 ;
}
- 为小乌龟的背景三通道赋值。
- 在启动turtlesim节点前等待/clear服务调用结束,从而确保我们的设置不会被初始化的背景色覆盖。
- 最后通过调用/cleat服务强制turtle读取我们的参数值(服务详见第八章)
-读取参数
和上文在同一个目录(相当于前文pubvell的扩展),
源码如下(名为get_param.cpp):
ros::param::get(参数名,需要获取的参数(程序中设置)) ;
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "publish_param_vel") ;
ros::NodeHandle nh ;
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1000) ;
srand(time(0)) ;
const std::string PARAM_NAME = "~max_vel" ;
double maxVel ;
bool ok = ros::param::get(PARAM_NAME, maxVel) ;
if(!ok)
{
ROS_FATAL_STREAM("could not get param: " << PARAM_NAME) ;
exit(1) ;
}
ros::Rate rate(2) ;
while(ros::ok())
{
geometry_msgs::Twist msg ;
msg.linear.x = double(rand())/double(RAND_MAX) ;
msg.angular.z = 2*double(rand())/double(RAND_MAX) - 1 ;
pub.publish(msg) ;
rate.sleep();
}
return 0 ;
}
- 是作为pubvel例程的一个附加工具,读取私有参数max_vel的值,并且用这个数值来调整随即生成线速度的大小。该程序需要预设最大速度(max_vel)值,在程序之前设置
rosparam set /publish_velocity/max_vel 0.1
。
说明:这里是私有参数,对于私有参数的设置
- 在C++源文件中参数名前加~,如
~max_vel
; - 在命令行中加下划线“_参数名:=参数值”如
_max_vel:=0.3
四、在启动文件中操作参数
-设置参数
<param name="参数名" value="参数值" />
例如
<group ns="my_ns">
<param name="param1" value="value1" />
<param name="param2" value="value2" />
<param name="param3" value="value3" />
...
</group>
-设置私有参数
将要设置的param元素包含到节点中即可:
<node ...>
<param ... />
</ node>
例如:
<node pkg="pubpose" type = "xx" name="xx">
<param name="max_vel" value="3" />
</ node>
-从yaml文件读取参数
<rosparam command="load" file="$(包名)/yaml文件.yaml">