news 2026/7/7 19:40:39

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/7/7 16:22:38

基于单片机的空调温度控制器的设计

基于单片机的空调温度控制器的设计 第一章 引言 在智能家居快速普及的背景下&#xff0c;传统空调温度控制依赖人工操作&#xff0c;存在温度调节不精准、能耗较高、使用便捷性不足等问题&#xff0c;难以满足用户对舒适居住环境与节能需求的平衡。随着嵌入式技术的发展&…

作者头像 李华
网站建设 2026/7/6 14:25:03

基于单片机的家庭防盗报警系统设计与实现

基于单片机的家庭防盗报警系统设计与实现 第一章 绪论 家庭安防是现代生活的重要需求&#xff0c;传统防盗设备多依赖单一感应触发或机械锁具&#xff0c;存在误报率高、报警方式单一、响应滞后等问题&#xff0c;难以形成全方位防护。单片机凭借低成本、高集成度与灵活编程特性…

作者头像 李华
网站建设 2026/7/7 8:20:24

大模型框架全解析:从PyTorch到vLLM的实战选择指南

本文全面对比分析了15个与大模型开发相关的框架和工具&#xff0c;包括训练框架、推理引擎、微调库和部署工具等。文章详细阐述了各框架的定位、核心功能、特点、优缺点和适用场景&#xff0c;为大模型开发者提供全面的工具选择参考&#xff0c;帮助根据不同需求(研究、训练、微…

作者头像 李华
网站建设 2026/7/7 18:45:41

【必藏干货】AI产品经理RAG知识库构建全攻略:从0到1打造高质量知识库

本文针对AI产品经理&#xff0c;详细介绍了RAG系统中高质量知识库的构建方法。文章强调知识库质量决定RAG成败&#xff0c;提出四大核心要素&#xff1a;内容权威性与准确性、语义完整性、结构化与元数据丰富、动态可维护性。通过银行客服案例展示优化过程与成果&#xff0c;并…

作者头像 李华
网站建设 2026/7/7 11:55:01

NFT项目白皮书撰写:LobeChat提供框架建议

NFT项目白皮书撰写&#xff1a;LobeChat提供框架建议 在Web3世界&#xff0c;一个NFT项目的成败往往不只取决于艺术创意或市场热度&#xff0c;更在于其背后是否具备一份逻辑严密、结构清晰、术语精准的白皮书。这份文档不仅是项目方与投资者之间的“技术契约”&#xff0c;更是…

作者头像 李华