ROS-8 参数的使用与编程方法

一、概念

ROS Master中有一个参数服务器Paramester Server,它是一个全局字典, 是用来保存各个节点之间的配置参数的。

二、rosparam

那对于各个节点的参数,我们可以rosparam XXX等对其进行查看,修改等多种操作,具体操作可通过终端输入rosparam指令查看。

试一下在没有打开任何节点时,ros系统中的全局参数。

 然后我打开小海龟节点后,当前系统中的全局参数有:

可以看到,打开小海龟节点之后多了三个参数,这三个参数是用来设置小海龟背景板RGB值的。

需要注意每一个background前的命名空间,今后无论是查看还是修改都要带着这个命名空间。

可以通过get的指令查看一下:

2.1 通过命令行修改全局参数

下面我们来尝试在命令行修改一下这些参数:

 我先用rosparam set 将b值改为0,然后用rosparam get 查看b值发现更改生效。可是小海龟的背景颜色还是这个蓝色,并没有更改。所以这里需要注意,命令行更改参数不具有实时性,因此如果是用命令行修改的参数,还需要再重新发送一次参数更改请求,参数更改请求命令如下:

 2.2 保存当前系统的全局参数

可以使用 rosparam dump 文件名.yaml来保存当前系统的全局参数,需要注意的是文件的保存路径默认是主目录

 保存后的.yaml文件如下:

 我们也可以在这个.yaml中修改参数值。

例如:我把background_g改为255

 保存文件后,需要通过rosparam load 文件名.yaml加载修改后的文件,然后再重新发送一次参数更改请求。

2.3 通过程序设置全局参数

在当前工作空间中创建learning_parameter功能包,并在其中编写如下c++程序parameter_config:

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程设置/读取海龟例程中的参数
 */
#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("/turtlesim/background_r", red);
	ros::param::get("/turtlesim/background_g", green);
	ros::param::get("/turtlesim/background_b", blue);

	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);
	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;
}

写完程序,编译完了之后,重启roscore,运行小乌龟节点,然后运行程序

运行结果如下;

猜你喜欢

转载自blog.csdn.net/m0_46093829/article/details/122284225