来源:https://www.ncnynl.com/archives/201806/2490.html

说明:

  • 介绍如何编写服务端和客户端

编写服务端步骤:

  • 新建包cpp_srvcli
cd ~/dev_ws/src
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces
  • 依赖example_interfaces包,将会使用到example_interfaces的srv文件
  • 进入srv目录,新建文件add_two_ints_server.cpp
vim add_two_ints_server.cpp
  • 内容如下:
#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"#include <memory>void add(const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,std::shared_ptr<example_interfaces::srv::AddTwoInts::Response>      response)
{response->sum = request->a + request->b;RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld",request->a, request->b);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
}int main(int argc, char **argv)
{rclcpp::init(argc, argv);std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server");rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service =node->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", &add);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints.");rclcpp::spin(node);rclcpp::shutdown();
}
  • 修改CMakeLists.txt,增加如下行:
add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server
rclcpp example_interfaces)install(TARGETSserverDESTINATION lib/${PROJECT_NAME})

编写客户端步骤:

  • 进入srv目录,新建文件add_two_ints_client.cpp
  • 如下内容:
#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"#include <chrono>
#include <cstdlib>
#include <memory>using namespace std::chrono_literals;int main(int argc, char **argv)
{rclcpp::init(argc, argv);if (argc != 3) {RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y");return 1;}std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_client");rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client =node->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = atoll(argv[1]);request->b = atoll(argv[2]);while (!client->wait_for_service(1s)) {if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return 0;}RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}auto result = client->async_send_request(request);// Wait for the result.if (rclcpp::spin_until_future_complete(node, result) ==rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);} else {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_two_ints");}rclcpp::shutdown();return 0;
}
  • 编辑CMakeLists.txt,内容如下:
cmake_minimum_required(VERSION 3.5)
project(cpp_srvcli)find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(example_interfaces REQUIRED)add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(serverrclcpp example_interfaces)add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(clientrclcpp example_interfaces)install(TARGETSserverclientDESTINATION lib/${PROJECT_NAME})ament_package()

编译包:

  • 安装依赖包
rosdep install -i --from-path src --rosdistro <distro> -y
  • 编译
colcon build --packages-select cpp_srvcli

测试:

  • 新开终端,启动服务端
cd ~/dev_ws/
. install/setup.bash
ros2 run cpp_srvcli server
  • 效果如下:
[INFO] [rclcpp]: Ready to add two ints.
[INFO] [rclcpp]: Incoming request
a: 2 b: 3
[INFO] [rclcpp]: sending back response: [5]
  • 新开终端,启动客户端
cd ~/dev_ws/
. install/setup.bash
ros2 run cpp_srvcli client 2 3
  • 效果如下:
[INFO] [rclcpp]: Sum: 5

ROS2与C++入门教程-编写服务端和客户端 - 创客智造相关推荐

  1. ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)

    ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点-python版本 rosed msg和srv 创建msg 使用rosmsg 创建srv 使用rossrv 重新make一下软 ...

  2. ROS2与C++入门教程-创建服务(srv)文件 - 创客智造

    来源:https://www.ncnynl.com/archives/201806/2492.html 说明: 介绍如何创建服务srv文件 步骤: 使用已经建好的工作空间dev_ws 新建包,如果已经 ...

  3. WebService入门教程(服务端发布WebService)

    本篇内容过多,时间紧迫的朋友可以通过目录快速筛选自己想要看的内容,本人接触webservice也没多久,也处于学习阶段,如果有错误请指正,如果已经是大神请略过这篇文章,这篇文章不涉及webservic ...

  4. ROS2与C++入门教程-在C++包里增加python支持

    系列目录 ROS2与C++入门教程-目录 ROS2与C++入门教程-新建ros2工作空间 ROS2与C++入门教程-新建ros2包 ROS2与C++入门教程-编写订阅和发布 ROS2与C++入门教程- ...

  5. ROS2与C++入门教程-增加头文件

    系列文章目录 ROS2与C++入门教程-目录 ROS2与C++入门教程-新建ros2工作空间 ROS2与C++入门教程-新建ros2包 ROS2与C++入门教程-编写订阅和发布 ROS2与C++入门教 ...

  6. ROS2与C++入门教程-目录 - 创客智造

    来源: https://www.ncnynl.com/archives/201806/2486.html 说明: 介绍如何在ros2下利用c++编程 所有例子放在github里 目录: ROS2与C+ ...

  7. SSO单点登录教程(四)自己动手写SSO单点登录服务端和客户端

    作者:蓝雄威,叩丁狼教育高级讲师.原创文章,转载请注明出处. 一.前言 我们自己动手写单点登录的服务端目的是为了加深对单点登录的理解.如果你们公司想实现单点登录/单点注销功能,推荐使用开源的单点登录框 ...

  8. NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    2019独角兽企业重金招聘Python工程师标准>>> 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目 ...

  9. 手游虚拟机服务器,手游大话西游虚拟机镜像一键服务端+配套客户端+启动教程+GM后台...

    手游大话西游虚拟机镜像一键服务端+配套客户端+启动教程+GM后台 资源说明: 1.本资源默认网络模式为NAT模式,服务端镜像IP192.168.200.9 2.虚拟机网络设置,依次点击"编辑 ...

最新文章

  1. 惠普硬盘安装linux,hp台式电脑原本是linux系统,如何安装win7系统
  2. 一个简单的jQuery例子,动态添加表格和删除
  3. python24点4张扑克_Python实现扑克24点小游戏 ,从此我就没输过
  4. 用libconfig读取配置文件
  5. 数据缺失,如何智能修复?第一名方案源码分享
  6. Unity 着色过程
  7. 手把手教你如何扩展GridView之个性分页
  8. IE兼容性问题web.config设置
  9. origin 2018安装教程与安装包
  10. 职业定位测试/职业能力倾向测试
  11. 环球黑卡可以透支吗?环球黑卡是信用卡吗
  12. 易车与汽车之家俩大巨头对决
  13. 响应式与自适应设计:设计师的最佳选择是什么?
  14. iOS双重验证设备无法接收验证码,更新手机号。
  15. 系统重启后 sda sdb顺序变化 pv vg lv dm
  16. select t.* , t.rowid from-对查询出来的sql语句进行编辑
  17. 软件测试自学摄影审美,APP测评 | 朋友圈那些好看的照片都是怎么来的??
  18. 马云:我说了很久的DT时代,你们明白了吗?
  19. 如何使用条件格式在 Excel 中隔行加底纹
  20. C++ 小游戏 视频及资料集(八)

热门文章

  1. 英语基础语法-简单句的核心构成(谓语动词的分类)
  2. 基于华为的IP Sec
  3. 3D打印应用领域有哪些
  4. 用WCAT进行IIS压力测试 (转贴)
  5. Linux网络文件共享服务(一)存储类型和文件传输协议FTP
  6. 春节“恐归”,你怕的到底是什么?
  7. 深大uooc大学生心理健康章节答案第七章
  8. 【Linux】Linux命令英文全称解释
  9. jmx_exporter 配置详解
  10. origin软件干嘛用的