ROS2 入门应用 请求和应答(C++)
ROS2 入门应用 请求和应答(C++)
- 1. 创建功能包
- 2. 创建源文件
- 2.1. 服务端
- 2.2. 客户端
- 3. 添加依赖关系
- 4. 添加编译信息
- 4.1. 添加搜索库
- 4.2. 增加可执行文件
- 4.3. 增加可执行文件位置
- 5. 编译和运行
1. 创建功能包
在《ROS2 入门应用 工作空间》中已创建和加载了ros2_ws工作空间
在《ROS2 入门应用 元功能包(C++)》中已创建和加载了my_package功能包
那么就创建一个独立的cpp_srvcli功能包来做服务的请求和应答的功能
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces
--dependencies可选参数将会自动在package.xml和CMakeLists.txt中添加必要的依赖行
依赖example_interfaces包,将会使用到example_interfaces的srv文件,两位整数求和服务:
int64 a
int64 b
---
int64 sum
2. 创建源文件
进入cpp_srvcli功能包的src文件夹
cd ~/ros2_ws/src/cpp_srvcli/src
2.1. 服务端
新建add_two_ints_server.cpp服务端源文件
nano add_two_ints_server.cpp
复制以下内容到文件中:
#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"#include <memory>/* 求和函数 */
void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response)
{/* 从请求中添加两个整数,并将总和提供给响应 */response->sum = request->a + request->b;/* 使用日志通知控制台其服务状态 */RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld", request->a, request->b);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
}int main(int argc, char **argv)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 定义服务端节点add_two_ints_server */std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server");/* 创建服务名为add_two_ints,服务函数为add的service服务端 */rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service =node->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", &add);/* 通知准备就绪 */RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints.");/* 运行节点 */rclcpp::spin(node);/* 退出ROS2 */rclcpp::shutdown();
}
2.2. 客户端
新建add_two_ints_client.cpp客户端源文件
nano add_two_ints_client.cpp
复制以下内容到文件中:
#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"#include <chrono>
#include <cstdlib>
#include <memory>/* 方便表示时间 */
using namespace std::chrono_literals;int main(int argc, char **argv)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 校验 */if (argc != 3) {RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y");return 1;}/* 定义客户端节点add_two_ints_client */std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_client");/* 创建服务名为add_two_ints的client客户端 */rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client =node->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");/* 创建请求request */auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = atoll(argv[1]);request->b = atoll(argv[2]);/* 搜索服务节点,间隔1s */while (!client->wait_for_service(1s)) {if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return 0;}/* 如果找不到,将会继续等待 */RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}/* 获得应答并显示其状态 */auto result = client->async_send_request(request);// Wait for the result.if (rclcpp::spin_until_future_complete(node, result) ==rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);} else {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_two_ints");}/* 退出ROS2 */rclcpp::shutdown();return 0;
}
3. 添加依赖关系
创建功能包时,已通过--dependencies可选参数自动在package.xml中添加必要的依赖行
<depend>rclcpp</depend>
<depend>example_interfaces</depend>
4. 添加编译信息
在CMakeLists.txt编译文件中
4.1. 添加搜索库
创建功能包时,已通过--dependencies可选参数自动在CMakeLists.txt中添加必要的搜索库依赖行
find_package(rclcpp REQUIRED)
find_package(example_interfaces REQUIRED)
4.2. 增加可执行文件
然后,再增加可执行文件,
src/add_two_ints_server.cpp命名为server可执行文件,
src/add_two_ints_client.cpp命名为client可执行文件,
并添加目标依赖关系:
add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client rclcpp example_interfaces)
4.3. 增加可执行文件位置
最后,增加可执行文件位置,这样ROS2就可以找到现在的可执行文件:
install(TARGETSserverclientDESTINATION lib/${PROJECT_NAME})
5. 编译和运行
进入工作空间根目录
cd ~/ros2_ws
在编译之前检查缺失的依赖项(可跳过):
rosdep install -i --from-path src --rosdistro humble -y
编译:
colcon build --packages-select cpp_srvcli
打开一个新终端,运行服务端节点:
ros2 run cpp_srvcli server# [INFO] [rclcpp]: Ready to add two ints.
打开一个新终端,运行客户端节点:
ros2 run cpp_srvcli client 1 2# [INFO] [rclcpp]: Sum: 3
谢谢
相关文章:
ROS2 入门应用 请求和应答(C++)
ROS2 入门应用 请求和应答(C)1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包 在《ROS2 入门应用 工作空间》中已创建和加载了…...
华为机试题:HJ73 计算日期到天数转换(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。3、整型int() :将指定进制…...
将springboot项目生成可依赖的jar,并引入到项目中
1、将springboot项目生成可依赖的jar包的方法 SpringBoot项目默认打包的是可运行jar包,也可以打包成不可运行的jar包。 能打成可运行的jar包是因为,Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage …...
小红书搜索关键词布局指南,这4种词一定要把握好
在小红书搜索关键词布局,是提升搜索推流的重要方法,今天跟你讲清楚小红书搜索关键词布局怎么做~做小红书的都知道,小红书的主要流量来源一个是推荐,另一个就是搜索,关键词决定了你的精准人群,那…...
安全研发人员能力模型窥探
能力 是一个比较抽象的概念,不同的行业、管理者、研发人员对能力的认知都会有差异。另外,作为研发团队的相应的职级定级、绩效考核的基础,一个“大家普遍认可”的能力的模型是非常重要的。这是比职级模型更高层的一个基本模型,所谓…...
【面试总结】Linux篇·操作及原理篇
【面试总结】Linux篇原理篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型4.如何在Linux上配置一个IP地址5.Linux负载是什么?6.Linux中的软链接和硬链接有什么区别?1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)…...
C++中如何实现用异或运算找出数组中只出现一次的数字???
文章目录1、异或运算符的运算1、异或运算符的运算 问题描述: 给出一个指定的数组,只有一个数出现一次,剩下都出现两次,找出出现一次的数字。指定数组为[1,2,2,1,3,4,3]。 样例输出:4 #include<iostream> using…...
红黑树的历史和由来。
一个数组,1,2,3,4,5,...n; 一共n个数字。1、直接查找想要查询第n个数字,直接搜索,就是n次查询。ps:那么问题来了,这样查询也太慢了,有什么改进的呢?2、二分查找这个时候,二分查找更快。不过就是…...
蓝库云|制造业数字化转型为何转不动?资料处理很重要
数字化转型已经成为每个产业势在必行的课题,没有人会怀疑数字化技术与科技能解放的生产力能量,但为什么看似美好的愿景,实行起来却如此缓慢?蓝库云认为这是因为没有盖好「资料治理」的地基。 面对不断变化的法令规范要求…...
【python学习笔记】 :Lambda 函数
Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expressionlambda 关键字可以用来创建一个 lambda 函数,紧跟其后的是参数列表和用冒号分割开的单个表达式。例如,lambda x: 2…...
Nginx的proxy buffer参数设置
1. proxy_buffering 语法:proxy_buffering on|off 默认值:proxy_buffering on 上下文:http,server,location作用:该指令开启从后端被代理服务器的响应body缓冲。 如果proxy_buffering开启,nginx假定被代理的后端服务器会以最…...
SPI简介与实例分析
SPI简介 SPI 协议是由Motorola提出的通讯协议 (Serial Peripheral Interface) ,是一种高速全双工的串行通信总线。 SPI 通讯使用 3 条总线 :SCK、 MOSI、 MISO ,以及若干片选线(SS、CS、NSS)。 主机要和哪个从机通信,就把对应的…...
通过基于pgsql的timescaleDB的time_bucket函数实现自定义聚合粒度
1、自己写的不完全满足要求的实现方式 with tb_tmp as (select *, //计算该时间距离第一天有多少天((extract(epoch from create_time) /3600/24)::integer) as ct_ifrom test.test_salary )select min(a.create_time) as create_time,sum(a.salary) from (select *,//移动数据…...
一台电脑安装26个操作系统(windows,macos,linux)
首先看看安装了哪些操作系统1-4: windows系统 四个5.Ubuntu6.deepin7.UOS家庭版8.fydeOS9.macOS10.银河麒麟11.红旗OS12.openSUSE Leap13.openAnolis14.openEuler(未安装桌面UI)15.中标麒麟(NeoKylin)16.centos17.debian Edu18.fedora19.oraclelinux20.R…...
dockerfile文件
dockerfile文件内容 Form ip端口/centos:regular ENV JAVA_HOME /E:/Program Files/Java/jdk1.8.0_351 ENV PATH $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 WORKDIR /opt COPY target/fast.jar /op…...
视觉SLAM ch11回环检测
回环检测的关键:如何有效的检测出相机经过同一个地方。如果成功的检测到可以为后端的位姿图提供更多有效数据,得到全局一致的估计。 回环检测提供了当前数据和所有历史数据的关联,还可以用回环检测进行重定位。 具体方法: 一&am…...
关于Ubuntu20.04文件系统思考
文章目录问题产生Ubuntu文件系统中普通用户可读写地址Ubuntu文件系统Ubuntu文件系统详解一级目录二级目录查找Ubuntu中软件安装位置Ubuntu修改文件权限问题产生 使用electron框架开发桌面端跨平台软件时,当开发完成的程序部署到Ubuntu上,系统无法产生日…...
内嵌于球的等边三棱柱
( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做一个网络让输入只有3个节点,每个训练集里有两张图片,让B的训练集全为0,排列组合A,观察迭代次数平均值的变化。共完成了64组,但只有12组不同的迭代次数。 差值结构 A-B 迭代次…...
论文解读 | [CVPR2020] ContourNet:向精确的任意形状场景文本检测迈出进一步
目录 1 研究背景和目的 1.1 主要贡献: 1.2 两个挑战: 2 ContourNet 3 方法论 3.1 Adaptive-RPN 3.2 LOTM 3.3 点重定位算法 4 实验和结果 论文地址:ContourNet: Taking a Further Step toward Accurate Arbitrary-shaped Scene Tex…...
干货分享|数据可视化报表制作技巧
脑中想得再好,也要看最终的效果呈现。但偏偏有些用户分析思维不差,就是数据分析报表的制作拖了后腿,导致始终无法完美呈现数据可视化分析效果。本文将总结奥威BI软件上的常用的数据可视化报表制作技巧,供大家随时查阅。 BI数据可…...
保姆级教程:用命令行搞定npm 2FA配置,告别网页来回跳转
命令行极客指南:npm 2FA全流程自动化实战 每次发布npm包都要掏出手机查验证码?在无头服务器上部署时被2FA卡住?作为命令行重度用户,我们完全可以在终端里完成从启用、日常使用到禁用2FA的全流程。本文将带你用纯CLI方式打通npm双因…...
两轮车租赁数字化升级:从物联网架构到运营效率提升
1. 两轮车租赁模式升级:从传统痛点看数字化解决方案最近和几个在欧洲做短途出行和即时配送的朋友聊天,大家不约而同地提到了一个趋势:两轮车,特别是电动两轮车的租赁市场,正在经历一场静悄悄但深刻的模式升级。这背后&…...
长期使用Taotoken聚合服务对开发者日常工作效率的积极影响观察
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对开发者日常工作效率的积极影响观察 1. 引言:从分散管理到统一接入的转变 在模型应用开发过…...
OpenClaw爬虫框架Docker化实践:从环境封装到生产部署
1. 项目概述:当“OpenClaw”遇见Docker最近在折腾一个挺有意思的项目,叫“OpenClaw”。这名字听起来有点酷,对吧?它本质上是一个网络爬虫框架,但设计理念和常见的Scrapy、Puppeteer这些不太一样。OpenClaw更侧重于“规…...
error while updating dependencies: node_modules包资源权限报错 缓存包构建
vue3vite - 解决报错error while updating dependencies:Error:EACCES:permission denied,mkdir ‘x‘(系统权限问题) 问题说明 在vite vue3项目开发中,出现报错: [vitel error while updating dependencies: Error:EACCES:permission deni…...
水介导软模板 COF|MS 模拟细节全拆解
#MaterialsStudio #COF 模拟 #Nature 子刊 #科研干货 #分子模拟🔥Nature 子刊 COF 重磅突破!四川大学团队首次用软模板法做出有序分级孔 COF里面的 Materials Studio 模拟部分写得超规范新手做 COF 晶体模拟直接抄作业👇✅ 模拟工具与核心方法…...
CloudCompare点云滤波保姆级教程:从低通到CSF,7种方法一次搞定(附避坑指南)
CloudCompare点云滤波实战指南:7大核心方法与避坑策略 点云数据处理是三维重建、地形测绘和工业检测等领域的关键环节。面对海量且带有噪声的原始点云,如何高效筛选有效信息成为每个从业者的必修课。CloudCompare作为开源点云处理利器,其丰富…...
大语言模型角色扮演:从提示工程到智能体框架的完整指南
1. 项目概述:当大语言模型学会“扮演”角色如果你最近在关注大语言模型(LLM)的应用,可能会发现一个有趣的现象:单纯让模型回答“11等于几”或者写一封邮件,已经越来越难以满足我们的好奇心和实际需求了。一…...
[K8S小白问题集] - Calico好在哪里?
一、Calico 的核心优势:不止于连通Calico 的设计哲学是“用路由而非封装实现连通,用策略而非信任保障安全”。它并非简单的 CNI,而是一个完整的云原生网络与安全平台。1.1 三层核心能力能力技术实现价值BGP 原生 Underlay每个节点运行 BIRD&a…...
小程序商城常见误区
小程序商城常见误区小程序商城常见误区上周有个做水果批发的老哥跟我吐槽,说他小程序商城上线三个月,一共才卖了27单。我问他怎么做的,他说”找了个模板挂上去,上了几十个商品,等着客户来买。“——等了三个月…...
