rosparam和ROS参数服务器的使用(C++ & Python)

本文介绍了ROS参数服务器的使用,包括在终端中通过rosparam命令操作参数,以及在C++和Python代码中加载、获取、设置和删除参数的方法。通过yaml文件存储参数,然后在launch文件中加载,实现参数的统一管理和同步。C++示例中展示了如何读取、修改和删除参数,Python示例同样演示了参数的获取、设置和删除操作。
摘要由CSDN通过智能技术生成

1. Prob.

在一个项目里经常会处理很多不同的参数,同时有很多参数是共用的,每个节点都分别定义的话,某一次修改容易造成不同步的问题。为了方便统一和同步,可以使用ROS的参数服务器来完成上述的事情,即通过rosparam把我们的参数列表加载到ROS参数服务器上,然后所有的ROS节点都可以读取和修改其中的参数,非常方便。

2. Method

rosparam的命令可以在terminal中使用,也可以在代码中使用,在这里测试了C++和python的代码,可行!


1)先说第一点,在terminal中使用的指令:

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          列出参数服务器中的参数

以上也可以通过使用rosparam -h获得。


2)C++中使用
主要记录如何从yaml文件中读取参数,然后在代码如何通过参数服务器获得这些代码以及修改或删除

① 首先写一个yaml文件,先建一个以params.yaml命名的文件,然后写下如下参数:

delta_t: 0.2
init_ang1: 0.08726646111111111  
point_path: "/home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt"

② 在launch文件中加入下面这句,加载这个yaml文件

  <rosparam command="load" file="$(find gazebo_mobile_manipulator)/config/params.yaml" />

上面的file参数就是对应的路径,改成自己文件的保存路径即可
③ 代码中如何获取,修改和删除这些参数服务器中的参数,先上代码:

#include <ros/ros.h>

int main(int argc, char** argv){
    ros::init(argc, argv, "read_param");

    ros::NodeHandle nh;

    double joint1;

    nh.getParam("/init_ang1",joint1); //获取指定名的参数
    printf("joint1: %f\n",joint1);
    nh.setParam("init_ang1", 2.5);   //对指定名的参数进行设置,若没有对应的名字就建立一个对应名字的参数
    nh.setParam("init_ang4", 1.57);
    nh.getParam("/init_ang1",joint1);
    nh.getParam("/init_ang4",joint4);
    printf("joint1: %f\n",joint1);
    printf("joint4: %f\n",joint4);
    nh.deleteParam("init_ang4"); // 删除指定名的参数
    if (nh.getParam("/init_ang4",joint4)==false)
       	printf("joint4 was deleted!\n");
    
    std::string point_pth; 
    nh.getParam("/point_path",point_pth);
    printf("point: %s\n",point_pth.c_str()); //注意如果要printf字符串,要加上.c_str(),不然出乱码

}

输出:

joint1: 0.087266
joint1: 2.500000
joint4: 1.570000
joint4 was deleted!
point: /home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt

关键函数说明:

nh.getParam("/init_ang1",joint1); : 这句调用的getParam()函数从参数服务器中获取指定名的参数,如果成功,变量joint1的值就变成参数服务器中保存的数值,并且函数会返回true;如果不成功(如参数服务器没有这个参数),变量joint1维持原值,函数会返回false。可以加一个返回值判断来是否成功获取数值。
nh.setParam("init_ang1", 2.5);: 这句调用的setParam()函数可以修改或建立一个指定名的参数,很好用,如果参数服务器中已经有对应名称的参数就会进行修改,没有就创建一个新的。但是记住,修改完后,要重新读取一遍才会update已经获取的参数,即再run一次nh.getParam("/init_ang1",joint1);
nh.deleteParam("init_ang4");: 这句调用的deleteParam()函数可以从参数服务器中删除一个指定名的参数,如果在删除了这个参数之后再重新读这个参数,getParam()会返回false,然后参数保持原来的数值。


3)Python中使用
根C++版本的一样,主要记录如何从yaml文件中读取参数,然后在代码如何通过参数服务器获得这些代码以及修改或删除

① 首先写一个yaml文件,先建一个以params.yaml命名的文件,然后写下如下参数:

delta_t: 0.2
init_ang1: 0.08726646111111111  
point_path: "/home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt"

② 在launch文件中加入下面这句,加载这个yaml文件

  <rosparam command="load" file="$(find gazebo_mobile_manipulator)/config/params.yaml" />

上面的file参数就是对应的路径,改成自己文件的保存路径即可
③ 代码中如何获取,修改和删除这些参数服务器中的参数,先上代码:

#!/usr/bin/env python
# coding:utf-8

import rospy

def param_demo():
    rospy.init_node("read_param")

    joint1 = rospy.get_param("/init_ang1") # 获取指定名的参数
    rospy.loginfo('joint1 = %f', joint1)
    rospy.set_param('init_ang1',2.5) # 设置参数
    rospy.set_param('init_ang4',1.57)
    joint1 = rospy.get_param("/init_ang1")
    joint4 = rospy.get_param("/init_ang4")
    rospy.loginfo('joint1 = %f', joint1)
    rospy.loginfo('joint4 = %f', joint4)
    rospy.delete_param('/init_ang4') # 删除参数
    if(rospy.has_param("/init_ang4")==False): # 检查参数是否存在
        rospy.loginfo('joint4 was deleted!\n')

    point_pth = rospy.get_param("/point_path")
    rospy.loginfo('point_path = %s', point_pth)

if __name__=="__main__":
    param_demo()

输出:

[INFO] [1644648822.089715]: joint1 = 0.087266
[INFO] [1644648822.091329]: joint1 = 2.500000
[INFO] [1644648822.091718]: joint4 = 1.570000
[INFO] [1644648822.092529]: joint4 was deleted!

[INFO] [1644648822.093152]: point_path = /home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt

关键函数说明:
joint1 = rospy.get_param("/init_ang1"): 这里使用get_param()获取指定名的参数,跟c++差不多;
rospy.set_param('init_ang1',2.5): 使用set_param()设置指定名的参数,用法跟c++一样,有就修改,没有就创建一个;
rospy.delete_param('/init_ang4'): 使用delete_param()删除指定名的参数;
rospy.has_param("/init_ang4"):使用has_param()检查参数服务器中是否有这个名称的参数,有就返回True,没有就返回False,这点跟C++有所不同,在C++中可以直接使用get_param()来判断,但是在python中需要使用has_param()做判断。

Reference

  1. rosparam和ROS参数服务
  2. 【ROS学习】ROS param 的使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值