创建功能包

cd ~/catkin_ws/src
catkin_create_pkg learning_communication roscpp rospy std_msgs geometry_msgs turtlesim

定义 srv 文件

cd ~/catkin_ws/src/learning_communication
mkdir srv

创建 AddTwoInts.srv 文件

cd ~/catkin_ws/src/learning_communication/srv
touch AddTwoInts.srv

AddTwoInts.srv 文件内容

int64 a
int64 b
---
int64 sum

在package.xml中添加功能包依赖

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

在CMakeLists.txt添加编译选项

find_package(catkin REQUIRED COMPONENTS............message_generation
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topicCATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)

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

配置完成后,对工程目录进行编译

cd ~/catkin_ws
catkin_make

通过以下代码去调用生成的头文件

在 src 目录下创建 两个 cpp文件

cd ~/catkin_ws/src/learning_communication/src

创建 server.cpp 文件

touch server.cpp

以下是server.cpp 文件中的内容
代码功能:将输入参数中的请求数据相加,结果放到应答变量中

#include <ros/ros.h>
#include "learning_communication/AddTwoInts.h"// service回调函数,输入参数req,输出参数res
bool add(learning_communication::AddTwoInts::Request  &req,learning_communication::AddTwoInts::Response &res)
{// 将输入参数中的请求数据相加,结果放到应答变量中res.sum = req.a + req.b;ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);ROS_INFO("sending back response: [%ld]", (long int)res.sum);return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "add_two_ints_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer service = n.advertiseService("/add_two_ints", add);// 循环等待回调函数ROS_INFO("Ready to add two ints.");ros::spin();return 0;
}

创建 client.cpp 文件

touch client.cpp

client.cpp 文件中的内容
代码功能:发布service请求,等待加法运算的应答结果

#include <cstdlib>
#include <ros/ros.h>
#include "learning_communication/AddTwoInts.h"int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "add_two_ints_client");// 从终端命令行获取两个加数if (argc != 3){ROS_INFO("usage: add_two_ints_client X Y");return 1;}// 创建节点句柄ros::NodeHandle n;// 创建一个client,请求add_two_int service, service消息类型是 learning_communication::AddTwoIntsros::ServiceClient client = n.serviceClient<learning_communication::AddTwoInts>("add_two_ints");// 创建learning_communication::AddTwoInts类型的service消息learning_communication::AddTwoInts srv;srv.request.a = atoll(argv[1]);srv.request.b = atoll(argv[2]);// 发布service请求,等待加法运算的应答结果if (client.call(srv)){ROS_INFO("Sum: %ld", (long int)srv.response.sum);}else{ROS_ERROR("Failed to call service add_two_ints");return 1;}return 0;
};

在CMakeLists.txt文件中添加以下代码:

add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server ${PROJECT_NAME}_gencpp)add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client ${PROJECT_NAME}_gencpp)

编译工程项目

cd ~/catkin_ws
catkin_make

启动ROS Master

roscore

启动自定义的订阅者节点

rosrun learning_communication server

启动自定义的发布者节点

rosrun learning_communication client 7 8

Client启动后发布服务请求,并成功接收到反馈结果。

Server接收到服务调用后完成加法求解,并将结果反馈给Client。

ROS系统 通过服务编程实现两个数相加并返回相关推荐

  1. python怎么设编程两个数相加时_黄哥Python, LeetCode 第二题两数相加代码

    来源力扣​leetcode-cn.com 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相 ...

  2. 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  3. 求数组最大数,该数为数组中某两个数相加

    题目: 百度笔试:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素. 思想: 首先,我们将数组从小到大进行快速排序.其次: 1.将最后一个数设为最大数设定为S: 2.用 ...

  4. 在O(N)时间内求解 正数数组中 两个数相加的 最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...

  5. 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...

    [002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...

  6. mysql 两个数相加_LeetCode 01两数之和02两数相加

    LeetCode01两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  7. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...

  8. CUDA学习(三)之使用GPU进行两个数相加

    在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示 #include "cuda_runtime.h" #include "dev ...

  9. python每个数都可由集合中的某两个数相加而得

    python每个数都可由集合中的某两个数相加而得(这两个数可以相同) 问题表述 思路 代码 运行结果 问题表述 有一个自然数集合,其中最小的数是1,最大的数是100.这个集合中的数除了1之外,每个数都 ...

最新文章

  1. 微信小程序日期相减得出天数
  2. 告别AI模型黑盒子:可解释性将是数据科学的下一个“超能力”
  3. vscode使用markdown语言编写文本
  4. 小冰和她的兄弟姐妹们组团出道:唱歌跳舞写文章样样都会,而且都开放版权...
  5. python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库
  6. 计算机基础知识与基本操作文档,计算机基础知识与基本操作——图文混排课件...
  7. 华为防火墙USG多出口网络场景是如何排除故障的
  8. SQL 2005 收缩事务日志文件
  9. n个结点,不同形态的二叉树(数目+生成)
  10. 在ASP.NET使用javascript的一点小技巧(转www.chinacs.net 中文C#技术站 )
  11. 解决Python shell中Delete-Backspace键乱码问题
  12. java.lang.NoClassDefFoundError:
  13. Python正则表达式常用flag含义与用法详解
  14. 远程开启admin$共享(远程管理需开启如dameware软件)
  15. Verilog代码实例化的简单理解(以38译码器为例)
  16. C++基础:第八章 深入IO
  17. 29. Element ownerDocument 属性
  18. Mybatis mapper.xml中常用标签详解
  19. java控制结构_Java 控制结构与方法
  20. Java游戏开发 —— 扫雷

热门文章

  1. 【Linux shell】sed实践(2)
  2. 高性能服务器架构(二):缓存清理策略
  3. [机器学习]机器学习笔记整理12-线性回归概念理解
  4. 如何用Jmeter做压力测试
  5. IO之流程与buffer概览
  6. spring --(12)bean的生命周期
  7. UITableView样式和UITableViewCell样式
  8. OpenCascade Primitives BRep-Cylinder
  9. 银光甘特图/日历图/排程控件GTP.NET for Silverlight介绍及正版下载
  10. Lync 2013部署(1)—AD准备