ROS2参数服务的实现

文章目录

  • 1.参数服务的概念及应用场景
    • 1.1 概念
    • 1.2 应用场景
  • 2.准备工作
  • 3.参数服务的实现
    • 3.1 参数数据类型的使用
    • 3.2 服务端的实现
    • 3.3 客户端的实现
    • 3.4 编译及运行


1.参数服务的概念及应用场景

1.1 概念

参数服务是以共享的方式实现不同节点之间数据交互的一种通信模式。保存参数的节点称之为参数服务端,调用参数的节点称之为参数客户端。参数客户端与参数服务端的交互是基于请求响应的,且参数通信的实现本质上对服务通信的进一步封装。

简单说就是可以多个节点访问取数据!
在这里插入图片描述

1.2 应用场景

导航实现时,会进行路径规划,路径规划主要包含,全局路径规划和本地路径规划,所谓全局路径规划就是设计一个从出发点到目标点的大致路径;而本地路径规划,则是根据车辆当前路况生成实时的行进路径。

两种路径规划实现,都会使用到车辆的尺寸数据——长度、宽度、高度等。上述场景中,就可以使用参数服务实现,在一个节点下保存车辆尺寸数据,其他节点可以访问该节点并操作这些数据。

简单说全局路径规划不懂得灵活变通。
而本地路径规划就十分灵活,可根据情况适时调整!

2.准备工作

在这里插入图片描述

3.参数服务的实现

3.1 参数数据类型的使用

// 创建参数对象

//1.包含头文件;
#include "rclcpp/rclcpp.hpp"

//3.自定义节点类;
class MyParam:public rclcpp::Node{
public:
    MyParam():Node("my_param_node_cpp"){
      RCLCPP_INFO(this->get_logger(),"参数API的使用");
      rclcpp::Parameter p1("car_name","Tiger"); //参数值为字符串类型
      rclcpp::Parameter p2("width",0.15); //参数值为浮点类型
      rclcpp::Parameter p3("wheels",2); //参数值为整型
      // 获取参数值并转换成相应的数据类型
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"car_name = %s", p1.as_string().c_str());
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"width = %.2f", p2.as_double());
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"wheels = %ld", p3.as_int());
      // 获取参数的键
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"p1 name = %s", p1.get_name().c_str());
      // 获取参数数据类型
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"p1 type_name = %s",
      p1.get_type_name().c_str());// 将参数值转换成字符串类型
      RCLCPP_INFO(rclcpp::get_logger("rclcpp"),"p1 value_to_msg = %s",
      p1.value_to_string().c_str());
  }
};

int main(int argc, char const *argv[])
{
    //2.初始化ROS2客户端;
    rclcpp::init(argc,argv);
    //4.调用spain汉书,并传入节点对象指针;
    rclcpp::spin(std::make_shared<MyParam>());
    //5.资源释放
    rclcpp::shutdown();
    return 0;
}

在这里插入图片描述

3.2 服务端的实现

需求: 编写参数服务端, 设置并操作参数。

// 1.包含头文件; 
#include "rclcpp/rclcpp.hpp"
// 3.定义节点类; 
class MinimalParamServer: public rclcpp::Node{
public:
MinimalParamServer():Node("minimal_param_server",rclcpp::NodeOptions().allow_undeclared_parameters(true)){
} 
// 3-1.声明参数;
void declare_param(){
// 声明参数并设置默认值
this->declare_parameter("car_type","Tiger");
this->declare_parameter("height",1.50);
this->declare_parameter("wheels",4);
// 需要设置 rclcpp::NodeOptions().allow_undeclared_parameters(true),否则非法
this->set_parameter(rclcpp::Parameter("undcl_test",100));
} 
// 3-2.查询参数
void get_param(){
RCLCPP_INFO(this->get_logger(),"------------------查----------------");
// 获取指定
rclcpp::Parameter car_type = this->get_parameter("car_type");
RCLCPP_INFO(this->get_logger(),"car_type:%s",car_type.as_string().c_str());
RCLCPP_INFO(this->get_logger(),"height:%.2f",this->get_parameter("height").as_double()); 
RCLCPP_INFO(this->get_logger(),"wheels:%ld",this->get_parameter("wheels").as_int());
RCLCPP_INFO(this->get_logger(),"undcl_test:%ld",this->get_parameter("undcl_test").as_int());
// 判断包含
RCLCPP_INFO(this->get_logger(),"包含car_type? %d",this->has_parameter("car_type"));
RCLCPP_INFO(this->get_logger(),"包含car_typesxxxx? %d",this->has_parameter("car_typexxxx"));
// 获取所有
auto params = this->get_parameters({"car_type","height","wheels"});
for (auto &param : params)
{
RCLCPP_INFO(this->get_logger(),"name = %s, value = %s",param.get_name().c_str(), param.value_to_string().c_str());
}
} 
// 3-3.修改参数
void update_param(){
RCLCPP_INFO(this->get_logger(),"------------------改----------------");
this->set_parameter(rclcpp::Parameter("height",1.75));
RCLCPP_INFO(this->get_logger(),"height:%.2f",this->get_parameter("height").as_double());
} 
// 3-4.删除参数
void del_param(){
    RCLCPP_INFO(this->get_logger(),"------------------删----------------");
// this->undeclare_parameter("car_type");
// RCLCPP_INFO(this->get_logger(),"删除操作后, car_type 还存在马? %d",this->has_parameter("car_type"));
RCLCPP_INFO(this->get_logger(),"删除操作前, undcl_test 存在马? %d",this->has_parameter("undcl_test"));
this->undeclare_parameter("undcl_test");
RCLCPP_INFO(this->get_logger(),"删除操作前, undcl_test 存在马? %d",this->has_parameter("undcl_test"));
}
};

int main(int argc, char ** argv){
// 2.初始化 ROS2 客户端;
rclcpp::init(argc,argv);
// 4.创建节点对象指针, 调用参数操作函数, 并传递给 spin 函数;
auto paramServer= std::make_shared<MinimalParamServer>();
paramServer->declare_param();
paramServer->get_param();
paramServer->update_param();
paramServer->del_param();
rclcpp::spin(paramServer);
// 5.释放资源。
rclcpp::shutdown();
return 0;
}

3.3 客户端的实现

需求: 编写参数客户端, 获取或修改服务端参数。

// 1.包含头文件; 
#include "rclcpp/rclcpp.hpp"
using namespace std::chrono_literals;
// 3.定义节点类; 
class MinimalParamClient: public rclcpp::Node {
public:
MinimalParamClient():Node("paramDemoClient_node"){
paramClient =
std::make_shared<rclcpp::SyncParametersClient>(this,"minimal_param_server");
} 
bool connect_server(){
// 等待服务连接
while (!paramClient->wait_for_service(1s))
{
if (!rclcpp::ok())
{
return false;
} 
RCLCPP_INFO(this->get_logger(),"服务未连接");
} 
return true;
} 
// 3-1.查询参数;
void get_param(){
RCLCPP_INFO(this->get_logger(),"-----------参数客户端查询参数-----------");
double height = paramClient->get_parameter<double>("height");
RCLCPP_INFO(this->get_logger(),"height = %.2f", height);
RCLCPP_INFO(this->get_logger(),"car_type 存在吗? %d",
paramClient->has_parameter("car_type"));
auto params = paramClient->get_parameters({"car_type","height","wheels"});
for (auto &param : params)
{
RCLCPP_INFO(this->get_logger(),"%s = %s",
param.get_name().c_str(),param.value_to_string().c_str());
}
} 
// 3-2.修改参数;
void update_param(){
RCLCPP_INFO(this->get_logger(),"-----------参数客户端修改参数-----------");
paramClient->set_parameters({rclcpp::Parameter("car_type","Mouse"),
rclcpp::Parameter("height",2.0),
//这是服务端不存在的参数, 只有服务端设置了rclcpp::NodeOptions().allow_undeclared_parameters(true)时,
// 这个参数才会被成功设置。
rclcpp::Parameter("width",0.15),
rclcpp::Parameter("wheels",6)});
}
private:
rclcpp::SyncParametersClient::SharedPtr paramClient;
};
int main(int argc, char const *argv[]){
// 2.初始化 ROS2 客户端;
rclcpp::init(argc,argv);
// 4.创建节点对象指针, 调用参数操作函数;
auto paramClient = std::make_shared<MinimalParamClient>();
bool flag = paramClient->connect_server();
if(!flag){
return 0;
} 
paramClient->get_param();
paramClient->update_param();
paramClient->get_param();
// 5.释放资源。
rclcpp::shutdown();
return 0;
}

3.4 编译及运行

修改CMakeLists
然后colcon build
然后运行

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-入门

一.通过 Npm方式下载构建 1.下载和安装Npm&#xff1a;Npm https://docs.npmjs.com/downloading-and-installing-node-js-and-npm 或者 https://nodejs.org/en/download/ 未安装npm 提示 以下以安装node安装包为例 按任意键继续 安装完成后 2. 下载和安装小程序开…

每日学习笔记:C++ STL 的Vector

Vector定义 Vector的大小与容量 Vector的函数 操作注意事项 Vector当作C数组 vector<bool>

Sora盈利新路径:基于技术创新与跨界融合

在数字化时代&#xff0c;技术的飞速进步为企业带来了前所未有的盈利机会。Sora作为一款前沿的AI视频生成工具&#xff0c;其盈利新路径可以基于技术创新与跨界融合两个核心策略来探索。 一、技术创新&#xff1a;持续引领行业前沿 Sora学习资料&#xff1a;使用方式完整文档…

AcWing 898. 数字三角形

解题思路 相关代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.nextInt();int a[][] new int[n1][n1];for(int i1;i<n;i)for(int j1;j<i;j)a[i][j] scanner.nextI…

T1 小美的数组询问(15分) - 美团编程题 题解

考试平台&#xff1a; 牛客网 题目类型&#xff1a; 30道单选题&#xff08;60分&#xff09; 2 道编程题 &#xff08;15分 25分&#xff09; 考试时间&#xff1a; 2024-03-09 &#xff08;两小时&#xff09; 题目描述 小美拿到了一个由正整数组成的数组&#xff0c;但其中…

网络安全:OpenEuler 部署 jumpserver 堡垒机

目录 一、实验 1.环境 2.OpenEuler 部署 jumpserver 堡垒机 3.OpenEuler 使用 jumpserver 堡垒机&#xff08;管理Linux&#xff09; 4.OpenEuler 使用 jumpserver 堡垒机&#xff08;管理Windows&#xff09; 二、问题 1.jumpserver 安装报错 一、实验 1.环境 &#x…

Java零基础-多维数组

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

streamlit学习-如何播放HLS视频(streamlit嵌入html)

streamlit学习-如何播放HLS视频 一.效果二.直播环境搭建(仅供演示)1.生成m3u82.搭建http服务器(支持跨域)3.验证hls(VLC播放 http://localhost:8000/playlist.m3u8) 三.streamlit demo 本文演示了streamlit如何实现hls直播[streamlit中嵌入html] 一.效果 二.直播环境搭建(仅供演…

[Spring] IoC 控制反转和DI依赖注入和Spring中的实现以及常见面试题

目录 1. 什么是Spring 2.什么是IoC容器 3.通过实例来深入了解IoC容器的作用 3.1造一量可以定义车辆轮胎尺寸的车出现的问题 3.2解决方法 3.3IoC优势 4.DI介绍 5.Spring中的IoC和DI的实现 5.1.存对象 5.1.2 类注解 5.1.3 方法注解 5.2取对像 (依赖注入) 5.2.1.属性…

《深度学习风暴:掀起智能革命的浪潮》

在当今信息时代,深度学习已经成为科技领域的一股强大力量,其应用领域涵盖了从医疗到金融再到智能交互等方方面面。随着技术的不断进步和应用的不断拓展,深度学习的发展势头愈发迅猛,掀起了一股智能革命的浪潮。本文将从基本原理、应用实例、挑战与未来发展方向、与机器学习…

大模型产业落地,安全运营能否迎来“自动驾驶”时刻?

科技云报道原创。 通过一段文字描述&#xff0c;就能生成60秒堪比大片的视频&#xff0c;来自大模型Sora的出色表现&#xff0c;让全球都为之震撼。 无论是ChatGPT还是Sora&#xff0c;都只是大模型走出实验室的第一步&#xff0c;大模型如何在产业中落地&#xff0c;为具体的…

数字化运营在教育行业的技术架构实践总结

随着科技的不断进步和数字化时代的到来&#xff0c;教育行业也正面临着数字化转型的挑战和机遇。教育行业的数字化运营需要依靠合理的技术架构来支撑&#xff0c;本文将探讨教育行业数字化运营的技术架构设计。 ## 第一步&#xff1a;需求分析和架构设计 在构建教育行业数字化…

初识Python(helloworld、海洋距离单位换算、打印名片、文本进度条、判断水仙花数)

一、Python3的安装&#xff0c;IDLE的使用&#xff1a;使用print函数输出”hello world”&#xff1b; 二、 PyCharm的安装与使用&#xff1a;创建”hello_world.py”文件并使用print函数输出”hello world” 三、海洋单位距离换算 要求&#xff1a;运行代码&#xff0c;控制台…

七、门控循环单元语言模型(GRU)

门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是 LSTM 的一个稍微简化的变体&#xff0c;通常能够提供同等的效果&#xff0c;并且计算训练的速度更快。 门控循环单元原理图&#xff1a;参考门控循环单元 原理图中各个图形含义&#xff1a; X(t)&a…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

【亲测有效】解决三月八号ChatGPT 发消息无响应!

背景 今天忽然发现 ChatGPT 无法发送消息&#xff0c;能查看历史对话&#xff0c;但是无法发送消息。 可能的原因 出现这个问题的各位&#xff0c;应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了&#xff0c;并且语言选择了中文&#xff0c;抓包看到 ab.chatg…

Flutter 开发环境搭建-VS Code篇

1.准备环境 Java SDK 下载及安装Flutter SDK 安装及配置环境变量 下载地址将flutter sdk解压目录下的bin目录放到系统环境变量中 检查环境&#xff0c;在系统终端中输入&#xff1a; # 打印flutter sdk版本号 flutter --version# 检查flutter运行环境 flutter doctor第一次运…

qt 格式化打印 日志 QMessagePattern 格式词法语法及设置

一、qt源码格式化日志 关键内部类 QMessagePattern qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。 该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qloggi…

专题1 - 双指针 - leetcode 11. 盛最多水的容器

leetcode 11. 盛最多水的容器 1. leetcode 11. 盛最多水的容器1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 1. leetcode 11. 盛最多水的容器 1. 题目详情 给定一个长度为 n 的整数数组 height 。有 n 条垂线…

软考攻略/软考详解/软考等级/软考科目

目录 前言 一、软考是什么 二、证书样式 三、软考介绍 3.1 什么是软考? 3.2 通过了软考&#xff0c;就算有职称了么? 3.3 哪些人可以参加软考? 3.4 软考设置了哪些资格? 3.5 哪些资格含金量比较高呢?报考建议? 四、中级资格推荐以下几个: 计算机软件类 --软件…