回顾参数的模型,之前介绍过在ROS Master中有一个参数服务器Paramester Server,它是一个全局字典, 是用来保存各个节点之间的配置参数的
比如这里有一个Paramester Server,里面保存了名字my_robot,半径0.4和高度0.5,这些配置参数是各个节点都可以全局访问的,比如在A节点访问robot_name字典就可以得到值my_robot,它只需要给ROS Master发送一个查询的请求就可以返回该结果,node A,B,C,D类似。虽然各个node不属于同样一个PC里,可能是位于不同的电脑里,但是只要你是在同样一个ROS环境里都可以通过Paramester Server来查询这样全局字典的参数,我们可以将Paramester Server简单理解为全局变量存储空间,这就是Paramester Server参数服务器的一个模型
接下来是参数服务器的使用方法
第一步,创建功能包
专门针对Paramester Server创建功能包learning_paramester,依赖参数roscpp rospy std_srvs
cd ~/catkin_ws/src 进入工作空间下src里打开终端
catkin_create_pkg learning_parameter roscpp rospy rospy std_srvs 创建功能包
参数命令行rosparam的使用
基本上rosparam可以完成大部分参数的查询,设置,保存文件,读取文件都可以来使用,在ros里如果参数比较多的话一般会用到这样一个文件yaml 这样一个参数文件,效果如下
左边是字典的变量名,右边是变量对应的值,一对一对出现
在ros中,经常会涉及很多配置参数,这些参数一个一个设很麻烦,便会用这样的参数文件把所有参数列出来然后一次性加载到Paramester Server里来
下面以海龟为例看rosparam命令行的使用方式
roscore
rosrun turtlesim turtlesim_node 运行海龟仿真器
接下来再打开一个终端学习rosparam命令行的使用
rosparam list 查询海龟历程里有多少参数在里面
background_b,background_g,background_r是后面背景颜色蓝色的rgb值,可以通过修改该值置换背景颜色,其余还包括ROS Master本身提供的一些参数,比如ros版本号,当前运行的ros的版本,进程的id号
rosparam get 参数名(例: /turtlesim/background_b) 得到某个参数的值
例:rosparam get /turtlesim/background_b
可见ros的发行版noetic版,ros的version是1.15.9;这些参数都是存在在ros paramester里面的
rosparam get 参数名 要修改的值
修改某个变量的名字
例:
rosparam set /turtlesim/background_b 100
rosservice call /clear “{}”
需要再发一个请求才可以把背景颜色改变,该请求的服务名为clear,也是发送空即可,一旦发送该请求仿真器就会查询后面的rgb值然后刷新背景颜色
rosparam dump 文件名 把参数保存成一个文件
例: rosparam dump param.yaml
用rosparam把参数保存成一个文件,比如说想保存某个ros系统里的很多参数,后面可以作为调试依据
这个文件会保存在这个终端的当前路径下,默认这个路径为主文件路径,可以在主文件夹下找到该文件
打开文件,可见它保存了我们刚在终端例里看到的这些参数的值
另外,还可以在文件里修改参数值,保存后使用另外一个命令
rosparam load 文件名 当前路径下加载一个文件、
rosservice call /clear “{}” 再刷新一下背景颜色
rosparam delete 参数名 删掉某个参数
例: rosparam delete /turtlesim/background_b (注意路径)
重新刷新背景颜色即可看缺失参数后的颜色
第二步,编程方法(C++)
下面通过程序看一下刚刚命令行上的操作在程序里面应该怎样去实现
将课件代码/learning_parameter/src里的parameter_config.cpp代码文件放置于catkin_ws/src/learning_learning_parameter/src里
parameter_config.cpp代码内容
/**
* 该例程设置/读取海龟例程中的参数
*/
#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 Master里的参数服务器里的参数了
ros::NodeHandle node;
// 读取背景颜色参数值
//通过ros::param::get获取得到参数值后存到red,green,blue,这是上面已经定义好的int型变量
ros::param::get("rosrun turtlesim turtlesim_node/background_r", red);
ros::param::get("rosrun turtlesim turtlesim_node/background_g", green);
ros::param::get("rosrun turtlesim turtlesim_node/background_b", blue);
//加一个日志信息,标注在修改信息前原始变量的值
ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue);
// 设置背景颜色参数
//通过ros::param::set修改变量的具体值
ros::param::set("rosrun turtlesim turtlesim_node/background_r", 255);
ros::param::set("rosrun turtlesim turtlesim_node/background_g", 255);
ros::param::set("rosrun turtlesim turtlesim_node/background_b", 255);
//日志信息,告诉终端修改了背景颜色
ROS_INFO("Set Backgroud Color[255, 255, 255]");
// 读取背景颜色参数
//重新读取检查背景颜色参数
ros::param::get("rosrun turtlesim turtlesim_node/background_r", red);
ros::param::get("rosrun turtlesim turtlesim_node/background_g", green);
ros::param::get("rosrun turtlesim turtlesim_node/background_b", blue);
ROS_INFO("Re-get Backgroud Color[%d, %d, %d]", red, green, blue);
// 调用服务,刷新背景颜色
//调用海龟服务器clear服务,刷新
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;
}
第三步,配置代码编译规则
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
第四步,编译并运行发布者
cd ~/catkin_ws //回到工作空间根目录下
catkin_make //编译
source devel/setup.bash //设置环境变量,可通过下面方法减去该步骤,跳过
roscore
rosrun turtlesim turtlesim_node
rosrun learning_parameter parameter_config //编译运行刚才实现的程序节点,运行learning_service里的一个节点,节点名为turtle_spawn
运行结束最后一个指令的结果
原来是蓝色运行后是白色
同时会看到在终端显示原来数据值是65,86,255,然后修改后是255,255,255,最后重新获取一遍都是255即修改成功
以上就是在程序里通过get,set两种方式修改或获取参数的值
提示:这里的get,set并不是ros里唯一的获取参数或者设置参数的,还有其他方式,参考http://wiki.ros.org/Parameter%20Sserver
Python文件代码
将代码放与
主目录/catkin_ws/src/learning_parameter/scripts/
流程完全一样,注意怎样通过rospy.get_param来获取参数的原始值并保存与red,green,blue
通过rospy.set_param可以把变量变成某值
再rospy.get_param一遍发现值都变化了,然后再发送一个clear这个请求让背景颜色发生变化变为白色
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程设置/读取海龟例程中的参数
import sys
import rospy
from std_srvs.srv import Empty
def parameter_config():
# ROS节点初始化
rospy.init_node('parameter_config', anonymous=True)
# 读取背景颜色参数
red = rospy.get_param('/background_r')
green = rospy.get_param('/background_g')
blue = rospy.get_param('/background_b')
rospy.loginfo("Get Backgroud Color[%d, %d, %d]", red, green, blue)
# 设置背景颜色参数
rospy.set_param("/background_r", 255);
rospy.set_param("/background_g", 255);
rospy.set_param("/background_b", 255);
rospy.loginfo("Set Backgroud Color[255, 255, 255]");
# 读取背景颜色参数
red = rospy.get_param('/background_r')
green = rospy.get_param('/background_g')
blue = rospy.get_param('/background_b')
rospy.loginfo("Get Backgroud Color[%d, %d, %d]", red, green, blue)
# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
rospy.wait_for_service('/clear')
try:
clear_background = rospy.ServiceProxy('/clear', Empty)
# 请求服务调用,输入请求数据
response = clear_background()
return response
except rospy.ServiceException, e:
print "Service call failed: %s"%e
if __name__ == "__main__":
parameter_config()