ROS三种通信方式之参数通信

一、参数服务器的理论模型

参数服务器的理论模型是最简单的,其实就是Master作为一个公共容器可以保存参数,Talker可以向Master中设置参数,Listener可以获取参数。

参数可使用数据类型:

- 32-bit integers
- booleans
- strings
- doubles
- iso8601 dates
- lists
- base64-encoded binary data
- 字典

这里需要注意,参数服务器并不是为了高性能诞生的,所以不要存储二进制大数据,如图片等。

二、参数服务器的实现C++

2.1、新增/修改参数

#include "ros/ros.h"

int main(int argc, char *argv[]) {
    setlocale(LC_ALL,"");

    ros::init(argc,argv,"Set_Param_test");

    // 创建列表容器
    std::vector<std::string> stus;
    stus.push_back("zhangsan");
    stus.push_back("李四");
    stus.push_back("王五");
    stus.push_back("孙大脑袋");

    // 创建字典
    std::map<std::string,std::string> friends;
    friends["guo"] = "huang";
    friends["yuang"] = "xiao";

    /*第一种设置参数方式*/
    ros::NodeHandle nh;
    nh.setParam("nh_int",10); //整型
    nh.setParam("nh_double",3.14); //浮点型
    nh.setParam("nh_bool",true); //bool
    nh.setParam("nh_string","hello NodeHandle"); //字符串
    nh.setParam("nh_vector",stus); // vector
    nh.setParam("nh_map",friends); // map

    //修改演示(相同的键,不同的值)
    nh.setParam("nh_int",10000);

    /*第二种设置参数方式*/
    ros::param::set("param_int",20);
    ros::param::set("param_double",3.14);
    ros::param::set("param_string","Hello Param");
    ros::param::set("param_bool",false);
    ros::param::set("param_vector",stus);
    ros::param::set("param_map",friends);

    //修改演示(相同的键,不同的值)
    ros::param::set("param_int",20000);

    return 0;
}

2.2、获取参数

#include "ros/ros.h"\
#include "String.h"

int main(int argc, char *argv[]) {
    setlocale(LC_ALL,"");

    ros::init(argc,argv,"Get_Param_test");

    // 在ROS中提供了两套API来完成参数操作

    //     ros::NodeHandle

    //     param(键,默认值) 
    //         存在,返回对应结果,否则返回默认值

    //     getParam(键,存储结果的变量)
    //         存在,返回 true,且将值赋值给参数2
    //         若果键不存在,那么返回值为 false,且不为参数2赋值

    //     getParamCached键,存储结果的变量)--提高变量获取效率
    //         存在,返回 true,且将值赋值给参数2
    //         若果键不存在,那么返回值为 false,且不为参数2赋值

    //     getParamNames(std::vector<std::string>)
    //         获取所有的键,并存储在参数 vector 中 

    //     hasParam(键)
    //         是否包含某个键,存在返回 true,否则返回 false

    //     searchParam(参数1,参数2)
    //         搜索键,参数1是被搜索的键,参数2存储搜索结果的变量

    // ros::param ----- 与 NodeHandle 类似

    ros::NodeHandle nh;
    // param 函数
    int res1 = nh.param("nh_int",100); // 键存在
    int res2 = nh.param("nh_int2",100); // 键不存在
    ROS_INFO("param获取结果:%d,%d",res1,res2);

    // getParam 函数
    int nh_int_value;
    double nh_double_value;
    bool nh_bool_value;
    std::string nh_string_value;
    std::vector<std::string> stus;
    std::map<std::string, std::string> friends;

    nh.getParam("nh_int",nh_int_value);
    nh.getParam("nh_double",nh_double_value);
    nh.getParam("nh_bool",nh_bool_value);
    nh.getParam("nh_string",nh_string_value);
    nh.getParam("nh_vector",stus);
    nh.getParam("nh_map",friends);

    ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",
            nh_int_value,
            nh_double_value,
            nh_string_value.c_str(),
            nh_bool_value
            );
    for (auto &&stu : stus) {
        ROS_INFO("stus 元素:%s",stu.c_str());        
    }

    for (auto &&f : friends) {
        ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());
    }

    // getParamCached()
    nh.getParamCached("nh_int",nh_int_value);
    ROS_INFO("通过缓存获取数据:%d",nh_int_value);

    //getParamNames()
    std::vector<std::string> param_names1;
    nh.getParamNames(param_names1);
    for (auto &&name : param_names1) {
        ROS_INFO("名称解析name = %s",name.c_str());        
    }

    ROS_INFO("----------------------------");
    ROS_INFO("存在 nh_int 吗? %d",nh.hasParam("nh_int"));
    ROS_INFO("存在 nh_intttt 吗? %d",nh.hasParam("nh_intttt"));

    std::string key;
    nh.searchParam("nh_int",key);
    ROS_INFO("搜索键:%s",key.c_str());
}

2.3、删除参数

#include "ros/ros.h"

int main(int argc, char *argv[]) {   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"delete_param");

    ros::NodeHandle nh;
    bool r1 = nh.deleteParam("nh_int");
    ROS_INFO("nh 删除结果:%d",r1);

    bool r2 = ros::param::del("param_int");
    ROS_INFO("param 删除结果:%d",r2);

    return 0;
}

三、常用命令rosparam

rosparam包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数。

rosparam set      设置参数
rosparam get      获取参数
rosparam load     从外部文件加载参数
rosparam dump     将参数写出到外部文件
rosparam delete   删除参数
rosparam list     列出所有参数

rosnode ping      测试到节点的连接状态
rosnode list      列出活动节点
rosnode info      打印节点信息
rosnode machine   列出指定设备上节点
rosnode kill      杀死某个节点
rosnode cleanup   清除不可连接的节点

3.1、rosparam set

设置参数

rosparam set name huluwa

3.2、rosparam get

获取参数

rosparam get name

3.3、rosparam delete

删除参数

rosparam delete name

3.4、rosparam load

从外部文件加载参数(先准备 yaml 文件)

rosparam load xxx.yaml

3.5、rosparam dump

将参数写出到外部文件

rosparam dump yyy.yaml

四、小乌龟实操

获取参数列表:

rosparam list

响应结果:

/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r

C++

#include "ros/ros.h"


int main(int argc, char *argv[])
{
    ros::init(argc,argv,"haha");

    ros::NodeHandle nh("turtlesim");
    //ros::NodeHandle nh;

    // ros::param::set("/turtlesim/background_r",0);
    // ros::param::set("/turtlesim/background_g",0);
    // ros::param::set("/turtlesim/background_b",0);

    nh.setParam("background_r",0);
    nh.setParam("background_g",0);
    nh.setParam("background_b",0);
    
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值