当前位置: 首页 > news >正文

《ROS1学习笔记8——自定义服务素材》

《ROS1学习笔记8——自定义服务素材》

文章目录

  • 1、前言
  • 2、自定义消息接口
    • 2.1、新建功能包
    • 2.2、自定义消息接口
      • 2.2.1、新建srv
      • 2.2.1、在package.xml添加依赖
      • 2.2.3、修改CMakeLists
    • 2.3、编译
  • 3、编写程序
    • 3.1、客户端(client)
    • 3.2、服务端(server)
    • 3.3、配置CMakeLists
  • 4、编译运行
    • 4.1、编译
    • 4.2、运行

1、前言

在这一节我们要自定义服务通信接口,来实现服务通信。

这里以鱼香ROS老师给的例子解释一下。可能会更好理解:

总体的逻辑就是客服端发布指令让服务端给乌龟个速度,这部分是service ,服务端收到命令后给乌龟发布topic让乌龟动起来,这节就是service和topic都有
在这里插入图片描述
我们后面编写的程序只涉及到客户端与服务端之间的通信,并没有加入话题。

2、自定义消息接口

2.1、新建功能包

cd src
catkin_create_pkg demo_service roscpp rospy std_msgs geometry_msgs turtlesim

2.2、自定义消息接口

2.2.1、新建srv

在功能包目录下,新建srv文件夹,并在srv目录下新建Person.srv文件(使用驼峰命名法,文件首字母大写)

string name
uint8 age
uint8 sex
uint8 unkown = 0
uint8 male = 1
uint8 female =2
---
string result

—上面是请求消息,横线下面是响应消息
在这里插入图片描述

2.2.1、在package.xml添加依赖

添加下面两行配置代码:

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

message_genaation是编译依赖
message_runtime是运行依赖
在这里插入图片描述

2.2.3、修改CMakeLists

需要更改find_packagecatkin_package

将message_genaration添加进去。
在这里插入图片描述

将message_runtime添加进去

在这里插入图片描述

1、find_package(catkin REQUIRED COMPONENTS …)
核心作用:声明编译当前包时需要的依赖包

2、catkin_package(…)
核心作用:声明当前包被其他包依赖时,对方需要的信息(包括运行时依赖、头文件路径、库文件等)。其中 CATKIN_DEPENDS 明确指定了运行时依赖(当前包运行时需要的包,以及依赖当前包的其他包在编译 / 运行时也需要的包)。

通俗总结:

  • find_package 是 “我编译时需要什么”(给当前包的编译过程用)。
  • catkin_package 是 “别人用我时需要什么”(给依赖当前包的其他包用,同时也隐含了当前包运行时的需求)。

3、添加一个配置项,用于将自己新建的.msg文件编译成其他的文件

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

如下图位置所示,并且在上面也有相应的注释说明

在这里插入图片描述

generate_messages(DEPENDENCIES std_msgs)
触发消息生成过程:ROS 会根据 add_message_files 声明的 .msg 文件,自动生成对应语言(C++、Python 等)的代码(如头文件、类定义),供你的程序调用。

DEPENDENCIES std_msgs
表示当前自定义消息依赖于 std_msgs 包中的基础消息类型,如刚用到的uint8等

2.3、编译

回到工作空间目录下,进行编译

cd..
catkin_make

编译成功后,devel/include/[pkg_name]目录下会出现下列该头文件
后续在编写代码中直接引用Person.h即可。
在这里插入图片描述

3、编写程序

在src目录下新建客户端和服务端代码
在这里插入图片描述

3.1、客户端(client)

实现思路:

#include <ros/ros.h>#include "demo_service/Person.h"int main(int argc, char** argv){//初始化节点ros::init(argc, argv, "person_client");//创建节点句柄ros::NodeHandle node;//发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service//<demo_service::Person>数据类型ros::service::waitForService("/show_person");ros::ServiceClient person_client = node.serviceClient<demo_service::Person>("/show_person");//初始化demo_service::Person的请求报告demo_service::Person srv;srv.request.name = "Tom";srv.request.age = 20;srv.request.sex = demo_service::Person::Request::male;//请求服务调用ROS_INFO("Call service to show[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;}

3.2、服务端(server)

实现思路

  • 初始化ROS节点
  • 创建一个Server实例
  • 循环等待服务请求,进入回调函数
  • 在回调函数中完成服务功能的处理,并反馈应答数据
#include <ros/ros.h>#include "demo_service/Person.h"//service回调函数,输入参数req, 输出参数resbool personCallback(demo_service::Person::Request &req,demo_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节点初始化ros::init(argc, argv, "person_server");//创建节点句柄ros::NodeHandle node;//创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer person_service = node.advertiseService("/show_person", personCallback);//循环等待回调函数ROS_INFO("Ready to show person informtion.");ros::spin();return 0;}

3.3、配置CMakeLists

在CMakeLists中添加如下代码

add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_generate_messages_cpp)

在这里插入图片描述

4、编译运行

4.1、编译

catkin_make

编译成功后,devel/lib目录下出现可执行文件
在这里插入图片描述

4.2、运行

这里我们打开三个终端:

终端1:运行roscore

终端2:
1、改变环境变量

source devel/setup.bash

2、运行服务端

rosrun demo_service person_server

如图:此时,服务端已经成功运行起来了,并且在等待客户端发布命令
在这里插入图片描述

终端3:
1、改变环境变量

source devel/setup.bash

2、运行客服端

rosrun demo_service person_client

在这里插入图片描述
运行客户端之后,
客户端成功向服务端发送了消息
并且服务端接收到了消息,并向客户端有所反馈。

并且还有一点就是,客户端这边不会一直发送数据,只有运行一次相应程序才会发送一次数据,然后服务端相应接收到一次数据。

http://www.jsqmd.com/news/53210/

相关文章:

  • 实用指南:逻辑回归(Logistic Regression)
  • CTIP 与 3D-IC 堆栈热行为仿真实践
  • Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)
  • 浮点数定点表示(Q格式)
  • TPS的另外一层含义:绝对并发用户数 - BKY007
  • P10547 [THUPC 2024 决赛] 排列游戏
  • NeurlPS 2025!多伦多大学TIRE助力3D/4D 生成精准保留主体身份
  • 笔记——OI中求逆元的几种方式(不含数学知识的讲解)
  • 2025国内公关公司排名推荐(整合权威数据源):十大机构深度对比,专业分析与选择指南
  • SpringBoot集成LangChain4j快速开发AI应用(调用阿里云Api) - 实践
  • 中美大数据产业的十年分岔路 - 智慧园区
  • acme证书申请
  • 【论文精读】DreamVideo:定制化主体与动作的视频生成技能
  • NOIP模拟赛11.27
  • Open WebUI大模型输出完成后新对话响应延迟、输出变慢问题
  • 2025年11月掘进机位移传感器,拦焦车位移传感器,推焦车位移传感器厂家最新推荐,焦化设备适配测评
  • 2025年11月辊缝位移传感器,切纸位移传感器,水坝闸门液压位移传感器厂家最新推荐,水利与造纸适配测评
  • 2025年11月起重机位移传感器,挖掘机位移传感器,压路机位移传感器厂家最新推荐,工程机械性能测评
  • Java大厂面试真题:Spring Boot微服务+Kafka消息队列+AIGC场景实战问答全解析 - 指南
  • 从被动审查到主动风控:文档抽取技术驱动合同管理范式转移
  • Python中isdigit、isdecimal、isnumeric区别详解
  • 2025年11月GEO公司推荐:全链路破局企业流量困境,AI驱动搜索优化实力全解析
  • CH584/CH585NFC调试相关
  • 租房买房必看2租房切忌“暗室”!这种房子阴气重、易生病,白送都别住!
  • 人工智能之数据分析 Matplotlib:第二章 Pyplot
  • 医疗器械渠道管理革新:数字化平台如何解决行业痛点
  • 性能验证问题汇总
  • 如何在VSCode中Debug(带有参数,name、program、$file、args、pickArgs、指定虚拟环境)
  • 深入解析:Android Cursor AI实践技巧
  • 适合应届生:零经验专业简历模板TOP4