ROS(四)参数服务器C++实现

参数服务器是什么呢,就相当于我们有一个参数容器,然后我们要从中获取一些数据,或者对数据进行增删查改的操作。比如我们要对机器人进行路径规划,那有些地方是限制大小才能允许通过的,这个时候我们就需要知道机器人自身的尺寸吧,它自己大了就无法通过,那获取这个数据我们就可以用参数服务器实现,那对参数服务器参数的增删改查操作改如何用c++来实现呢,就是我们下面的内容。

1.建立功能包

在这里插入图片描述
别忘了添加依赖
在这里插入图片描述

2.参数服务器新增参数

创建一个实现此功能的cpp
在这里插入图片描述
编辑cpp

#include"ros/ros.h"

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"set_change_param");
    ros::NodeHandle nh;
    //设置整型数据
    nh.setParam("nh_int",5);            //两个参数的值分别为参数名和参数值
    //设置浮点型数据
    nh.setParam("nh_double",0.1);
    //设置bool型数据
    nh.setParam("nh_bool",true);
    //设置字符串数据
    nh.setParam("nh_string","ss");
    //设置vector数据
    std::vector<std::string> vec;
    vec.push_back("张三");
    vec.push_back("李四");
    vec.push_back("王五");
    nh.setParam("nh_vec",vec);
    //设置map数据
    std::map<std::string,std::int32_t>mp;
    mp["C语言"]=1;
    mp["C++"]=2;
    mp["java"]=3;
    nh.setParam("nh_map",mp);
    return 0;
}


编辑Cmakelist.txt
为了避免难记,就把可执行文件名同cpp文件名就行
在这里插入图片描述
Ctrl + Shift + B编译
在这里插入图片描述
没问题
开终端来运行一下
在这里插入图片描述

3.参数服务器修改参数

修改的话也用setParam,只是说,把相同名的参数的值改变了,另一种实现用ros::param::set()也可以
代码如下

#include"ros/ros.h"

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"set_change_param");
    ros::NodeHandle nh;
    //设置整型数据
    nh.setParam("nh_int",5);            //两个参数的值分别为参数名和参数值
    //设置浮点型数据
    nh.setParam("nh_double",0.1);
    //设置bool型数据
    nh.setParam("nh_bool",true);
    //设置字符串数据
    nh.setParam("nh_string","ss");
    //设置vector数据
    std::vector<std::string> vec;
    vec.push_back("张三");
    vec.push_back("李四");
    vec.push_back("王五");
    nh.setParam("nh_vec",vec);
    //设置map数据
    std::map<std::string,std::int32_t>mp;
    mp["C语言"]=1;
    mp["C++"]=2;
    mp["java"]=3;
    nh.setParam("nh_map",mp);

    //修改整形数据
    nh.setParam("nh_int",10);
    //修改浮点型数据
    ros::param::set("nh_double",0.5);
    //修改vec数据
    vec.erase(vec.begin());   //删除"张三”
    ros::param::set("nh_vec",vec);
    //修改map数据
    mp["C语言"]=2;
    ros::param::set ("nh_map",mp);
    return 0;
}

修改后的终端效果
double和map[“C语言”]的值确实改变了
在这里插入图片描述

4.参数服务器获取参数

照样有ros::NodeHandle和 ros::param 两种实现

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 类似

param函数,nh_int之前存在,值为10,nh_int2不存在
在这里插入图片描述
结果:
在这里插入图片描述

getParam 函数,键存在就赋值给参数2,不存在就不赋值,输出参数2就会输出为空

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

    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_vec",vec);
    nh.getParam("nh_map",mp);

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

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

结果
在这里插入图片描述
getParamCached 会更快一些而已,要求高性能就可以用这个

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

在这里插入图片描述

getParamNames()函数,得到所有的键(参数名字)

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

结果;
在这里插入图片描述

hasParam函数,有无某个参数名字

//hasParam
    bool flag1=nh.hasParam("nh_int");
    bool flag2=nh.hasParam("nh_int2");
    ROS_INFO("存在 nh_int 吗? %d",flag1);
    ROS_INFO("存在 nh_int2 吗? %d",flag2);

结果
在这里插入图片描述

searchParam函数,不存在的键,其参数不赋值

 std::string key1;
    nh.searchParam("nh_int",key1);
    ROS_INFO("搜索键:%s",key1.c_str());
    std::string key2;
    nh.searchParam("nh_int2",key2);
    ROS_INFO("搜索键:%s",key2.c_str());

在这里插入图片描述

总代码:

#include  "ros/ros.h"
  
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"search_param");
    ros::NodeHandle nh;
    
     // param 函数
    int res1 = nh.param("nh_int",100); // 键存在
    int res2 = nh.param("nh_int2",100); // 键不存在,设为默认值100
    ROS_INFO("获取整数结果:%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> vec;
    std::map<std::string, std::int32_t>mp;

    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_vec",vec);
    nh.getParam("nh_map",mp);

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

    for (auto &f : mp)
    {
        ROS_INFO("map 元素:%s = %d",f.first.c_str(), f.second);
    }
    
     // getParamCached()
    nh.getParamCached("nh_int",nh_int_value);
    ROS_INFO("通过缓存获取数据:%d",nh_int_value);

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

    //hasParam
    bool flag1=nh.hasParam("nh_int");
    bool flag2=nh.hasParam("nh_int2");
    ROS_INFO("存在 nh_int 吗? %d",flag1);
    ROS_INFO("存在 nh_int2 吗? %d",flag2);

    std::string key1;
    nh.searchParam("nh_int",key1);
    ROS_INFO("搜索键:%s",key1.c_str());
    std::string key2;
    nh.searchParam("nh_int2",key2);
    ROS_INFO("搜索键:%s",key2.c_str());

    
    return 0;
}

在这里插入图片描述
ros::param实现的话也类似

5.参数服务器删除参数

ros::NodeHandle
        deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

    ros::param
        del("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

代码:

#include "ros/ros.h"

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"delet_param");
    ros::NodeHandle nh;
    
    bool flag1 = nh.deleteParam("nh_int");
    if(flag1){
        ROS_INFO("第一次删除nh_int成功");
    }
    else{
        ROS_INFO("第一次删除nh_int失败");
    }

    bool flag2 = ros::param::del("nh_int");
    if(flag2){
        ROS_INFO("第二次删除nh_int成功");
    }
    else{
        ROS_INFO("第二次删除nh_int失败");
    }
    
    return 0;
}

结果;
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS(机器人操作系统)是一款广泛应用于机器人领域的操作系统,其开发环境为C++,但也可以使用其他编程语言进行开发,例如Python、Java和Lua等。对于TCP对外通信的实现ROS同样提供了基于C语言的API接口,用户可以通过ROS提供的TCP通信库实现对外通信。 在ROS中,网络通信最常用的方法是ROS通信机制。ROS通信机制使用了ROS自己定义的一套TCP/IP协议,可以在不同节点之间进行通信。ROS提供了很多通信协议,例如发布/订阅、服务和参数服务器等。其中,发布/订阅是ROS中最常用的通信方式之一,它允许一个节点将数据发布到话题中,其他节点则可以在需要的时候订阅这个话题,并接受到发布的数据。 在ROS中通过C语言实现TCP对外通信,首先需要使用ROS提供的ROS Transport库,该库提供了一个高效、可扩展的通信架构,支持多种传输类型,包括TCP、UDP、Shared Memory等。接下来,用户需要使用C语言编写节点,注册话题,并在话题中发布数据。在另一个节点中,用户则可以使用C语言编写服务节点,并在服务中监听指定的端口,以接受来自其他节点的TCP连接请求。一旦TCP连接建立,服务节点收到请求并处理后,可以向请求节点返回数据响应。 总的来说,通过ROS提供的C语言API,用户可以在ROS实现基于TCP的对外通信功能。这种方式可以实现高效、可扩展的通信架构,支持多种传输类型,同时也具有ROS本身的优点,例如跨平台、易于开发和调试等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

eeemmm123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值