catkin\_ws工作空间下的功能包learning\_communication下继续实现通信编程,请参考上节-话题编程

一、服务通讯模型

二、服务编程实现

注:实现加法listener发布两个数给talker,talker相加后给listener

1. 自定义服务文件srv

a、在learning\_communication下创建srv目录,在srv目录下创建AddTwoInts.srv文件

int64 a
int64 b
---
int64 sum

b、在learning\_communication的package.xml中添加功能包依赖

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

c、在learning\_communication的CMakeLists.txt中添加编译选项

# 如果之前完成过话题编程,此函数已经存在无需编写
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation)
# 如果之前完成过话题编程,此函数已经存在无需编写
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_communicationCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
add_service_files(FILES AddTwoInts.srv)
generate_messages(DEPENDENCIES std_msgs)

d、编译
catkin\_ws工作空间下生成可执行文件:catkin_make

2. 创建服务器

a、在~/catkin_ws/src/learning_communicaton/src目录下创建server.cpp文件:
b、server.cpp文件代码如下:

/*
AddTwoInts Server
*/#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)
{//1,ROS节点初始化ros::init(argc, argv, "add_two_ints_server");//2. 创建节点句柄ros::NodeHandle n;//3. 创建一个名为add_two_ints的server,注册回调函数add()ros::ServiceServer service = n.advertiseService("add_two_ints", add);//4. 循环等待回调函数ROS_INFO("Ready to add two ints.");ros::spin();return 0;
}

3. 创建客户端

a、在~/catkin_ws/src/learning_communicaton/src目录下创建client.cpp文件:
b、client.cpp文件代码如下:

/*
AddTwoInts Client
*/#include <cstdlib>
#include "ros/ros.h"
#include "learning_communication/AddTwoInts.h"int main(int argc, char **argv)
{//1. Ros节点初始化ros::init(argc, argv, "add_two_ints_client");//从终端命令行获取两个加数if (argc != 3){ROS_INFO("usage: add_two_ints_client X Y");return 1;}//2. 创建节点句柄ros::NodeHandle n;//创建一个client,请求add_two_int service,service消息类型是learning_communication::AddTwoIntsros::ServiceClient client = n.serviceClient<learning_communication::AddTwoInts>("add_two_ints");//3. 创建learning_communication::AddTwoInts类型的service消息learning_communication::AddTwoInts srv;srv.request.a = atoll(argv[1]);srv.request.b = atoll(argv[2]);//4. 发布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;
}

4. 添加编译选项

  1. 打开learning\_communication功能包中的 CMakeLists.txt 文件,添加如下代码:
add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server ${PROJRCT_NAME}_gencpp)add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client ${PROJRCT_NAME}_gencpp)
  1. 生成:在catkin\_ws工作空间下生成可执行文件: catkin_make

这里有一个需要注意的点:如果catkin_make时提示找不到AddTwoInts.h文件,这是因为在2.创建服务器和3.客户端之前,进行1.自定义服务时需要编译一次!!才能生产.h文件; 因此确保在执行此次编译之前,已经完成自定义服务时的编译,如果没有编译,把刚才添加在CMakeLists.txt文件中有关服务器和客户端的内容删除,再保存编译,编译成功后再输入。

5. 运行可执行文件

注意每次打开新终端添加环境变量:(需要手动添加的话)source ~/catkin_ws/devel/setup.bash

  • 启动ROS Master-------新打开终端: roscore

  • 启动server -----------新打开终端:rosrun learning_communication server

  • 启动client ----------------新打开终端:rosrun learning_communication client 3 4

参考

  1. 深蓝学院《机器人操作系统ROS理论与实践》
  2. 借鉴 https://blog.csdn.net/weixin_44264994/article/details/105271884,如有侵权,请联系删除。

机器人操作系统ROS(5)服务编程相关推荐

  1. 机器人操作系统ROS(6)动作编程

    注:在 catkin\_ws 工作空间下的功能包earning\_communication 下继续实现通信编程,参考上节-服务编程 一.动作通讯模型 二.动作编程实现 1. 自定义动作文件actio ...

  2. 机器人操作系统ROS 编程开发--详细总结

    最近工作涉及到自动驾驶的,需要学习ROS,学习中总结了一些知识点,分享给大家. ROS基本介绍 机器人操作系统ROS,是一种分布式处理框架(又名Nodes),ROS常用C++和python编程语言开发 ...

  3. 机器人操作系统ROS(4)话题编程

    此节的前提是已经创建好工作空间,请参考 工作空间 一.话题通讯模型 二.话题编程实现 1. 实现发布者(Talker) a.在~/catkin_ws/src/learning_communicaton ...

  4. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会

    本书是针对机器人操作系统(ROS)初学者的入门教程,从基础的如何安装ROS,到ROS的框架介绍和C/C++.Python编程基础概念介绍,直至完整搭建一个机器人项目,每一个部分都有详细的操作过程和相应 ...

  5. 关于机器人操作系统(ROS)学习前须知二三

    ROS基础资料 1.什么是ROS? ROS(机器人操作系统,Robot Operating System),是专为机器人软体开发所设计出来的一套电脑作业系统架构.它是一个开源的元级操作系统(后操作系统 ...

  6. 机器人操作系统ROS(1)

    ROS总体设计 ROS五个特点 点对点设计 一个使用ROS的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系,如图2所示.虽然基于中心服务器的那些软件框架也 ...

  7. 《机器人操作系统ROS原理与应用》——1.3 智能机器人的分类

    本节书摘来自华章出版社<机器人操作系统ROS原理与应用>一 书中的第1章,第1.3节,作者:周兴社 杨刚 王岚,更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...

  8. 一文读懂自动驾驶中的机器人操作系统ROS

    一.什么是机器人操作系统ROS 1.ROS(Robot Operating System)是一个操作系统 ROS是对机器人的硬件进行了封装,不同的机器人.不同的传感器,在ROS里可以用相同的方式表示( ...

  9. 从零打造一个机器人002【初识机器人操作系统--ROS】

    从零打造一个机器人002[初识机器人操作系统–ROS] 1.ROS是什么 ROS是一个适用于机器人的开源的元操作系统.其实它并不是一个真正的操作系统,其底层的任务调度.编译.寻址等任务还是由Linux ...

最新文章

  1. Table Controls in ABAP Programs
  2. css first-child,CSS :first-child 伪类
  3. 合集| 21 篇技术文章,带你从零入门 K8s
  4. android app 提高级别,android 关于提高第三方app的service优先级
  5. Centos源码安装Python3
  6. linux切大文件为小文件,linux系统下分割大文件的方法
  7. BS7799信息安全管理体系介绍(转载)
  8. 新版bscroll轮播图无缝切换
  9. C++ Opencv 安装配置
  10. cookie的保存 jq,如何使用jQuery读取Cookie并将其存储在变量中?
  11. [从源码学设计]蚂蚁金服SOFARegistry之服务上线
  12. UG NX 工程图视图概述
  13. Between Us 3 人类的进化
  14. Android 10.0 Launcher3 抽屉式(双层)app列表排序
  15. 随着人工智能发展的少儿编程教育
  16. 股民误将向日葵当成农业股
  17. 申请著作权的流程有哪些
  18. php实现狼和兔子,兔子和狼作文4篇
  19. 【数据结构】-顺序栈(初始化栈顶指针为0)
  20. 在linux中at 调度出错,Linux 技巧: 用cron 和at 调度作业

热门文章

  1. 厉害了我的国量子计算机视频,厉害了我的国,超越早期经典计算机的光量子计算机诞生...
  2. 坚果云(创建 删除 下载 上传)代码,基于autojs开发的脚本
  3. mybatis生成mysql代码_如何让 Mybatis 自动生成代码,提高开发效率
  4. linux如何清除系统日志,如何清除Linux系统日志
  5. win10更新后 chrome内核浏览器打开网页一直加载,显示正在创建安全连接 甚至打不开 解决方法
  6. C++:to_string与stoi函数
  7. php+微信小程序大学跳蚤市场的微信小程序设计与实现毕业设计源码261620
  8. Meta Learning(元学习)详解
  9. 发动机ECU标定的基本知识
  10. SAPLPD已停止工作