1、说明

ROS的节点通信模式有多种,本文介绍service-client模式

本文的示例功能是计算 sum=a+b-c*n

下文中功能包的创建步骤不再做详细介绍

2、创建功能包

仍然和前例使用同一个工作空间

cd ~/projrct/catkin_ws/
catkin_create_pkg test_service roscpp std_msgs message_generation

这里还是显示指定依赖,避免后期修改编译配置

3、自定义通信数据类型

和 topic 模式不同的是,topic 使用msg文件声明类型,service-client使用srv文件声明类型

cd test_service
mkdir srv && cd srv
touch TestData.srv

编辑 TestData.srv 文件,如下:

int32 a
int32 b
int32 c
int32 n
---
int64 sum

service-client既然是一问一答模式,自然就需要request和response,这里的 --- 用于区分,必不可少

这时候,可以先编译一下包,以方便后面写代码

我们可以通过 rossrv 指令来检查自定义的类型是否被ROS识别了

rossrv show test_service/TestData

如果能打印出文件内容,表示已经被识别

4、编写代码

cd ~/project/catkin_ws/src/test_service/src
touch service_node.cpp
touch client_node.cpp

service_node.cpp 代码如下:

#include "ros/ros.h"
#include "test_service/TestData.h"//自动生成的自定义类型头文件 bool calc(test_service::TestData::Request &req, test_service::TestData::Response &res)
{
res.sum = req.a + req.b - req.c * req.n;
ROS_INFO("recieve request: a=%d, b=%d, c=%d, n=%d", req.a, req.b, req.c, req.n);
ROS_INFO("send response: sum=%ld", (long int)res.sum);
return true;
} int main(int argc, char **argv)
{
ros::init(argc, argv, "server_node");//初始化ROS节点,声明节点名称
ros::NodeHandle handle;//声明一个ros节点句柄 #创建服务,并讲服务加入到ROS网络中,在ROS网路中以calc作为唯一标识,其他节点使用此唯一标识进行请求
ros::ServiceServer service = handle.advertiseService("calc", calc);
ROS_INFO("service is ready!!!");
ros::spin();
return 0;
}

client_node.cpp 代码如下:

#include "ros/ros.h"
#include "test_service/TestData.h" int main(int argc, char **argv)
{
ros::init(argc, argv, "client_node");//初始化ROS节点,并声明节点名称
ros::NodeHandle handle; //定义client,并指定需要请求的service,使用之前定义的唯一标识
ros::ServiceClient client = handle.serviceClient<test_service::TestData>("calc");
test_service::TestData testData; testData.request.a = 100;
testData.request.b = 99;
testData.request.c = 12;
testData.request.n = 2;
if (client.call(testData))//发起请求
{
ROS_INFO("sum=%ld", (long int)testData.response.sum);
}
else
{
ROS_INFO("failed to call service add_two_ints");
}
return 0;
}

5、编译配置

查看一下 CMakeLists.txt 和 package.xml 中的关键项目

5.1、CMakeLists.txt

这里之列出一些关键项目

#创建包时自动添加
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
std_msgs
) ## Generate services in the 'srv' folder
#需要手动添加,由注释可知,srv文件需要放在srv文件夹下
add_service_files(
FILES
TestData.srv
)
#创建包时自动添加,作用是自动创建自定义类型的代码文件,类型依赖std_msgs库
generate_messages(
DEPENDENCIES
std_msgs
)
#手动添加,service-client模式需要生成两个二进制文件
add_executable(${PROJECT_NAME}_service_node src/service_node.cpp)
add_dependencies(${PROJECT_NAME}_service_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_service_node
${catkin_LIBRARIES}
) add_executable(${PROJECT_NAME}_client_node src/client_node.cpp)
add_dependencies(${PROJECT_NAME}_client_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_client_node
${catkin_LIBRARIES}
)

5.2、package.xml

<?xml version="1.0"?>
<package format="2">
<name>test_service</name>
<version>0.0.0</version>
<description>The test_service package</description>
<maintainer email="eco@todo.todo">eco</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>message_generation</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>

这里有三个依赖比较关键

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

6、编译运行

编译:

catkin_make -DCATKIN_WHITELIST_PACKAGES="test_service"

开启节点管理器

roscore

运行service节点

cd ~/project/catkin_ws/
source devel/setup.bash
rosrun test_service test_service_service_node

运行client节点

cd ~/project/catkin_ws/
source devel/setup.bash
rosrun test_service test_service_client_node

运行如下:

rosrun test_service test_service_serviceode
[ INFO] [1620440457.958186943]: service is ready!!!
[ INFO] [1620440460.409754974]: recieve request: a=100, b=99, c=12, n=2
[ INFO] [1620440460.409789657]: send response: sum=175
rosrun test_service test_service_client_node
[ INFO] [1620440460.410109766]: sum=175

ROS节点通信(二)service和client的更多相关文章

  1. ROS学习(十三)—— 编写简单的Service和Client (C++)

    一.编写Service节点 1.节点功能: 我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. 2. ...

  2. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  3. ROS学习笔记三(理解ROS节点)

    要求已经在Linux系统中安装一个学习用的ros软件包例子: sudo apt-get install ros-indigo-ros-tutorials ROS图形概念概述 nodes:节点,一个节点 ...

  4. ROS学习笔记二:ROS系统架构及概念

    本文主要是了解ROS的系统架构.文件夹结构以及工作所需的核心文件. ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level).计算图级 ...

  5. ROS服务通信(C++)

    ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...

  6. ROS学习(六)—— 理解ROS节点

    一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...

  7. C++编写简单的Service和Client

    在上一步的基础上 编写Service节点 这里,我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. ...

  8. ROS节点理解--5

    理解 ROS节点(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程主要介绍 ROS 图(graph)概念 并讨 ...

  9. ROS-4 : ROS节点和主题

    依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp.std_msgs.action ...

  10. ROS节点开机自启的方法

    ROS节点开机自启的方法(Ubuntu- melodic) 一. 使用命令 sudo apt install ros-melodic-robot-upstart 安装 robot-upstart工具包 ...

随机推荐

  1. AtCoder Beginner Contest 185 题解

    A - ABC Preparation 排序找出最小值 int main() { ios_base::sync_with_stdio(false), cin.tie(0); vector<int ...

  2. 前端科普系列(5):ESLint - 守住优雅的护城河

    作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...

  3. poi 4.11版本 word模板操作

    写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发 ...

  4. 【驱动】SPI驱动分析(二)-SPI驱动框架

    SPI驱动框架 SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线.总体框架如下图所示: 从上到下,分为三层,用户空间,内核空间,和硬件层. 用户空 ...

  5. FGC频繁导致CPU 飙升定位及JVM配置优化总结

    本文为博主原创,未经允许不得转载: 目录: 1. 定位消耗cpu 的服务进程和线程 2. 定位FGC 的原因 3. 定位jvm 参数是否导致FGC 4. 调试最优解的 jvm 配置 描述:项目中存在一 ...

  6. Oracle官网下载软件需要登录Oracle账户问题

    问题描述 当我们在Oracle官网上下载JDK时,(JDK下载地址)系统会提示需要登录Oracle账户.对于没有Oracle账户的人来说,注册账户太繁琐. 没有账户怎么办??? 此处推荐一个靠谱的网站 ...

  7. css - 编写 兼容到ie7的导航

    1, index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  8. Laravel - 模板中的url

    <!-- 1, url --> <a href="{{url('/')}}">跳转到主页</a>   <!-- 2,action  方法  ...

  9. Spring——AOP练习

    模仿前面的例子,完成模拟JDBC操作 1.UserDAO接口,具有insert(String name)方法,UserDAOImpl实现它 2. 用前置增强,在插入之前,完成数据库连接.事务创建工作 ...

  10. [转帖]银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新

    银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新 如需转载请标明出处:[http://blog.csdn.net/itas109] 文章目录 银河麒麟v10下载(服务器版 桌面版) ...