ROS系统 通过服务编程实现两个数相加并返回
创建功能包
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系统 通过服务编程实现两个数相加并返回相关推荐
- python怎么设编程两个数相加时_黄哥Python, LeetCode 第二题两数相加代码
来源力扣leetcode-cn.com 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相 ...
- 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 求数组最大数,该数为数组中某两个数相加
题目: 百度笔试:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素. 思想: 首先,我们将数组从小到大进行快速排序.其次: 1.将最后一个数设为最大数设定为S: 2.用 ...
- 在O(N)时间内求解 正数数组中 两个数相加的 最大值
一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...
[002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...
- mysql 两个数相加_LeetCode 01两数之和02两数相加
LeetCode01两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...
- CUDA学习(三)之使用GPU进行两个数相加
在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示 #include "cuda_runtime.h" #include "dev ...
- python每个数都可由集合中的某两个数相加而得
python每个数都可由集合中的某两个数相加而得(这两个数可以相同) 问题表述 思路 代码 运行结果 问题表述 有一个自然数集合,其中最小的数是1,最大的数是100.这个集合中的数除了1之外,每个数都 ...
最新文章
- 微信小程序日期相减得出天数
- 告别AI模型黑盒子:可解释性将是数据科学的下一个“超能力”
- vscode使用markdown语言编写文本
- 小冰和她的兄弟姐妹们组团出道:唱歌跳舞写文章样样都会,而且都开放版权...
- python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库
- 计算机基础知识与基本操作文档,计算机基础知识与基本操作——图文混排课件...
- 华为防火墙USG多出口网络场景是如何排除故障的
- SQL 2005 收缩事务日志文件
- n个结点,不同形态的二叉树(数目+生成)
- 在ASP.NET使用javascript的一点小技巧(转www.chinacs.net 中文C#技术站 )
- 解决Python shell中Delete-Backspace键乱码问题
- java.lang.NoClassDefFoundError:
- Python正则表达式常用flag含义与用法详解
- 远程开启admin$共享(远程管理需开启如dameware软件)
- Verilog代码实例化的简单理解(以38译码器为例)
- C++基础:第八章 深入IO
- 29. Element ownerDocument 属性
- Mybatis mapper.xml中常用标签详解
- java控制结构_Java 控制结构与方法
- Java游戏开发 —— 扫雷