文章只是个人学习过程中学习笔记,主要参考ROS教程1 2 。
1、概述
参数服务器(Parameter Server
3):是可以通过网络 API 访问的共享的多变量字典。在运行时节点(Nodes)使用此服务器去存储和检索参数。(类似于全局变量,存储多个节点共享的数据。)
Tips:参数服务器不是为高性能(high-performance)而设计的,因此最好用于静态、非二进制的数据,如配置参数。
2、参数服务器通信机制
参数服务器通信
是ROS通信中一种比较特殊又比较简单的通信方式。参数服务器在ROS Master
内部运行。
3、参数命令rosparam
rosparam
4 能让我们在ROS参数服务器(Parameter Server)上存储和操作数据。参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。
命令 | 功能 |
---|---|
rosparam set | 设置参数 |
rosparam get | 获取参数 |
rosparam load | 从文件中加载参数 |
rosparam dump | 向文件中转储参数 |
rosparam delete | 删除参数 |
rosparam list | 列出参数名 |
Tips:
rosparam
使用YAML标记语言的语法。一般而言,YAML的表述很自然:1是整型,1.0是浮点型,one是字符串,true是布尔型,[1, 2, 3]是整型组成的列表,{a: b, c: d}是字典。
4、参数服务器通信实操 – 修改海龟模拟器的背景颜色
通过ROS内置的 海龟模拟器(turtlesim)
来进行参数服务器通信的实操,这里我们以修改海龟模拟器背景颜色举例:背景颜色修改为紫色(RGB: 160 32 240)。
实现的步骤如下:
步骤1:在新终端中启动roscore
roscore
步骤2:在新终端中启动海龟模拟器的节点turtlesim_node
rosrun turtlesim turtlesim_node
步骤3:在新终端中使用rosparam
命令获取参数列表。
rosparam list
步骤4:通过调试工具rqt
工具箱和编程的方式修改海龟模拟器的背景颜色。
4.1 调试工具实现
在新终端中输入rqt
命令打开rqt工具箱,然后在菜单栏中打开参数和服务插件,分别为Plugins/Configuration/Param Edit
和Plugins/Services/Service Caller
,如图4-3所示。
在Param Edit
中将海龟模拟器turtlesim的背景颜色background_x的值改为紫色,如图4-4所示①;然后在Service Caller
中选择调用clear
服务,如图4-4所示②;最后点击右上角Call使已被修改的参数生效。
4.2 编程实现(C++)
在beginner_tutorials
软件包的src
目录下创建修改海龟模拟器的背景颜色
的源文件:
roscd beginner_tutorials
cd src
touch turtle_set_param.cpp
4.2.1 程序代码(turtle_set_param.cpp)
#include "ros/ros.h"
#include <std_srvs/Empty.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL,"");
/* 初始化ROS节点 */
ros::init(argc,argv,"turtle_set_param");
/* 为这个节点创建句柄 */
ros::NodeHandle nh("turtlesim");
int red, green, blue;
/* 读取海龟模拟器背景颜色参数 */
ros::param::get("/turtlesim/background_r",red);
ros::param::get("/turtlesim/background_g",green);
ros::param::get("/turtlesim/background_b",blue);
ROS_INFO("Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue);
/* 设置海龟模拟器背景颜色参数,设置为紫色(160,32,240) */
ros::param::set("/turtlesim/background_r",160);
ros::param::set("/turtlesim/background_g",32);
ros::param::set("/turtlesim/background_b",240);
ROS_INFO("Set turtlesim background color[%3d, %3d, %3d]",160 ,32,240);
/* 读取海龟模拟器背景颜色参数 */
ros::param::get("/turtlesim/background_r",red);
ros::param::get("/turtlesim/background_g",green);
ros::param::get("/turtlesim/background_b",blue);
ROS_INFO("Again get turtlesim background color[%3d, %3d, %3d]",red ,green,blue);
/* 调用 /clear 服务,使已被修改的参数生效 */
ros::service::waitForService("/clear");
ros::ServiceClient client = nh.serviceClient<std_srvs::Empty>("/clear"); // 参数为空的服务
std_srvs::Empty srvs;
/* 服务调用 */
if(client.call(srvs))
{
ROS_INFO("海龟模拟器turtlesim已修改的背景颜色已生效!");
}
else
{
ROS_INFO("调用服务失败!");
}
return 0;
}
4.2.2 配置CMakeLists.txt
只需将这几行添加到CMakeLists.txt
文件的底部:
add_executable(turtle_set_param src/turtle_set_param.cpp)
target_link_libraries(turtle_set_param ${catkin_LIBRARIES})
4.2.3 编译、运行
在你的工作空间下执行catkin_make编译,将turtle_set_param.cpp
编译成可执行文件turtle_set_param
。编译后,在终端中执行过程如下所示。
4.3 编程实现(Python)
在beginner_tutorials
软件包的scripts
目录下创建修改海龟模拟器的背景颜色
源文件:
roscd beginner_tutorials
cd scripts
touch turtle_set_param.py
chmod +x turtle_set_param.py
4.3.1 程序代码(turtle_set_param.py)
#!/usr/bin/env python
# encoding: utf-8
import rospy
from std_srvs.srv import Empty
def turtle_set_param():
# 初始化ROS节点
rospy.init_node("turtle_set_param")
# 读取海龟模拟器背景颜色参数
red = rospy.get_param("/turtlesim/background_r")
green = rospy.get_param("/turtlesim/background_g")
blue = rospy.get_param("/turtlesim/background_b")
rospy.loginfo("Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue)
# 设置海龟模拟器背景颜色参数,设置为紫色(160,32,240)
rospy.set_param("/turtlesim/background_r",160)
rospy.set_param("/turtlesim/background_g",32)
rospy.set_param("/turtlesim/background_b",240)
rospy.loginfo("Set turtlesim background color[%3d, %3d, %3d]",160 ,32,240)
# 读取海龟模拟器背景颜色参数
red = rospy.get_param("/turtlesim/background_r")
green = rospy.get_param("/turtlesim/background_g")
blue = rospy.get_param("/turtlesim/background_b")
rospy.loginfo("Again Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue)
# 调用 /clear 服务,使已被修改的参数生效
rospy.wait_for_service("/clear")
try:
clear_client = rospy.ServiceProxy("/clear",Empty)
clear_client()
rospy.loginfo("海龟模拟器turtlesim已修改的背景颜色已生效!")
except rospy.ServiceException as e:
rospy.loginfo("调用服务失败!")
if __name__ == '__main__':
turtle_set_param()
4.3.2 配置CMakeLists.txt
只需catkin_install_python
中添加scripts/turtle_set_param.py
即可:
#安装python可执行脚本
catkin_install_python(PROGRAMS
scripts/turtle_set_param.py
...
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
4.3.3 编译、运行
其实这个例子很简单,不需要编译,直接执行python文件就行。但是我们还是养成习惯吧,每次创建和修改代码后,就catkin_make编译一下,即使是Python节点也必须使用它。这是为了确保能为创建的消息和服务自动生成Python代码。
5、rosparam实操
ROS提供了一个稳定的命令行工具rosparam来设置和获取参数。通过已运行的海龟模拟器(turtlesim)来实操参数命令。
5.1 rosparam list
rosparam list
列出所有的参数名。
turtlesim节点在参数服务器上有3个参数用于设定背景颜色(RGB格式):
/turtlesim/background_x
5.2 rosparam get
rosparam get [parameter-name]
获取一个参数的值。
也可以使用 rosparam get /
命令来显示参数服务器上的所有内容。
5.3 rosparam set
rosparam set [parameter-name] [parameter-value]
为参数设置一个值。
# 将 turtlesim 的背景颜色修改为红色(RGB: 255 0 0)
rosparam set /turtlesim/background_r 255
rosparam set /turtlesim/background_g 0
rosparam set /turtlesim/background_b 0
上述指令修改了参数的值,但还未生效,因此我们需要调用clear
服务使得参数的修改能生效:
rosservice call /clear
5.4 rosparam dump
rosparam dump[file-name]
将参数服务器的 YAML 格式的内容转储到文件中。
# 在 beginner_tutorials软件包下创建param目录文件夹
roscd beginner_tutorials
mkdir param
# 在param目录文件夹下将参数服务器的 YAML 格式的内容转储到文件中。
cd param
rosparam dump params_all.yaml
Node:参数保存位置为当前执行命令的目录下。
rosparam dump[file-name] [namespace]
只转储指定命名空间中的参数。
# 在param目录文件夹下转储指定命名空间中的参数
rosparam dump params_specified.yaml turtlesim
5.5 rosparam load
rosparam load [file-name]
将 YAML 文件中的参数加载到指定的命名空间(默认为/)。
修改params_all.yaml文件 turtlesim 的背景颜色修改为绿色(RGB: 0 255 0)
rosparam load params_all.yaml
rosservice call /clear
甚至可以将YAML文件重载入新的命名空间,例如:copy_param
rosparam load params_specified.yaml copy_param
5.6 rosparam delete
rosparam delete [parameter-name]
删除参数值。
rosparam delete /copy_param/background_r
rosparam delete /copy_param/background_g
ROS.org. ROS教程[EB/OL]. 2020-12-22[2022-7-5]. http://wiki.ros.org/cn/ROS/Tutorials. ↩︎
ROS.org. 理解ROS服务和参数[EB/OL]. 2020-12-23[2022-11-02]. https://wiki.ros.org/cn/ROS/Tutorials/UnderstandingServicesParams. ↩︎
ROS.org. Parameter Server[EB/OL]. 2018-11-08[2022-11-02]. https://wiki.ros.org/Parameter%20Server. ↩︎
ROS.org. rosparam[EB/OL].2014-06-29[2022-11-02]. https://wiki.ros.org/rosparam ↩︎