ROS2 Jazzy 动作通信 (Action) 完整实战教程(C+++Python 双实现)

📅 2026/7/2 4:33:38
ROS2 Jazzy 动作通信 (Action) 完整实战教程(C+++Python 双实现)
一、前言动作通信Action是 ROS2 中用于长时间任务交互的通信模型兼具服务同步应答、话题持续反馈的优势适用于机械臂运动、导航、累加计算等耗时任务。 本文从零搭建自定义 Action 消息分别使用 C、Python 实现动作服务端 客户端完整复现「1~N 累加、实时进度反馈、任务取消、结果返回」全流程全程附踩坑解决方案适合 ROS2 初学者系统学习。环境华为云开发空间 ROS2 Jazzy二、整体工程结构robot_ws/src├── base_interfaces_demo # 自定义Action消息包├── cpp03_action # C动作通信实现└── py03_action # Python动作通信三、第一步自定义 Action 接口 base_interfaces_demo实现3.1 创建功能包cd ~/robot_ws/src ros2 pkg create --build-type ament_cmake base_interfaces_demo --dependencies rclcpp rclcpp_action action_msgscd base_interfaces_demo mkdir action nano action/Progress.action文件内容# 请求数据客户端发给服务端 int64 num --- # 最终结果任务完成后返回 int64 sum --- # 实时进度反馈循环持续推送 float64 progress3.3 配置 package.xml新增依赖与分组标签编译报错核心修复点buildtool_dependrosidl_default_generators/buildtool_depend dependaction_msgs/depend member_of_grouprosidl_interface_packages/member_of_group3.4 配置 CMakeLists.txt文件末尾添加接口生成代码只保留 action 文件规避 msg/srv 不存在报错rosidl_generate_interfaces(${PROJECT_NAME} action/Progress.action ) ament_export_dependencies(rosidl_default_runtime)3.5 编译与验证接口cd ~/robot_ws colcon build --packages-select base_interfaces_demo source install/setup.bash # 校验action是否生成成功 ros2 interface show base_interfaces_demo/action/Progress输出三段消息结构即代表自定义动作接口完成。四、第二步C 动作通信 cpp03_action4.1 创建 C 功能包# 创建工作空间并初始化包 cd ~/robot_ws/src ros2 pkg create --build-type ament_cmake cpp03_action --dependencies rclcpp rclcpp_action base_interfaces_demo # 进入包目录并创建标准ROS 2目录结构 cd cpp03_action mkdir -p src4.2 动作服务端 demo01_action_server.cpp实现逻辑接收数字、循环累加、实时推送进度、支持任务取消、返回总和 完整代码见文末资源核心回调handle_goal校验请求数字小于 1 拒绝任务handle_cancel接收客户端取消指令execute子线程执行累加循环发布进度反馈handle_accepted新开线程执行耗时任务防止节点阻塞4.3 动作客户端 demo02_action_client.cpp实现逻辑发送目标数字、监听服务端接收状态、打印实时进度、接收最终求和结果。4.4 CMakeLists.txt 编译配置find_package(rclcpp REQUIRED) find_package(rclcpp_action REQUIRED) find_package(base_interfaces_demo REQUIRED) # 编译服务端 add_executable(demo01_action_server src/demo01_action_server.cpp) ament_target_dependencies(demo01_action_server rclcpp rclcpp_action base_interfaces_demo) # 编译客户端 add_executable(demo02_action_client src/demo02_action_client.cpp) ament_target_dependencies(demo02_action_client rclcpp rclcpp_action base_interfaces_demo) # 安装可执行文件 install(TARGETS demo01_action_server demo02_action_client DESTINATION lib/${PROJECT_NAME})4.5 编译与双终端运行# 编译 cd ~/robot_ws colcon build --packages-select cpp03_action source install/setup.bash终端 1服务端ros2 run cpp03_action demo01_action_server终端 2客户端ros2 run cpp03_action demo02_action_client运行效果服务端持续打印进度客户端同步输出百分比最终输出551~10 累加结果五、第三步Python 动作通信 py03_action5.1 创建 Python 功能包cd ~/robot_ws/src ros2 pkg create --build-type ament_python py03_action --dependencies rclpy base_interfaces_demo5.2 Python 服务端 demo01_action_server_py.py逻辑与 C 完全对齐通过ActionServer绑定执行回调循环 sleep 模拟耗时计算publish_feedback 推送进度。5.3 Python 客户端 demo02_action_client_py.pyActionClient实现三类回调目标接收回调、实时进度回调、最终结果回调。5.4 setup.py 注册可执行程序Python 核心配置找到 entry_points 修改entry_points{ console_scripts: [ demo01_action_server_py py03_action.demo01_action_server_py:main, demo02_action_client_py py03_action.demo02_action_client_py:main, ], },5.5 编译运行cd ~/robot_ws colcon build --packages-select py03_action source install/setup.bash终端 1ros2 run py03_action demo01_action_server_py终端 2ros2 run py03_action demo02_action_client_py六、运行结果与警告说明6.1 正常运行输出客户端持续打印10%、20%...100%最终输出sum 55服务端同步打印每一步进度任务完成提示。6.2 常见警告解决方案警告may be more than one action server for the action get_sum原因C 与 Python 服务端重名话题冲突 解决CtrlC 关闭所有旧 ROS2 终端重新只启动单版本服务端。运行时报没有那个文件或目录原因未进入工作空间刷新环境变量 解决cd ~/robot_ws source install/setup.bash编译提示msg/Student.msg不存在原因CMakeLists 中残留旧消息路径 解决删除 msg、srv 相关配置仅保留 action 文件。七、Action 通信核心原理总结通信三部分Goal请求目标、Feedback实时反馈、Result最终结果服务端使用独立子线程执行耗时任务避免节点阻塞支持任务取消、参数校验、异步回调适配长时运动类机器人任务C 与 Python 接口逻辑完全一致仅语法、API 调用存在差异。八、完整踩坑清单自定义 action 包必须添加member_of_group标签否则编译直接报错Python 包必须在 setup.py 注册 console_scripts否则 ros2 run 找不到程序每次新开终端必须执行 source 刷新环境变量多套服务端同时运行会产生话题冲突警告测试时仅保留一套Action 依赖action_msgs自定义消息包必须显式声明依赖C 动作任务必须开子线程否则 spin 阻塞无法接收新请求。九、总结本文完整实现 ROS2 Action 全链路开发从自定义动作消息到 C、Python 双语言服务端客户端开发覆盖编译、运行、排错全流程适合课程作业、毕业设计、入门学习使用。整套代码可直接复制运行无冗余依赖适配 ROS2 Humble/Jazzy 全系版本。