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

说明:

  • 介绍如何创建服务srv文件

步骤:

  • 使用已经建好的工作空间dev_ws
  • 新建包,如果已经建好,忽略这行
cd ~/dev-ws/src
ros2 pkg create --build-type ament_cmake tutorial_interfaces
  • 新建目录mkdir srv
cd ~/dev-ws/src/tutorial_interfaces
mkdir srv
  • 增加msg定义文件
cd ~/dev-ws/src/tutorial_interfaces/srv
vim AddThreeInts.srv
  • 内容如下:
int64 a
int64 b
int64 c
---
int64 sum
  • 定义一个a b c三个输入,输出sum,都是整数
  • 编辑CMakeLists.txt,增加如下行
find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}"srv/AddThreeInts.srv")
  • 编辑package.xml,增加如下行
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
  • 编译包
cd ~/dev_ws/
colcon build --symlink-install --packages-select tutorial_interfaces
  • 接着重新加载工作空间
. install/setup.bash
  • 查询消息接口
ros2 interface show tutorial_interfaces/srv/AddThreeInts
  • 效果如下:
int64 a
int64 b
int64 c
---
int64 sum

测试:

  • 使用之前的cpp_pubsub包的发布
  • 修改服务端,进入srv目录,新建文件add_two_ints_server_srv.cpp
vim add_two_ints_server_srv.cpp
  • 内容如下:
#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"     // CHANGE#include <memory>void add(const std::shared_ptr<tutorial_interfaces::srv::AddThreeInts::Request> request,     // CHANGEstd::shared_ptr<tutorial_interfaces::srv::AddThreeInts::Response>       response)  // CHANGE
{response->sum = request->a + request->b + request->c;                                       // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld" " c: %ld",   // CHANGErequest->a, request->b, request->c);                                          // CHANGERCLCPP_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_three_ints_server");  // CHANGErclcpp::Service<tutorial_interfaces::srv::AddThreeInts>::SharedPtr service =                 // CHANGEnode->create_service<tutorial_interfaces::srv::AddThreeInts>("add_three_ints",  &add);     // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add three ints.");      // CHANGErclcpp::spin(node);rclcpp::shutdown();
}
  • 修改客户端,进入srv目录,新建文件add_two_ints_client_srv.cpp
  • 如下内容:
#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"        // CHANGE#include <chrono>
#include <cstdlib>
#include <memory>using namespace std::chrono_literals;int main(int argc, char **argv)
{rclcpp::init(argc, argv);if (argc != 4) { // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_three_ints_client X Y Z");      // CHANGEreturn 1;}std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_three_ints_client"); // CHANGErclcpp::Client<tutorial_interfaces::srv::AddThreeInts>::SharedPtr client =                        // CHANGEnode->create_client<tutorial_interfaces::srv::AddThreeInts>("add_three_ints");                  // CHANGEauto request = std::make_shared<tutorial_interfaces::srv::AddThreeInts::Request>();               // CHANGErequest->a = atoll(argv[1]);request->b = atoll(argv[2]);request->c = atoll(argv[3]);               // CHANGEwhile (!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::executor::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_three_ints");    // CHANGE}rclcpp::shutdown();return 0;
}
  • 修改CMakelist.txt 如下
 find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tutorial_interfaces REQUIRED)        # CHANGEadd_executable(server_srv src/add_two_ints_server_srv.cpp)
ament_target_dependencies(server_srvrclcpp tutorial_interfaces)                      #CHANGEadd_executable(client_srv src/add_two_ints_client_srv.cpp)
ament_target_dependencies(client_srvrclcpp tutorial_interfaces)                      #CHANGEinstall(TARGETSserver_srvclient_srvDESTINATION lib/${PROJECT_NAME})ament_package()
  • 修改package.xml 增加依赖
<depend>tutorial_interfaces</depend>
  • 编译包
colcon build --packages-select cpp_srvcli
  • 新开终端,启动服务端
ros2 run cpp_srvcli server_srv
  • 新开终端,启动客户端
ros2 run cpp_srvcli client_srv 2 3 1

ROS2与C++入门教程-创建服务(srv)文件 - 创客智造相关推荐

  1. ROS2与C++入门教程-编写服务端和客户端 - 创客智造

    来源:https://www.ncnynl.com/archives/201806/2490.html 说明: 介绍如何编写服务端和客户端 编写服务端步骤: 新建包cpp_srvcli cd ~/de ...

  2. ros2与Python入门教程-创建ros2包 - 创客智造

    来源: https://www.ncnynl.com/archives/202008/3817.html 说明: 介绍如何创建ros2软件包 步骤: 新建ros2包 cd ~/dev_ws/src r ...

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

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

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

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

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

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

  6. ros2与windows入门教程-windows上安装ROS2 foxy

    系列文章目录 ros2与windows入门教程-windows上安装ROS2 foxy ros2与windows入门教程-控制小乌龟 ros2与windows入门教程-监听和发布话题 ros2与win ...

  7. ros2与Python入门教程-使用消息 - 创客智造

    **ros2与Python入门教程-使用消息 ** 说明: 介绍如何python来测试消息 步骤: 如何创建消息 ,参考ROS2与C++入门教程-创建消息(msg)文件 利用python来测试消息 使 ...

  8. ROS2入门教程—创建ROS2功能包(C++版)

    ROS2入门教程-创建ROS2功能包(C++版) 1 ROS2中的功能包 2 创建功能包 3 编译功能包 4 设置环境变量 5 运行功能包 6 功能包中的内容 7 修改package.xml文件    ...

  9. ROS2入门教程—创建一个简单的订阅者和发布者(C++版)

    ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行   节点是通过RO ...

最新文章

  1. 深度残差网络 - Deep Residual Learning for Image Recognition
  2. 石牌村中的美好 ...
  3. 浏览器js 获取手机标识信息_手机软件多次要求获取手机信息,习惯性让其通过有安全隐患?...
  4. NET面试题:在C#中如何声明一个类不能被继承
  5. 安装 EoLinker_4.0 开源版
  6. gdiplus画直线
  7. uicontrol_与UIControl结合
  8. [6.837]A3:OpenG应用和Phong着色模型
  9. 转专业2017武汉大学计算机学,武大,10届考生谈谈转专业~`~
  10. 好好讲一讲,到底什么是Java高级架构师!
  11. iOS 指纹解锁 检测指纹信息变更
  12. 解决IIS存储空间不足的问题
  13. 【主题词——百合花】
  14. 题目1205 百万富翁问题
  15. 到底什么是范数?什么是0范数、1范数、2范数?区别又是什么?
  16. Vue.js中props的使用
  17. linux分区表mbr改gtp,免重装系统 手把手教你MBR转GPT分区表
  18. 玩转NVIDIA Jetson AGX Xavier
  19. 数控机床联网知识普及
  20. xpath-通过列表推导式和string(.)的方式获取标签下包含子标签的所有文本

热门文章

  1. (阿里云)云服务器部署网站(使用宝塔面板)
  2. 从精装到智装,下一波浪潮浮现,听听智能家居的大咖们怎么说?
  3. 7-34 青蛙过桥 (50分)
  4. python投票系统_python实时投票系统的课设
  5. 从未看过如此详细的深度学习推荐系统应用详解,读它!
  6. Windows主机异常排查方法
  7. 郭德纲最新相声:我要踢足球
  8. 百度网盘上传文件超过4G,只需一个工具即可免费上传
  9. matlab 生物信息学工具箱,Matlab生物信息学工具箱新增功能
  10. 多个网址域名的不同备案服务号解析到同一个网站