ROS2与C++入门教程-创建服务(srv)文件 - 创客智造
来源: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)文件 - 创客智造相关推荐
- ROS2与C++入门教程-编写服务端和客户端 - 创客智造
来源:https://www.ncnynl.com/archives/201806/2490.html 说明: 介绍如何编写服务端和客户端 编写服务端步骤: 新建包cpp_srvcli cd ~/de ...
- ros2与Python入门教程-创建ros2包 - 创客智造
来源: https://www.ncnynl.com/archives/202008/3817.html 说明: 介绍如何创建ros2软件包 步骤: 新建ros2包 cd ~/dev_ws/src r ...
- ROS2与C++入门教程-在C++包里增加python支持
系列目录 ROS2与C++入门教程-目录 ROS2与C++入门教程-新建ros2工作空间 ROS2与C++入门教程-新建ros2包 ROS2与C++入门教程-编写订阅和发布 ROS2与C++入门教程- ...
- ROS2与C++入门教程-增加头文件
系列文章目录 ROS2与C++入门教程-目录 ROS2与C++入门教程-新建ros2工作空间 ROS2与C++入门教程-新建ros2包 ROS2与C++入门教程-编写订阅和发布 ROS2与C++入门教 ...
- ROS2与C++入门教程-目录 - 创客智造
来源: https://www.ncnynl.com/archives/201806/2486.html 说明: 介绍如何在ros2下利用c++编程 所有例子放在github里 目录: ROS2与C+ ...
- ros2与windows入门教程-windows上安装ROS2 foxy
系列文章目录 ros2与windows入门教程-windows上安装ROS2 foxy ros2与windows入门教程-控制小乌龟 ros2与windows入门教程-监听和发布话题 ros2与win ...
- ros2与Python入门教程-使用消息 - 创客智造
**ros2与Python入门教程-使用消息 ** 说明: 介绍如何python来测试消息 步骤: 如何创建消息 ,参考ROS2与C++入门教程-创建消息(msg)文件 利用python来测试消息 使 ...
- ROS2入门教程—创建ROS2功能包(C++版)
ROS2入门教程-创建ROS2功能包(C++版) 1 ROS2中的功能包 2 创建功能包 3 编译功能包 4 设置环境变量 5 运行功能包 6 功能包中的内容 7 修改package.xml文件 ...
- ROS2入门教程—创建一个简单的订阅者和发布者(C++版)
ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行 节点是通过RO ...
最新文章
- 深度残差网络 - Deep Residual Learning for Image Recognition
- 石牌村中的美好 ...
- 浏览器js 获取手机标识信息_手机软件多次要求获取手机信息,习惯性让其通过有安全隐患?...
- NET面试题:在C#中如何声明一个类不能被继承
- 安装 EoLinker_4.0 开源版
- gdiplus画直线
- uicontrol_与UIControl结合
- [6.837]A3:OpenG应用和Phong着色模型
- 转专业2017武汉大学计算机学,武大,10届考生谈谈转专业~`~
- 好好讲一讲,到底什么是Java高级架构师!
- iOS 指纹解锁 检测指纹信息变更
- 解决IIS存储空间不足的问题
- 【主题词——百合花】
- 题目1205 百万富翁问题
- 到底什么是范数?什么是0范数、1范数、2范数?区别又是什么?
- Vue.js中props的使用
- linux分区表mbr改gtp,免重装系统 手把手教你MBR转GPT分区表
- 玩转NVIDIA Jetson AGX Xavier
- 数控机床联网知识普及
- xpath-通过列表推导式和string(.)的方式获取标签下包含子标签的所有文本