news 2026/6/3 22:26:31

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/6/2 21:29:50

LobeChatUGC内容激励方案

LobeChat UGC内容激励方案 在AI助手从实验室走向千家万户的今天&#xff0c;一个关键问题摆在开发者面前&#xff1a;如何让开源项目不只是“能用”&#xff0c;而是真正“被广泛使用”&#xff1f;答案或许不在于功能堆砌&#xff0c;而在于构建一种用户愿意参与、乐于贡献的内…

作者头像 李华
网站建设 2026/6/3 1:58:42

LobeChat会员等级晋升通知

LobeChat&#xff1a;从容器化部署到智能对话架构的深度实践 在 AI 技术加速落地的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;早已不再是实验室里的概念。越来越多企业开始尝试将 GPT、Claude、Ollama 等强大模型集成进实际业务中——无论是客服系统、知识助手&am…

作者头像 李华
网站建设 2026/5/29 5:52:30

收藏!2025 AI Agent爆发元年,大模型高薪赛道入门全攻略

一句指令触发手机40余款应用自动完成点餐、订票、购物全流程&#xff0c;工厂里人形机器人精准抓取物料替代熟练工劳作&#xff0c;金融AI智能体自主处理业务并优化客户体验——如今&#xff0c;智能体&#xff08;AI Agent&#xff09;正以“对话即执行、虚拟融实体”的姿态&a…

作者头像 李华
网站建设 2026/5/29 20:13:54

LobeChat网络异常错误提示优化

LobeChat网络异常错误提示优化 在构建AI聊天助手的实践中&#xff0c;一个看似微小却极具影响力的细节往往被忽视——当网络出问题时&#xff0c;系统该如何告诉用户“哪里坏了”。对于像LobeChat这样的开源对话平台而言&#xff0c;它不仅要能流畅地与大模型通信&#xff0c;更…

作者头像 李华
网站建设 2026/6/3 3:29:58

AI Agent在智能床头柜中的睡眠音乐定制

AI Agent在智能床头柜中的睡眠音乐定制 关键词:AI Agent、智能床头柜、睡眠音乐定制、个性化推荐、用户体验 摘要:本文深入探讨了AI Agent在智能床头柜中实现睡眠音乐定制的相关技术。首先介绍了该研究的背景,包括目的、预期读者、文档结构和术语表。接着阐述了核心概念与联…

作者头像 李华