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工具包 ...
随机推荐
- Eight HDU - 1043 (反向搜索 + 康拓展开 / A* + BFS / IDA* )
题目描述 简单介绍一下八数码问题: 在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的,你可以移动数字,比如可以将数字 ...
- 【调试】kdump原理及其使用方法
kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...
- Ribbon默认负载均衡规则替换为NacosRule
近期博主在参与一个 Spring Cloud 搭建,版本为 Hoxton.SR12,服务注册发现组件为 Nacos 的老项目时,发现项目负载均衡组件 Ribbon 的负载均衡规则在某些场景下不够完美, ...
- hdu 5234
题意:求在不超过k的情况下,最多可以得到多少价值. 三维dp,结合01背包,第三维就是用来保存在不同的背包容量下能得到的最大价值,也就是第三维有很多状态. #include<iostream&g ...
- Kubernetes APIServer 最佳实践
1. kubernetes 整体架构 kubernetes 由 master 节点和工作节点组成.其中,master 节点的组件有 APIServer,scheduler 和 controller-m ...
- 【滤波】Kalman Filter
from: 卡尔曼滤波教程 (kalmanfilter.net) 总览 关于本教程 关于作者 关于卡尔曼滤波 为什么需要预测算法 卡尔曼滤波简介 必要的背景知识 均值和期望 方差和标准差 正态分布 随 ...
- 【收集】Tool
序 链接 备注 1 WinMerge - You will see the difference- 开源windows比对工具 2 AykutSarac/jsoncrack.com: Seamless ...
- Laravel - Could not open input file: artisan 的解决方法
cd 到 laravel的目录中执行 就可以了
- [转帖]美国出口管制第六番 ECCN编码的藏宝图之旅
https://zhuanlan.zhihu.com/p/585040344 哈喽大家好,这里是大话合规 一旦明确物项受EAR管制(大前提) 下一步就是对物项进行编码 @#¥%&* 这篇文章蜗 ...
- [转帖]A Quick Look at the Huawei HiSilicon Kunpeng 920 Arm Server CPU
https://www.servethehome.com/a-quick-look-huawei-hisilicon-kunpeng-920-arm-server-cpu/ Huawei Hi ...