ros 自定义服务(service)数据类型

7.ROS编程学习:自定义服务数据c++调用 阅读详情

假设工作文件夹在~/catkin_ws/src/learning_service下

第一步,创建一个srv文件夹

$ mkdir srv

第2步,定义自定义数据类型,在srv文件夹下创建.srv文件,假设定义一个Person.

$ cd srv
$ vi Person.srv

Person里面包含他的名字,年龄,性别,注意service要有request和response,
"- --"上面的部分是request, 下面是response

string name
uint8 age
uint8 sex

uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result

第3步, 编译message
首先需要添加依赖
(1)在learning_service下的package.xml中加入如下部分

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

(2)在learning_service下的CMakeLists.txt中加入如下部分

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  rospy
  std_msgs
  turtlesim
  message_generation  #added
)
....

add_service_files(FILES Person.srv)  #added
generate_messages(DEPENDENCIES std_msgs)  #added

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
....

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_service
   CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime #注释取消掉,加上message_runtime
#  DEPENDS system_lib
)

(3)编译

$ cd ~/catkin_ws
$ catkin_make

可以看到编译出来的文件

$ cd ~/catkin_ws/devel/include/learning_service
$ ls
Person.h  PersonRequest.h  PersonResponse.h

其中Person.h包含了PersonRequest和PersonResponse, 用的时候只需要include Person.h

第4步, client端代码
进入src文件夹

$ cd ~/catkin_ws/src/learning_service/src
$ vi person_client.cpp
#include <ros/ros.h>
#include "learning_service/Person.h"

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

   ros::NodeHandle node;

   //发现/show_person服务后,创建client, 连接/show_person的服务
   ros::service::waitForService("/show_person");
   ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");

   //初始化请求数据
   learning_service::Person srv;
   srv.request.name = "Tom";
   srv.request.age = 20;
   srv.request.sex = learning_service::Person::Request::male;

   ROS_INFO("Call service to show person [name:%s, age:%d, sex:%d]",
         srv.request.name.c_str(), srv.request.age, srv.request.sex);

   person_client.call(srv);

   ROS_INFO("Show person result: %s", srv.response.result.c_str());

   return 0;
}

可以看到,只需要include Person.h, Person的数据类型是learning_service::Person,
它有request和response两个部分,person_client.call(srv)调用时,它会发送出数据消息,并等待server的response,
等到response之后,输出srv.response.result, 注意ROS_INFO string类型的数据时,要转为c_str()

第5步, server端代码

$ cd ~/catkin_ws/src/learning_service/src
$ vi person_server.cpp
#include <ros/ros.h>
#include "learning_service/Person.h"

bool personCallback(learning_service::Person::Request &req,
                    learning_service::Person::Response &res) {
   ROS_INFO("Person: name:%s age:%d sex:%d", req.name.c_str(), req.age, req.sex);
   res.result = "OK";
   return true;
}

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

   ros::NodeHandle n;

   ros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);

   ROS_INFO("Ready to show person information");
   ros::spin();

   return 0;
}

service名为"/show_person", ros::spin()是无限循环,一直等client发来的request,
一旦有request, 就进入回调函数personCallback, 它的参数一个是request, 一个是response。

第6步,编译cpp文件
(1)在CMakeLists.txt中加入如下部分

#added-S
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES}) 
add_dependencies(person_server ${PROJECT_NAME}_gencpp)

add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)
#added-E
#############
## Install ##
#############

(2)编译

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash

最后一步,运行

先运行server

$ rosrun learning_service person_server 
[ INFO] [1642040930.719064479]: Ready to show person information

再运行client

$ rosrun learning_service person_client 
[ INFO] [1642040973.332175599]: Call service to show person [name:Tom, age:20, sex:1]
[ INFO] [1642040973.334280244]: Show person result: OK

这时server端由于进入了回调函数,会出现如下信息

[ INFO] [1642040973.334187292]: Person: name:Tom age:20 sex:1

参考《古月居 ros》

在Ros中如何自定义话题消息和自定义服务数据 在ros中自定义话题消息和自定义服务数据 阅读详情

相关推荐

ROS2接口实战:从零开始自定义消息类型(含Python示例)

本文详细介绍了在ROS2中从零开始自定义消息类型的完整流程。通过一个移动机器人应用场景,讲解了如何利用IDL定义数据契约,使用CLI工具探索接口,并遵循最佳实践设计消息和服务。文章提供了清晰的Python示例代码,涵盖接口定义、编译集成到实际节点开发的每一步,帮助开发者构建高效、清晰的ROS2通信系统。

weixin_29164185的博客 539

ROS 之自定义 service

service 和 topic 都是ROS中数据交流的方法,区别在于: 1. topic 发送之后,并不要求有人能接收,或者说,并不确定谁来接收; 2. 接收topic之后,处理的结果并不会返回给 发送者。 但是对于 service 来说,client 是数据的发送者/客户/请求者, server 是接收端/服务者,提供某些操作,两者是一对一的,而且,server处理结果会返回给 client。 自定义 service 主要分为两个步骤: 1. 定义request 和 response 数

yaoyaoqiekenaoo的博客 646

ROS2 学习笔记5:了解ROS2 服务Service

在ros2里面,节点可通过服务进行通信。不像话题那样,一个节点发布消息可以被一个或多个订阅器接收的的通信方式;服务是一种请求/响应模式,客户端节点发出请求,服务端节点处理这个请求并给出响应。通常,不会连续调用一个服务;话题,甚至动作更符合这种场景。在本教程中,你使用了命令行工具去识别,详细说明和调用服务。

weixin_43180456的博客 1796

[WebServices] 之二:支持的数据类型

 ASP.NET WebService 支持绝大多数的基元类型及其数组,另外还支持自定义的结构(Struct)、类型(Class)、枚举(Enum)、DataSet、XmlElement、XmlNode、集合(IEnumerable/ICollection)等。 ASP.NET WebService 使用 XmlSerializer 进行序列化操作,对于自定义类型要注意以下几点: 1.

编程菜鸟---正在努力进阶 477

ROS2教程 05 服务Service

一、ROS2 服务Service 运行示意图 服务Service是一种通信方式,与话题Topic不同,服务是call-and-response模型,不同于话题的publisher-subscriber模型。因此,话题Topic用于订阅数据流并获得持续更新,而服务Service仅在被客户端Client请求调用Request时,从服务端Server取得数据,并将客户端Client的反馈Response传回给服务端Server。 话题Topic用于单向通信,而服务Service用于双向通信,在需要持续发布内容时

m0_56661101的博客 5440

ROS2探索(三)service

前言 本篇介绍ROS2中的service机制,涉及到server和client两部分。service的示例主要包含两个源文件:ros2/examples/rclcpp/services/minimal_service/main.cpp和ros2/examples/rclcpp/services/minimal_client/main.cpp。这部分内容比较多且涉及到了更多c++11新特性,如果有错误之处欢迎指出。 Service创建 首先看server部分代码,main函数的结构与前面subscriber非

qq_16893195的博客 5277

ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

demo:通过ROS服务通信实现两个整型数相加求和,客户端发送两个整型数,服务端对其求和.详细描述了如何自定义输入输出数据结构文件srv和服务端客户端的代码编写

weixin_45205599的博客 1367

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4644

ROS 学习笔记 创建自定义service数据类型

自定义service数据类型 在创建好的package目录下再创建一个srv文件夹专门用于防止自定义数据类型的topic的源文件(文件名必须是srv,踩过坑了) 创建Person.srv文件(据说文件的首字母一定要大写,不大写会出问题) 可以在里面定义变量或常量 //Person.srv string name uint8 age uint8 sex uint8 unknow = 0 uint8 male = 1 uint8 female = 2 --- string result 其中- -

qq_45752760的博客 572

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程

本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。

weixin_29015483的博客 580

抽象代数学习笔记(抽象代数的历史、运算)

1. 抽象代数历史 对于五次及以上的代数方程是否存在根式解这个问题,欧拉、拉格朗日、高斯等数学家都没得到答案,但是他们得出五次及以上的代数方程组不存在根式解的结论。19世纪初,阿贝尔提出五次及以上的代数方程不存在根式解,并找出一类特殊的五次及以上的代数方程可以用根式解表示出来。另外一个年轻的数学家伽罗华...

huangzhpei的博客 3666

可以用哪些数据类型自定义ROS2消息

这篇文章着重介绍自定义ROS2类型数据时,我们可以使用哪些基础类型。这也是我之前困惑的一个问题。所以这里简单汇总说明一下。关于消息、服务和动作接口的使用说明,请查看本次推送的第一篇推文。 自定义msg示例 定义msg数据和在C++中定义一个结构体是一样的。只是类型名称有些区别。然后不需要加分号。 Header header float64 circle_x float64 circle_y float32[] ranges 自定义service数据示例 service数据包含两个部分:请求和应答。这两部分

首飞的博客 2533

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3777

ROS开发之如何使用客户端、服务端和服务数据?

笔者因研究课题涉及ROS开发,学习了古月居出品的ROS入门21讲,为巩固服务通信(用于实时通信、有一定逻辑处理的应用场景)知识,本文将ROS的客户端、服务端和服务数据三讲内容进行总结。

【cacrle】的博客 924

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2359

微信小程序 - 实现仿小红书轮播图组件功能,类似小红书笔记页面图片展示播放效果,微信小程序仿小红书幻灯片轮播支持视频播放、图片预览,自动适应图片或视频大小可左右滑动切换(小程序精美轮播图,丝滑切换)

微信小程序,轮播图组件,微信小程序仿小红书轮播图,小红书轮播图仿造,微信小程序轮播图,微信小程序幻灯片,微信小程序高仿小红书轮播图实现,小程序实现类似小红书一样的轮播图组件,轮播图插件,精致轮播图,精美丝滑流畅切换的轮播图,轮播图组件,小红薯轮播图,关于小红书的小程序不同数量的轮播图,展示不一样的轮播指示点的实现,微信小程序仿小红书图片轮播,开发微信小程序模仿小红书,高仿小红书Banner的指示器,小红书小程序笔记详情轮播图指示点的随图片数量的变化动态变化,微信小程序swiper轮播图,js轮播图,html

✅ 精选推荐文章 6927

04 ROS Client-Service-Server实例

一、客户端 Client 初始化ROS节点 创建Client实例 发布数据请求服务 等待Service反馈结果

m0_56661101的博客 791

观测器选择与工程实践建议

摘要:永磁同步电机(PMSM)无传感器控制中,观测器选型需综合考虑应用场景、性能需求与成本。消费级(家电、工具)推荐滑模观测器(SMO),成本低、鲁棒性强;工业级(伺服、泵阀)适用扩展卡尔曼滤波器(EKF),精度高但计算复杂;车规级(EPS、主驱动)需混合观测器(SMO+EKF),兼顾全速域性能与可靠性。低速时需高频注入法,IPMSM更适用。SMO易实现但存在抖振,EKF调试复杂。未来趋势是混合架构与AI增强,提升适应性与性能。选型需权衡速度范围、电机类型、处理器能力及成本。

汽车软件开发 145

ROS1.6服务端Server的编程实现

本例中通过要实现让Server发送给海龟速度的指令,client端发布request去控制Service是否要去给海龟发送指令,client端相当于海龟运动和停止的开关,当他发一个Request后海龟就运动,再发一个海龟就停止,Server端接收指令,并完成海龟运动指令的发送。

ZukunftA的博客 255

群晖、飞牛NAS容器进入终端失败?一步步教你解决Docker Bash错误!(OCI runtime exec failed: exec failed)

群晖、飞牛NAS容器进入终端失败?一步步教你解决Docker Bash错误!(OCI runtime exec failed: exec failed)

XiaoqiangClub的博客 2987

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ROS 接口(消息与服务)

1.背景 ROS应用程序通常通过以下两种类型之一的接口进行通信:消息和服务。ROS使用简化的描述语言来描述这些接口。此描述使ROS工具可以轻松地为多种目标语言中的接口类型自动生成源代码。 在本文档中,我们将介绍支持的类型以及如何创建自己的msg / srv文件。 2.消息说明规范 消息描述在ROS包中msg/目录下.msg后缀的文件中定义。 .msg文件由两部分组成:字段和常量。 2.1...

天涯的专栏 3261

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ROS通信机制

ROS中的通信机制 通信机制的分类 在ROS中比较常见的通信机制分为话题通信和服务通信,当然还有其它更多的通信方式,在这里不过多描述 话题通信 角色 发布者(Publisher) 订阅者(Subscriber) 管理者(ROS Master) 流程 发布者和订阅者会向管理者提交自身信息,自身信息包括话题名称,节点信息,地址信息等,管理者会将这些信息存入 管理者会将接收到的信息进行比对,然后把匹配到一起的发布者的地址信息发送给订阅者,订阅者可以通过此信息找到发布者进行订阅 此时发布者会发送一个TCP s

y2977509508的博客 641

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ROS基础(二):ros通讯之服务(service)机制

概念 与topic通讯机制的区别:

miya的博客 1万+

快速体验ROS通信之服务(Service)机制

快速体验ROS通信之服务(Service)机制

IT菜鸟 1675

ROS Service

ROS Service 提供了一种便捷的请求-响应通信方式,适用于低频、请求即时处理的场景。通过 .srv 文件定义请求和响应结构,Service 提供了一种标准化的同步通信机制,可用于执行特定命令或获取数据。

weixin_43414962的博客 1873

ROS2高效学习第五章 -- ros2 service 编程之自定义服务

ROS2高效学习第五章 -- ros2 service 编程之自定义服务

cy1641395022的博客 2129
上一篇: rosrun python文件 import:未找到命令
下一篇: ubuntu20.04 ros tf view_frames TypeError: cannot use a string pattern on a bytes-like object
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值