news 2026/5/1 10:31:52

ROS2的:服务的demo代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS2的:服务的demo代码

1、创建目录、工具包

# 创建文件夹:工作空间、srcmkdir-p ros2_ws/src# 进入 srccdros2_ws/src# src 目录下:创建功能包ros2 pkg create demo_cpp_service --build-type ament_cmake --dependencies rclcpp std_msgs

2、创建srv文件:服务接口定义

# src目录下:创建 srv 目录mkdir-p demo_cpp_service/srv# src目录下:创建 .srv 服务文件touchdemo_cpp_service/srv/AddThreeInts.srv
  • AddThreeInts.srv 文件内容
# 请求部分(客户端发送)int64 a int64 b int64 c ---# 响应部分(服务端返回)int64sum

3、创建:客户端

  • client.cpp
// client.cpp #include "rclcpp/rclcpp.hpp" #include "demo_cpp_service/srv/add_three_ints.hpp" #include <chrono> #include <cstdlib> #include <memory> #include <thread> using namespace std::chrono_literals; int main(int argc, char **argv) { // 初始化 ROS 2 rclcpp::init(argc, argv); // 检查命令行参数:需要传入3个整数 if (argc != 4) { RCLCPP_ERROR( rclcpp::get_logger("client"), "用法: client A B C (A、B、C 为整数)" ); return 1; } // 将命令行参数转为整数 long a = std::stol(argv[1]); long b = std::stol(argv[2]); long c = std::stol(argv[3]); // 创建临时节点(用于发起服务请求) auto node = std::make_shared<rclcpp::Node>("add_three_ints_client"); // 创建客户端,连接到名为 "add_three_ints" 的服务 auto client = node->create_client<demo_cpp_service::srv::AddThreeInts>("add_three_ints"); // 等待服务可用(最多等待5秒) while (!client->wait_for_service(1s)) { if (!rclcpp::ok()) { RCLCPP_ERROR(node->get_logger(), "中断等待,服务不可用。"); return 1; } RCLCPP_INFO(node->get_logger(), "等待服务 'add_three_ints' 可用..."); } // 构造请求对象 auto request = std::make_shared<demo_cpp_service::srv::AddThreeInts::Request>(); request->a = a; request->b = b; request->c = c; // 异步发送请求 auto result_future = client->async_send_request(request); // 等待响应(最多10秒) if (rclcpp::spin_until_future_complete(node, result_future, 10s) == rclcpp::FutureReturnCode::SUCCESS) { // 获取响应结果 auto response = result_future.get(); RCLCPP_INFO( node->get_logger(), "服务返回结果: %ld + %ld + %ld = %ld", a, b, c, response->sum ); } else { RCLCPP_ERROR(node->get_logger(), "服务调用失败或超时。"); } rclcpp::shutdown(); return 0; }

4、创建:服务端

  • server.cpp
// server.cpp #include "rclcpp/rclcpp.hpp" // 包含我们自定义的服务类型头文件 #include "demo_cpp_service/srv/add_three_ints.hpp" #include <memory> // 服务回调函数:当客户端发起请求时被调用 void handle_add_three_ints( const std::shared_ptr<demo_cpp_service::srv::AddThreeInts::Request> request, std::shared_ptr<demo_cpp_service::srv::AddThreeInts::Response> response) { // 计算三个整数的和 response->sum = request->a + request->b + request->c; // 打印日志(可在终端看到) RCLCPP_INFO( rclcpp::get_logger("server"), "收到请求: %ld + %ld + %ld = %ld", request->a, request->b, request->c, response->sum ); } int main(int argc, char **argv) { // 初始化 ROS 2 rclcpp::init(argc, argv); // 创建一个节点 auto node = std::make_shared<rclcpp::Node>("add_three_ints_server"); // 创建服务 // 参数说明: // - 服务名称:"add_three_ints" // - 回调函数:handle_add_three_ints auto service = node->create_service<demo_cpp_service::srv::AddThreeInts>( "add_three_ints", &handle_add_three_ints ); RCLCPP_INFO(node->get_logger(), "服务 'add_three_ints' 已启动,等待请求..."); // 进入事件循环,等待客户端请求 rclcpp::spin(node); // 关闭 ROS 2 rclcpp::shutdown(); return 0; }

5、修改:CMakeLists.txt 文件

cmake_minimum_required(VERSION3.8)project(demo_cpp_service)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES"Clang")add_compile_options(-Wall -Wextra -Wpedantic)endif()# 查找依赖find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(rosidl_default_generators REQUIRED)# 声明服务文件rosidl_generate_interfaces(${PROJECT_NAME}"srv/AddThreeInts.srv"# 你的服务文件路径DEPENDENCIES# 如果服务依赖其他接口(如std_msgs),这里添加,无则留空)# 编译服务器/客户端节点add_executable(server src/server.cpp)ament_target_dependencies(server rclcpp)# 链接接口库(关键:让节点能访问生成的服务接口)rosidl_get_typesupport_target(cpp_typesupport_target${PROJECT_NAME}rosidl_typesupport_cpp)target_link_libraries(server"${cpp_typesupport_target}")add_executable(client src/client.cpp)ament_target_dependencies(client rclcpp)rosidl_get_typesupport_target(cpp_typesupport_target${PROJECT_NAME}rosidl_typesupport_cpp)target_link_libraries(client"${cpp_typesupport_target}")# 安装可执行文件install(TARGETS server client DESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()endif()ament_package()

6、修改:package.xml 文件

<?xml version="1.0"?><?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?><packageformat="3"><name>demo_cpp_service</name><version>0.0.0</version><description>ROS2 C++ service demo</description><maintaineremail="rabbit@example.com">rabbit</maintainer><license>Apache-2.0</license><!-- 原有依赖 --><buildtool_depend>ament_cmake</buildtool_depend><buildtool_depend>rosidl_default_generators</buildtool_depend><depend>rclcpp</depend><depend>rosidl_default_runtime</depend><member_of_group>rosidl_interface_packages</member_of_group><!-- 新增这行 --><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export></package>

7、colcon build 编译

# 回到工作目录执行:ros2_wscolcon build --packages-select demo_cpp_service
  • 启动服务端
sourceinstall/setup.bash ros2 run demo_cpp_service server
  • 启动客服端
sourceinstall/setup.bash ros2 run demo_cpp_service client102030
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 10:30:04

谈判策略模拟:LobeChat提供攻防应对方案

谈判策略模拟&#xff1a;LobeChat提供攻防应对方案 在企业高管准备一场关键并购谈判的前夜&#xff0c;他打开电脑&#xff0c;启动本地运行的 LobeChat&#xff0c;选择“资深谈判顾问”角色&#xff0c;上传了对方公司最近三年的公开财报与过往交易记录。输入第一句模拟开场…

作者头像 李华
网站建设 2026/5/1 9:31:29

【SVD】SVD数学推导,物理意义及其经典应用

【SVD】SVD数学推导&#xff0c;物理意义及其经典应用一、SVD的核心数学基础二、右奇异向量矩阵V的影响&#xff1a;定义“输入空间的核心方向”1. 数学本质&#xff1a;ATAA^T AATA的特征向量矩阵2. 几何意义&#xff1a;输入空间的正交坐标系3. 关键影响&#xff1a;特征选择…

作者头像 李华
网站建设 2026/5/1 9:27:59

如何在5种简单方法中将照片从小米Redmi传输到Redmi

照片通常包含重要的个人回忆&#xff0c;如家庭照片、旅行快照或特殊事件&#xff0c;因此在升级设备时安全地移动它们变得至关重要。许多Redmi用户想知道如何将照片从Redmi传输到Redmi&#xff0c;因为通过蓝牙或云进行手动传输可能很慢或很麻烦。本文将提供5种有效的方法来进…

作者头像 李华
网站建设 2026/4/28 15:30:38

LobeChat主题定制教程:打造品牌专属AI界面

LobeChat主题定制教程&#xff1a;打造品牌专属AI界面 在企业纷纷拥抱大语言模型的今天&#xff0c;一个共通的挑战浮出水面&#xff1a;如何让自家的AI助手不只是“能用”&#xff0c;而是真正“像自己”&#xff1f;无论是客服入口、内部知识库&#xff0c;还是产品演示系统&…

作者头像 李华
网站建设 2026/4/30 12:18:17

【AI面试必知必会】面试必看:AI 编程工具该如何向大厂面试官表述?

在AI编程工具普及的当下&#xff0c;Cursor、Windsurf、Trae Solo等工具已成为开发者提升效率的常用助手。但在互联网大厂面试中&#xff0c;“是否提及AI编程工具使用经验”“如何表述才不踩雷”成为很多候选人的困惑——说浅了怕不加分&#xff0c;说深了怕被质疑“依赖AI、核…

作者头像 李华
网站建设 2026/5/1 8:13:57

三星加速特斯拉AI5芯片生产,微美全息入局AI算力竞赛获市场高度期待

据报道&#xff0c;三星(SSNGY.US)正在加快在美国生产AI5芯片的准备工作&#xff0c;近期已为其客户工程团队招募了一批经验丰富的工程师。三星加速生产特斯拉AI5芯片此次大规模招聘表明&#xff0c;特斯拉(TSLA.US)的AI5项目在三星内部正快速推进。此前&#xff0c;三星与台积…

作者头像 李华