ROS2 入门应用 引用自定义服务(C++)
创始人
2025-05-30 02:46:05
0

ROS2 入门应用 引用自定义服务(C++)

  • 1. 查看自定义服务
  • 2. 修改服务应答
  • 3. 修改服务请求
  • 4. 修改依赖关系
  • 5. 修改编译信息
  • 6. 编译和运行


1. 查看自定义服务

引用在《ROS2 入门应用 创建自定义接口》中自定义的服务AddThreeInts.srv

ros2 interface show tutorial_interfaces/srv/AddThreeInts# int64 a
# int64 b
# int64 c
# ---
# int64 sum

需要对《ROS2 入门应用 请求和应答(C++)》中创建的服务端/客户端功能包稍作修改

cd ~/ros2_ws/src/cpp_srvcli/src

将把两个整数求和更改为三个整数求和


2. 修改服务应答

修改add_two_ints_server.cpp服务端源文件,涉及服务类型变更和应用变化

#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"  // CHANGE#include /* 求和函数 */
void add(const std::shared_ptr request,  // CHANGEstd::shared_ptr response)     // CHANGE
{/* 从请求中添加两个整数,并将总和提供给响应 */response->sum = request->a + request->b + request->c;  // CHANGE/* 使用日志通知控制台其服务状态 */RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld" " c: %ld", request->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)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 定义服务端节点add_three_ints_server */std::shared_ptr node = rclcpp::Node::make_shared("add_three_ints_server");  // CHANGE/* 创建服务名为add_three_ints,服务函数为add的service服务端 */rclcpp::Service::SharedPtr service =             // CHANGEnode->create_service("add_three_ints", &add);  // CHANGE/* 通知准备就绪 */RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add three ints.");  // CHANGE/* 运行节点 */rclcpp::spin(node);/* 退出ROS2 */rclcpp::shutdown();
}

3. 修改服务请求

修改add_two_ints_client.cpp客户端源文件,涉及服务类型变更和应用变化

#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"  // CHANGE#include 
#include 
#include /* 方便表示时间 */
using namespace std::chrono_literals;int main(int argc, char **argv)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 校验 */if (argc != 4) {                                                                      // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_three_ints_client X Y Z");  // CHANGEreturn 1;}/* 定义客户端节点add_three_ints_client*/std::shared_ptr node = rclcpp::Node::make_shared("add_three_ints_client");  // CHANGE/* 创建服务名为add_three_ints的client客户端 */rclcpp::Client::SharedPtr client =      // CHANGEnode->create_client("add_three_ints");  // CHANGE/* 创建请求request */auto request = std::make_shared();  // CHANGErequest->a = atoll(argv[1]);request->b = atoll(argv[2]);request->c = atoll(argv[3]);  // CHANGE/* 搜索服务节点,间隔1s */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_three_ints");  // CHANGE}/* 退出ROS2 */rclcpp::shutdown();return 0;
}

4. 修改依赖关系

package.xml清单文件中,添加对自定义服务的依赖项的声明

tutorial_interfaces

5. 修改编译信息

CMakeLists.txt编译文件中

  1. 更换搜索库 tutorial_interfaces
  2. 更换可执行文件目标依赖关系 tutorial_interfaces
#...find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tutorial_interfaces REQUIRED)                    # CHANGEadd_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp tutorial_interfaces)  # CHANGEadd_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client rclcpp tutorial_interfaces)  # CHANGEinstall(TARGETSserverclientDESTINATION lib/${PROJECT_NAME})ament_package()

6. 编译和运行

进入工作空间根目录

cd ~/ros2_ws

编译:

colcon build --packages-select cpp_srvcli

打开一个新终端,运行服务端节点:

ros2 run cpp_srvcli server# [INFO] [rclcpp]: Ready to add three ints.

打开一个新终端,运行客户端节点:

ros2 run cpp_srvcli client 1 2 3# [INFO] [rclcpp]: Sum: 6

谢谢

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...