跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

基于C++构建ROS2动作通信的完整生命周期

介绍使用C++在ROS2中构建动作(Action)通信机制。涵盖动作定义、服务器与客户端配置、生命周期状态机及代码实现细节,旨在帮助开发者建立健壮的异步任务交互框架。内容涉及环境搭建、CMake配置、可见性控制及服务器类的基本架构。

数字游民发布于 2026/3/29更新于 2026/10/2598 浏览

基于C++构建ROS2动作通信的完整生命周期

在现代机器人系统中,复杂的异步任务交互是核心需求之一。无论是机械臂的轨迹规划、移动机器人的自主导航,还是多机器人协同作业,都需要一种可靠、高效的通信机制来处理长时间运行的任务。ROS2动作(Action)正是为此而设计的强大通信模式,它结合了话题的发布订阅机制和服务的请求响应模式,同时提供了任务取消和进度反馈等关键功能。

对于中高级ROS2开发者而言,深入理解动作通信的完整生命周期至关重要。本文将带你从动作定义开始,逐步构建健壮的动作服务器和客户端,探讨异常处理、取消机制和反馈系统的实现细节,最终形成一个能够处理复杂机器人任务的完整通信框架。

1. 动作通信基础与设计原理

ROS2动作是一种基于请求-响应模式的异步通信机制,专门设计用于处理执行时间较长的任务。与服务(Service)不同,动作允许任务执行过程中断和取消,同时提供定期反馈机制,让客户端能够了解任务进度。

每个动作由三个部分组成:目标(Goal)、反馈(Feedback)和结果(Result)。这种结构使得动作非常适合需要持续监控的任务,如导航到指定位置、物体抓取、复杂计算等。动作通信建立在ROS2底层通信系统之上,使用动作定义文件(.action)来定义接口规范。

动作生命周期状态机包含以下几个关键状态:

  • 待处理:目标已接收但尚未开始执行
  • 执行中:任务正在执行,可发送反馈
  • 取消中:取消请求已接收,正在处理
  • 成功:任务顺利完成
  • 取消:任务被成功取消
  • 中止:任务因错误而终止

理解这些状态及其转换是构建可靠动作通信系统的基础。在实际实现中,我们需要确保每个状态转换都能正确处理,并提供适当的反馈信息。

2. 环境准备与工程配置

开始构建动作服务器和客户端之前,需要确保开发环境正确配置。以下是基于Ubuntu和ROS2 Jazzy的环境要求:

# 安装ROS2基础环境
sudo apt install ros-jazzy-desktop
# 创建工作空间并初始化
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
# 创建功能包(已存在自定义动作接口的前提下)
ros2 pkg create --dependencies custom_action_interfaces rclcpp rclcpp_action rclcpp_components --build-type ament_cmake --license Apache-2.0 custom_action_cpp

在CMakeLists.txt中,我们需要正确配置编译选项和依赖关系。以下是关键配置部分:

# 添加动作服务器编译目标
add_library(action_server SHARED src/fibonacci_action_server.cpp)
# 设置包含目录
target_include_directories(action_server PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
# 添加编译定义(Windows兼容性)
target_compile_definitions(action_server PRIVATE "CUSTOM_ACTION_CUSTOM_ACTION_CPP_BUILDING_DLL")
# 声明依赖项
ament_target_dependencies(action_server "custom_action_interfaces" "rclcpp" "rclcpp_action" "rclcpp_components")
# 注册节点组件
rclcpp_components_register_node(action_server PLUGIN "custom_action_cpp::FibonacciActionServer" EXECUTABLE fibonacci_action_server)

对于跨平台开发,还需要处理符号可见性控制。创建 include/custom_action_cpp/visibility_control.h 文件:

#ifndef CUSTOM_ACTION_CPP__VISIBILITY_CONTROL_H_
#define CUSTOM_ACTION_CPP__VISIBILITY_CONTROL_H_
#ifdef __cplusplus
extern "C" {
#endif
// 基于编译器平台的可见性控制宏
#if defined _WIN32 || defined __CYGWIN__
#ifdef __GNUC__
#define CUSTOM_ACTION_CPP_EXPORT __attribute__ ((dllexport))
#define CUSTOM_ACTION_CPP_IMPORT __attribute__ ((dllimport))
#else
#define CUSTOM_ACTION_CPP_EXPORT __declspec(dllexport)
#define CUSTOM_ACTION_CPP_IMPORT __declspec(dllimport)
#endif
#ifdef CUSTOM_ACTION_CPP_BUILDING_DLL
#define CUSTOM_ACTION_CPP_PUBLIC CUSTOM_ACTION_CPP_EXPORT
#else
#define CUSTOM_ACTION_CPP_PUBLIC CUSTOM_ACTION_CPP_IMPORT
#endif
#else
#define CUSTOM_ACTION_CPP_EXPORT __attribute__ ((visibility("default")))
#define CUSTOM_ACTION_CPP_IMPORT
#if __GNUC__ >= 4
#define CUSTOM_ACTION_CPP_PUBLIC __attribute__ ((visibility("default")))
#define CUSTOM_ACTION_CPP_LOCAL __attribute__ ((visibility("hidden")))
#else
#define CUSTOM_ACTION_CPP_PUBLIC
#define CUSTOM_ACTION_CPP_LOCAL
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif // CUSTOM_ACTION_CPP__VISIBILITY_CONTROL_H_

提示:良好的工程配置是项目成功的基础,特别是在跨平台开发时。确保所有依赖项正确声明,可见性控制适当配置,可以避免许多难以调试的运行时错误。

3. 动作服务器实现详解

动作服务器是实现机器人任务逻辑的核心组件。它负责接收客户端的目标请求,执行具体任务,定期发送进度反馈,并在任务完成后返回最终结果。

3.1 服务器架构与初始化

首先创建 FibonacciActionServer 类,继承自 rclcpp::Node:

#include <functional>
#include <memory>
#include <thread>
#include "custom_action_interfaces/action/fibonacci.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "rclcpp_components/register_node_macro.hpp"
#include "custom_action_cpp/visibility_control.h"
namespace custom_action_cpp

目录

  1. 基于C++构建ROS2动作通信的完整生命周期
  2. 1. 动作通信基础与设计原理
  3. 2. 环境准备与工程配置
  4. 安装ROS2基础环境
  5. 创建工作空间并初始化
  6. 创建功能包(已存在自定义动作接口的前提下)
  7. 添加动作服务器编译目标
  8. 设置包含目录
  9. 添加编译定义(Windows兼容性)
  10. 声明依赖项
  11. 注册节点组件
  12. 3. 动作服务器实现详解
  13. 3.1 服务器架构与初始化

更多推荐文章

查看全部
  • HDFS 核心组件深度解析:分布式文件系统架构
  • HarmonyOS6 RcIcon 组件核心架构与字体图形渲染机制
  • 基于 Docker 的企业级检索增强生成(RAG)系统部署指南
  • UI UX Pro Max 驱动的现代前端 UI 工作流指南
  • 语义化 AI 驱动器:提示词工程的技术演进与未来应用
  • AIGC 辅助软件开发全流程实战:需求与设计篇
  • Windows 下 Docker Desktop 安装与配置指南
  • Llama-Factory 中启用梯度裁剪保护训练稳定性
  • ipget:基于 IPFS 的零配置分布式文件下载工具
  • OpenClaw 安装与飞书机器人全流程配置指南
  • 从零构建可扩展 Flutter 应用:v1.0 到 v2.0 架构演进与代码详解
  • OpenClaw 本地部署与飞书机器人接入实战指南
  • 夸克网盘技术资源精选:书籍、软件与 AI 资料汇总
  • 2026 年机器人系统架构与核心技术路线解析
  • Ubuntu 20.04 网络配置指南
  • 基于 nanobot 构建轻量级 QQ AI 机器人及搜索模块优化实践
  • RuoYi-Vue Pro 基于 Spring Boot 与 Vue 的企业级快速开发平台
  • H.265 网页播放:WebAssembly + FFmpeg 实现浏览器端硬解软解兼容方案
  • Docker 容器内 Java 与 Python 代码运行示例
  • Spring AI 实战:基于 SSE 构建 MCP Server 与 Client

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online