ROS节点通信(二)service和client
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的更多相关文章
- ROS学习(十三)—— 编写简单的Service和Client (C++)
一.编写Service节点 1.节点功能: 我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. 2. ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- ROS学习笔记三(理解ROS节点)
要求已经在Linux系统中安装一个学习用的ros软件包例子: sudo apt-get install ros-indigo-ros-tutorials ROS图形概念概述 nodes:节点,一个节点 ...
- ROS学习笔记二:ROS系统架构及概念
本文主要是了解ROS的系统架构.文件夹结构以及工作所需的核心文件. ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level).计算图级 ...
- ROS服务通信(C++)
ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...
- ROS学习(六)—— 理解ROS节点
一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...
- C++编写简单的Service和Client
在上一步的基础上 编写Service节点 这里,我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. ...
- ROS节点理解--5
理解 ROS节点(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程主要介绍 ROS 图(graph)概念 并讨 ...
- ROS-4 : ROS节点和主题
依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp.std_msgs.action ...
- ROS节点开机自启的方法
ROS节点开机自启的方法(Ubuntu- melodic) 一. 使用命令 sudo apt install ros-melodic-robot-upstart 安装 robot-upstart工具包 ...
随机推荐
- AtCoder Beginner Contest 185 题解
A - ABC Preparation 排序找出最小值 int main() { ios_base::sync_with_stdio(false), cin.tie(0); vector<int ...
- 前端科普系列(5):ESLint - 守住优雅的护城河
作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...
- poi 4.11版本 word模板操作
写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发 ...
- 【驱动】SPI驱动分析(二)-SPI驱动框架
SPI驱动框架 SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线.总体框架如下图所示: 从上到下,分为三层,用户空间,内核空间,和硬件层. 用户空 ...
- FGC频繁导致CPU 飙升定位及JVM配置优化总结
本文为博主原创,未经允许不得转载: 目录: 1. 定位消耗cpu 的服务进程和线程 2. 定位FGC 的原因 3. 定位jvm 参数是否导致FGC 4. 调试最优解的 jvm 配置 描述:项目中存在一 ...
- Oracle官网下载软件需要登录Oracle账户问题
问题描述 当我们在Oracle官网上下载JDK时,(JDK下载地址)系统会提示需要登录Oracle账户.对于没有Oracle账户的人来说,注册账户太繁琐. 没有账户怎么办??? 此处推荐一个靠谱的网站 ...
- css - 编写 兼容到ie7的导航
1, index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Laravel - 模板中的url
<!-- 1, url --> <a href="{{url('/')}}">跳转到主页</a> <!-- 2,action 方法 ...
- Spring——AOP练习
模仿前面的例子,完成模拟JDBC操作 1.UserDAO接口,具有insert(String name)方法,UserDAOImpl实现它 2. 用前置增强,在插入之前,完成数据库连接.事务创建工作 ...
- [转帖]银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新
银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新 如需转载请标明出处:[http://blog.csdn.net/itas109] 文章目录 银河麒麟v10下载(服务器版 桌面版) ...