附录_项目全景调研
无人机运动规划与控制开源C++项目全景调研¶
本报告系统调研了GitHub上**85+个**无人机规划与控制领域的优秀开源C++项目,覆盖HKU MaRS Lab、ZJU FAST Lab、HKUST Aerial Robotics、ETH Zurich ASL/RPG、MIT ACL、KumarRobotics、PX4等顶级实验室。最核心发现:GCOPTER、ikd-Tree、voxblox、mav_trajectory_generation和agilicious这五个项目在C++工程教学价值上达到了满分(5/5),分别代表了header-only库设计、模板化并发数据结构、泛型空间索引、非类型模板参数以及现代C++17流水线架构的最佳实践。这些项目整体呈现出从C++11到C++17的演进趋势,Eigen模板表达式是贯穿所有项目的核心技术线索,而ROS1/ROS2双支持正成为新项目的标配。
一、项目总览清单¶
1.1 轨迹规划类¶
| 项目 | GitHub | Stars | 核心算法 | C++标准 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|---|
| GCOPTER | ZJU-FAST-Lab/GCOPTER | ~1,100 | MINCO轨迹表示+L-BFGS优化 | C++11/14 | Header-only全库设计,Eigen模板表达式,O(N)带状矩阵 | ⭐⭐⭐⭐⭐ |
| large_scale_traj_optimizer | ZJU-FAST-Lab/large_scale_traj_optimizer | 253 | Minimum-jerk/snap双描述 | C++11 | 仅2个头文件,极简API设计 | ⭐⭐⭐⭐⭐ |
| Fast-Planner | HKUST-Aerial-Robotics/Fast-Planner | ~3,200 | 动力学A*+B-spline优化 | C++11 | FSM模式,NLopt集成,ESDF flat array | ⭐⭐⭐⭐ |
| EGO-Planner | ZJU-FAST-Lab/ego-planner | ~1,800 | 无ESDF梯度B-spline优化 | C++11 | FSM+Manager模式,LBFGS-Lite | ⭐⭐⭐⭐ |
| SUPER | hku-mars/SUPER | ~828 | 双轨迹安全规划+CIRI走廊 | C++14/17 | ROS1/ROS2双支持,多包架构,shared_ptr工厂 | ⭐⭐⭐⭐ |
| EGO-Planner-v2 | ZJU-FAST-Lab/EGO-Planner-v2 | 654 | MINCO轨迹(Science Robotics) | C++14 | 多工作空间架构,生产级代码 | ⭐⭐⭐ |
| Teach-Repeat-Replan | HKUST-Aerial-Robotics/Teach-Repeat-Replan | ~1,000 | 凸多面体走廊+minimum-jerk | C++11 | CUDA加速,完整自主飞行系统 | ⭐⭐⭐⭐ |
| FASTER | mit-acl/faster | ~1,200 | JPS3D+凸分解+Gurobi优化 | C++11/14 | Gurobi C++集成,Docker支持 | ⭐⭐⭐⭐ |
| MADER | mit-acl/mader | ~300 | MINVO基+Octopus搜索 | C++14 | CGAL集成,Gurobi/NLopt可切换后端 | ⭐⭐⭐½ |
| ewok | VladyslavUsenko/ewok | ~350 | B-spline+3D环形缓冲区ESDF | C++11/14 | 环形缓冲区数据结构,heavy Eigen模板 | ⭐⭐⭐⭐ |
| Btraj | HKUST-Aerial-Robotics/Btraj | ~300 | Bernstein基多项式+Mosek QP | C++11 | Armadillo线性代数,Mosek QP集成 | ⭐⭐⭐ |
| TimeOptimizer | HKUST-Aerial-Robotics/TimeOptimizer | ~200 | SOCP时间优化 | C++11 | 轨迹基类继承模式,Mosek SOCP | ⭐⭐⭐ |
| am_traj | ZJU-FAST-Lab/am_traj | — | 交替最小化多项式轨迹 | C++11 | Header-only库 | ⭐⭐⭐⭐½ |
| EVA-Planner | ZJU-FAST-Lab/EVA-planner | ~150 | 环境自适应梯度规划 | C++11 | 基于Teach-Repeat-Replan框架 | ⭐⭐⭐ |
| IPC | hku-mars/IPC | ~240 | 统一规划+MPC控制@100Hz | C++14 | OSQP/OSQP-Eigen集成,QP实时优化 | ⭐⭐⭐⭐ |
| EFOPT | hku-mars/EFOPT | ~18 | SQP+\(\ell_1\)罚方法(尾座式) | C++14/17 | 自定义SQP求解器,解析梯度 | ⭐⭐⭐⭐ |
| Primitive-Planner | ZJU-FAST-Lab/Primitive-Planner | 158 | 运动原语库+TOPP-RA | C++14 | 离线/在线分离架构,线性复杂度选择 | ⭐⭐⭐⭐ |
| DDR-opt | ZJU-FAST-Lab/DDR-opt | 359 | MINCO地面机器人轨迹优化 | C++14 | MINCO泛化应用 | ⭐⭐⭐ |
| Fast-Racing | ZJU-FAST-Lab/Fast-Racing | — | 无人机竞速规划 | C++17 | GCOPTER并行扩展 | ⭐⭐⭐ |
1.2 自主探索类¶
| 项目 | GitHub | Stars | 核心算法 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| FUEL | HKUST-Aerial-Robotics/FUEL | ~1,300 | 增量前沿信息结构+层级规划 | 增量数据结构维护,层级规划架构 | ⭐⭐⭐⭐ |
| RACER | SYSU-STAR/RACER | ~715 | 去中心化多机探索+LKH TSP | 外部求解器集成(LKH文件I/O),T-RO 2023最佳论文 | ⭐⭐⭐⭐ |
| FC-Planner | HKUST-Aerial-Robotics/FC-Planner | ~337 | 骨架引导覆盖规划 | OMPL集成,并行子问题求解 | ⭐⭐⭐⭐ |
| FALCON | HKUST-Aerial-Robotics/FALCON | ~261 | 覆盖路径引导探索 | T-RO 2024 | ⭐⭐⭐½ |
| nbvplanner | ethz-asl/nbvplanner | ~263 | RRT次优视角规划 | OctoMap C++ API使用,git子模块管理 | ⭐⭐⭐ |
| mav_active_3d_planning | ethz-asl/mav_active_3d_planning | ~633 | 模块化信息路径规划 | 虚函数插件框架,工厂模式 | ⭐⭐⭐⭐ |
| LARGE (large_scale_traj_optimizer的探索扩展) | ZJU-FAST-Lab/LARGE | — | 大规模自主探索 | 待验证 | 待验证 |
1.3 MPC与控制类¶
| 项目 | GitHub | Stars | 核心算法 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| agilicious | uzh-rpg/agilicious | ~549 | MPC/DFBC/INDI多控制器 | C++17流水线架构,工厂模式+YAML配置,Guard安全模式 | ⭐⭐⭐⭐⭐ |
| control-toolbox (CT) | ethz-adrl/control-toolbox | ~1,600 | iLQR/GNMS/NMPC/LQR | 极致模板元编程,编译期维度参数,CppAD自动微分 | ⭐⭐⭐⭐⭐ |
| rpg_mpc | uzh-rpg/rpg_mpc | ~422 | ACADO代码生成+qpOASES | Eigen::Map零拷贝,三层包装架构 | ⭐⭐⭐⭐ |
| rpg_quadrotor_control | uzh-rpg/rpg_quadrotor_control | ~696 | SE(3)几何控制+差分平坦 | ControllerBase抽象接口(Strategy模式) | ⭐⭐⭐⭐ |
| PX4-Autopilot | PX4/PX4-Autopilot | ~11,000 | 级联PID+EKF2+状态机 | CRTP(ModuleBase |
⭐⭐⭐⭐ |
| acados | acados/acados | ~1,300 | NMPC/SQP-RTI | C核心+C++封装,代码生成模式,静态内存分配 | ⭐⭐⭐⭐ |
| mav_control_rw | ethz-asl/mav_control_rw | ~300 | 线性/非线性MPC对比 | 扰动观测器,LAPACK集成 | ⭐⭐⭐ |
| mavros_controllers | Jaeyoung-Lim/mavros_controllers | ~500 | SE(3)几何跟踪控制 | PX4 SITL集成 | ⭐⭐⭐ |
| control_toolbox (ros) | ros-controls/control_toolbox | ~172 | PID(反积分饱和) | 干净的PID实现,ROS2参数处理 | ⭐⭐⭐⭐ |
| data_driven_mpc | uzh-rpg/data_driven_mpc | ~302 | GP增强MPC | Python为主,C++有限 | ⭐⭐ |
1.4 集群协同类¶
| 项目 | GitHub | Stars | 核心算法 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| EGO-Swarm | ZJU-FAST-Lab/ego-planner-swarm | ~900 | 去中心化B-spline共享 | 多进程ROS架构,异步轨迹交换 | ⭐⭐⭐⭐ |
| Swarm-Formation | ZJU-FAST-Lab/Swarm-Formation | ~300 | MINCO+图论编队代价 | 可微分图论代价函数,Docker支持 | ⭐⭐⭐½ |
| RACER | SYSU-STAR/RACER | ~715 | 去中心化协作探索 | 见探索类 | ⭐⭐⭐⭐ |
| MADER | mit-acl/mader | ~300 | 多智能体动态环境规划 | CGAL+Gurobi | ⭐⭐⭐½ |
| mrs_uav_system | ctu-mrs/mrs_uav_system | ~400 | 多机全栈系统 | 极其模块化的ROS架构,Docker/Apptainer | ⭐⭐⭐⭐ |
1.5 地图/数据结构类¶
| 项目 | GitHub | Stars | 核心算法 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| ikd-Tree | hku-mars/ikd-Tree | ~779 | 增量KD树+后台重建 | 模板类+std::thread+mutex,独立无ROS依赖 | ⭐⭐⭐⭐⭐ |
| voxblox | ethz-asl/voxblox | ~1,600 | TSDF/ESDF体素映射 | Layer<VoxelType>模板,三种线程模式,Protobuf序列化 | ⭐⭐⭐⭐⭐ |
| FIESTA | HKUST-Aerial-Robotics/FIESTA | — | 快速增量ESDF | BFS+双向链表+增量更新 | ⭐⭐⭐⭐⭐ |
| OctoMap | OctoMap/octomap | ~1,800 | 概率八叉树3D映射 | 高效内存管理,序列化 | ⭐⭐⭐⭐ |
| ROG-Map | hku-mars/ROG-Map | — | 机器人中心占据栅格 | 增量更新,A*/RRT*示例 | ⭐⭐⭐⭐ |
| BDM | hku-mars/BDM | ~97 | 边界地图 | 内存高效大规模占据映射 | ⭐⭐⭐ |
| DecompUtil | sikang/DecompUtil | ~200 | 椭球凸分解 | Header-only,Eigen-based | ⭐⭐⭐⭐ |
| LBFGS-Lite | ZJU-FAST-Lab/LBFGS-Lite | — | L-BFGS优化器 | 单文件header-only,~800行,非光滑支持 | ⭐⭐⭐⭐⭐ |
| minvo | mit-acl/minvo | ~100 | 最小体积单纯形包络 | Header-only数学实现 | ⭐⭐⭐ |
1.6 仿真类¶
| 项目 | GitHub | Stars | 核心特征 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| rotors_simulator | ethz-asl/rotors_simulator | ~1,500 | Gazebo MAV仿真 | Gazebo插件架构,FirstOrderFilter<T>模板 | ⭐⭐⭐⭐ |
| flightmare | uzh-rpg/flightmare | ~1,300 | Unity渲染+C++物理 | C++17,VecEnv<T>模板,ZeroMQ IPC,pybind11 | ⭐⭐⭐⭐½ |
| AirSim | microsoft/AirSim | ~17,000 | UE4高保真仿真 | Header-only物理引擎,Factory/Strategy模式,RPC架构 | ⭐⭐⭐⭐ |
| MARSIM | hku-mars/MARSIM | ~520 | 轻量级点云LiDAR仿真 | PCL渲染,多机多线程仿真 | ⭐⭐⭐⭐ |
| mockamap | HKUST-Aerial-Robotics/mockamap | ~206 | 程序化3D地图生成 | PCL+ROS入门级代码 | ⭐⭐⭐ |
| Fast-Drone-250 | ZJU-FAST-Lab/Fast-Drone-250 | 2,300 | 完整250mm无人机方案 | 硬件+软件全栈集成 | ⭐⭐⭐⭐⭐(系统) |
| mrs_multirotor_simulator | ctu-mrs/mrs_multirotor_simulator | ~50 | Header-only动力学仿真 | Header-only C++,ODE求解器 | ⭐⭐⭐½ |
1.7 全栈自主框架与基础设施¶
| 项目 | GitHub | Stars | 核心功能 | C++工程亮点 | 教学评分 |
|---|---|---|---|---|---|
| kr_autonomous_flight | KumarRobotics/kr_autonomous_flight | ~763 | GPS拒止全自主飞行 | .clang-format代码规范,Docker部署,CI/CD,Nodelet零拷贝 | ⭐⭐⭐⭐⭐ |
| CERLAB-UAV-Autonomy | Zhefan-Xu/CERLAB-UAV-Autonomy | ~634 | CMU全栈自主框架 | 模块化C++/ROS/PX4,视频教程 | ⭐⭐⭐⭐ |
| mav_voxblox_planning | ethz-asl/mav_voxblox_planning | ~400 | voxblox+OMPL+轨迹规划 | OMPL集成模式,ESDF碰撞检测 | ⭐⭐⭐⭐ |
| mav_trajectory_generation | ethz-asl/mav_trajectory_generation | ~636 | 多项式轨迹生成(minimum-snap) | PolynomialOptimization<N>非类型模板 | ⭐⭐⭐⭐⭐ |
| mavros | mavlink/mavros | ~1,800 | MAVLink-ROS桥接 | C++17插件架构,Boost.ASIO网络通信 | ⭐⭐⭐⭐ |
| MAVSDK | mavlink/MAVSDK | ~1,500 | 无人机SDK | C++17,gRPC,跨平台 | ⭐⭐⭐½ |
| OMPL | ompl/ompl | ~1,100 | 采样运动规划库 | 干净抽象接口,Boost依赖 | ⭐⭐⭐⭐ |
| pinocchio | stack-of-tasks/pinocchio | ~3,100 | 刚体动力学及解析导数 | C++17/20/23,模板元编程,CasADi自动微分 | ⭐⭐⭐⭐⭐ |
| crocoddyl | loco-3d/crocoddyl | ~1,200 | FDDP最优控制 | Pinocchio后端,Boost.Python绑定 | ⭐⭐⭐⭐ |
二、明星项目深度剖析(20个最具教学价值的项目)¶
2.1 GCOPTER — Header-only轨迹优化的教科书¶
GitHub: https://github.com/ZJU-FAST-Lab/GCOPTER | Stars: ~1,100 | 论文: IEEE T-RO 2022 (Regular Paper) | 许可: MIT
GCOPTER代表了C++ header-only数学库设计的最高水准。整个轨迹优化框架完全由gcopter/include/gcopter/目录下的头文件构成:minco.hpp(MINCO轨迹表示)、firi.hpp(快速迭代区域膨胀走廊生成)、flatness.hpp(含非线性阻力的差分平坦)、lbfgs.hpp(集成的L-BFGS求解器)、gcopter.hpp(优化器编排)。
核心C++亮点: 所有计算通过**带状矩阵操作达到O(N)复杂度**,避免了密集矩阵求逆。Eigen模板表达式被用到极致——block<1,3>()固定大小块操作、JacobiSVD<Matrix3d, FullPivHouseholderQRPreconditioner>用于走廊生成、.cwiseAbs()/.cwiseQuotient()逐元素运算。轨迹阶数s可作为模板参数实现编译期策略选择。API设计堪称典范:reset() → generate() → getObjective() → getGradT() → getTraj()的流水线式调用链清晰自然。
推荐精读文件: minco.hpp(MINCO数学核心)、firi.hpp(SVD+线性规划的几何算法)、flatness.hpp(差分平坦的代码化推导)
2.2 ikd-Tree — 并发数据结构的完美教学范本¶
GitHub: https://github.com/hku-mars/ikd-Tree | Stars: ~779 | 论文: arXiv:2102.10808, 集成于FAST-LIO2 (IEEE T-RO 2022)
ikd-Tree是本次调研中C++模板与多线程教学价值最高的单一项目。 其template <typename PointType> class KD_TREE实现了完全泛型的增量KD树,支持任意点类型(PCL PointXYZINormal、自定义类型均可)。并发设计采用**双线程架构**:主线程处理插入/删除/搜索操作,专用重建线程在后台异步执行局部再平衡。std::thread与pthread_mutex的混合使用、惰性删除标记机制、以及Eigen::aligned_allocator<PointType>的对齐分配器都是绝佳教学素材。
整个库仅ikd_Tree.h和ikd_Tree.cpp两个文件,外加3个standalone示例程序(速度测试、搜索演示、异步演示),无需ROS依赖。社区已有中文注释版本(KennyWGH/ikd-Tree-detailed)。
推荐精读: ikd_Tree.h(模板类定义+节点结构)、ikd_Tree.cpp(插入/删除/重建/搜索完整实现)、examples/ikd_tree_async_demo.cpp(异步重建演示)
2.3 voxblox — 泛型空间数据结构与多线程集成的标杆¶
GitHub: https://github.com/ethz-asl/voxblox | Stars: ~1,600 | 论文: IROS 2017 | 许可: BSD-3-Clause
voxblox的Layer<VoxelType>和Block<VoxelType>是**C++模板泛型空间数据结构的最佳实践**。同一套空间哈希基础设施可以承载TsdfVoxel、EsdfVoxel、OccupancyVoxel或任意自定义体素类型。多线程模式是另一大亮点:TSDF积分器提供三种并行策略(Simple单线程、Merged多线程合并射线、Fast近似哈希并行),通过TsdfIntegratorType枚举实现**工厂/策略模式**的经典组合。
线程安全文档标注在每个函数级别,使用std::thread+std::mutex+std::atomic完整三件套。EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏的使用展示了Eigen对齐分配的标准做法。Protobuf用于地图序列化是工程化的加分项。核心库(voxblox/)完全不依赖ROS,ROS封装在独立的voxblox_ros/包中——这种**库/ROS分离架构**值得所有项目学习。
推荐精读: voxblox/include/voxblox/core/layer.h(模板体素层+空间哈希)、voxblox/include/voxblox/integrator/tsdf_integrator.h(多线程+工厂模式)、voxblox/include/voxblox/core/voxel.h(体素类型定义)
2.4 mav_trajectory_generation — 非类型模板参数的经典案例¶
GitHub: https://github.com/ethz-asl/mav_trajectory_generation | Stars: ~636 | 论文: ISRR 2013(Springer, Robotics Research STAR vol.114, 2016)(Richter, Bry & Roy) | 许可: Apache-2.0
**PolynomialOptimization<N>**是C++非类型模板参数在机器人学中的教科书案例——N为编译时确定的多项式阶数(通常为10),贯穿整个库的类型系统。数据结构设计层次分明:Vertex(带导数约束的航路点,使用std::map<int, Eigen::VectorXd>存储约束)→Segment(每维一个多项式)→Polynomial(系数向量)→Trajectory(段序列)。NLopt集成展示了C++调用C风格回调的标准模式(静态成员函数+void* user data转this指针)。
README提供了完整的代码使用示例,从waypoint设置到轨迹生成的每一步都有清晰说明。多包结构将核心库、ROS封装、可视化、示例分离得非常干净。
推荐精读: polynomial_optimization_linear.h(QP建立+非类型模板)、polynomial_optimization_nonlinear.h(NLopt回调封装)、vertex.h(约束映射设计)、polynomial.h(多项式求根的数值算法)
2.5 agilicious — 现代C++17工程架构的最佳示范¶
GitHub: https://github.com/uzh-rpg/agilicious | Stars: ~549 | 论文: Science Robotics 2022 | 许可: 需注册
agilicious是**C++17在机器人控制系统中应用的标杆项目**。其核心创新在于**Pipeline架构**:控制器(MPC/DFBC/INDI)、估计器(多种EKF)、参考轨迹源可运行时通过YAML配置文件动态组合切换。这通过**工厂模式**从配置文件创建模块实例来实现。
agilib是核心C++库,仅依赖Eigen,不依赖ROS;agiros提供ROS绑定。**Guard安全模式**是独特亮点——一个备用流水线在主流水线失败时接管,这是实际飞行系统必须的安全设计。BEM(叶素动量理论)螺旋桨模型提供了比简单推力系数更精确的气动仿真。项目已被30+篇论文使用。
推荐精读: 各模块的接口定义文件(控制器、估计器基类)、Pilot状态机实现、Guard安全模块
2.6 ethz-adrl/control-toolbox — 模板元编程的极致应用¶
GitHub: https://github.com/ethz-adrl/control-toolbox | Stars: ~1,600 | 论文: IEEE SIMPAR 2018 (最佳学生论文) | 许可: BSD-2
这是**本次调研中模板使用最密集的项目**。典型类签名:template <size_t STATE_DIM, size_t CONTROL_DIM, size_t P_DIM, size_t V_DIM, typename SCALAR, bool CONTINUOUS>——所有维度在编译期确定,实现**零开销抽象**。模块化设计分为ct_core(系统动力学、积分器)、ct_optcon(iLQR/GNMS/NMPC求解器)、ct_rbd(刚体动力学)、ct_models(包含四旋翼模型)。
**自动微分集成**是独特教学点:通过CppAD和CppADCodeGen支持动力学函数的自动求导,消除了手工推导雅可比矩阵的需要。Policy/Strategy模式用于求解器选择,CRTP用于静态多态。可独立于ROS构建。
注意: 项目自2021年后维护较少,但其C++架构设计仍是最优秀的参考。
推荐精读: ct_optcon/include/ct/optcon/nloc/algorithms/ilqr/iLQR.hpp、ct_core/include/ct/core/systems/(系统动力学模板)、ct_models/include/ct/models/Quadrotor/
2.7 large_scale_traj_optimizer — 极简API设计的典范¶
GitHub: https://github.com/ZJU-FAST-Lab/large_scale_traj_optimizer | Stars: 253 | 论文: ICRA 2021
整个项目仅2个头文件:traj_min_jerk.hpp和traj_min_snap.hpp。JerkOpt/SnapOpt类提供了极其优雅的API:reset() → generate() → getObjective() → getGradT() → getGradInnerP() → getTraj()。所有计算O(N)复杂度,通过多项式的"双描述"实现——可能是目前最快的minimum snap轨迹生成器。每个函数返回值直接可微分,可嵌入下游优化。C++ 99.5%的语言占比说明了其纯粹性。
这是教学中讲解"如何设计高效C++数学库API"的完美案例。
2.8 Fast-Planner — 理解完整规划管线的最佳入口¶
GitHub: https://github.com/HKUST-Aerial-Robotics/Fast-Planner | Stars: ~3,200 | 论文: RA-L 2019 / ICRA 2020 / T-RO (RAPTOR)
Fast-Planner是**UAV规划领域引用率最高、Star数最多的项目**(3,200+星),也是EGO-Planner、FUEL、RACER等后续项目的代码基础。其FSM模式(KinoReplanFSM:INIT→WAIT_TARGET→GEN_NEW_TRAJ→REPLAN_TRAJ→EXEC_TRAJ)和Manager模式(FastPlannerManager协调path_searching、bspline_opt、plan_env)是ROS C++机器人系统的经典架构。
**SDFMap的flat array实现**值得深入研究:使用std::vector<double>存储3D体素数据并通过idx = x + y * dim_x + z * dim_x * dim_y手动索引——这是**缓存友好型3D数据布局**的经典做法。KinodynamicAstar使用自定义NodeHashTable(为Eigen::Vector3i定制的哈希函数)展示了如何为特定场景优化标准库容器。NLopt集成通过静态成员函数+void*用户数据的C/C++桥接模式实现。
推荐精读: path_searching/kinodynamic_astar.cpp(动力学A*完整实现)、bspline_opt/bspline_optimizer.cpp(NLopt优化封装)、plan_env/sdf_map.cpp(ESDF构建)、plan_manage/kino_replan_fsm.cpp(FSM状态机)
2.9 EGO-Planner — ESDF-free设计的工程突破¶
GitHub: https://github.com/ZJU-FAST-Lab/ego-planner | Stars: ~1,800 | 论文: IEEE RA-L 2021
EGO-Planner的核心创新是**去除了ESDF构建步骤**——直接在占据栅格上通过碰撞检测计算近似梯度,将单次规划时间压缩到~1ms。代码架构继承了Fast-Planner的FSM+Manager模式但更精简。**LBFGS-Lite**的集成展示了如何使用header-only C++库简化依赖管理。多包ROS工作空间组织(plan_manage、bspline_opt、path_searching、plan_env、traj_utils)是教学中演示"关注点分离"的理想案例。
推荐精读: bspline_opt/src/bspline_optimizer.cpp(核心优化逻辑:代价函数、梯度计算、calcDistanceCostRebound)、plan_manage/src/ego_replan_fsm.cpp(FSM实现)
2.10 PX4-Autopilot — 嵌入式C++工程的工业标准¶
GitHub: https://github.com/PX4/PX4-Autopilot | Stars: ~11,000 | 许可: BSD-3-Clause
PX4是**飞控领域最大的开源项目**,其C++工程实践代表了安全关键嵌入式系统的行业标准。三个核心C++亮点:
第一,CRTP模式**在ModuleBase<T>中的应用——每个模块继承ModuleBase<DerivedModule>实现编译期静态分派,避免虚函数开销。第二,**uORB发布-订阅中间件**采用共享内存零拷贝设计,消息从.msg文件自动生成为固定大小C/C++结构体,uORB::Subscription和uORB::Publication<T>提供类型安全的泛型接口。第三,**无堆分配策略——控制回路中不使用std::vector和new,所有矩阵使用自定义的编译期固定大小Matrix<Type, M, N>模板类。
自定义矩阵库src/lib/matrix/是独立于Eigen的教学素材,展示了如何从零设计支持Quaternion<Type>、Dcm<Type>、Euler<Type>的航空数学库。Commander.cpp的状态机和Navigator的策略模式(NavigatorMode基类→Mission/Loiter/RTL/Land派生类)也极具教学价值。
推荐精读: src/lib/matrix/matrix/Quaternion.hpp(模板四元数类)、src/modules/mc_att_control/(级联PID)、src/modules/commander/Commander.cpp(状态机)、src/modules/navigator/navigator_main.cpp(Strategy模式)
2.11 rpg_mpc — Eigen::Map零拷贝封装的最佳案例¶
GitHub: https://github.com/uzh-rpg/rpg_mpc | Stars: ~422 | 论文: IROS 2018 (PAMPC)
rpg_mpc的**三层架构设计**是C++封装模式的教科书案例:底层mpc_solver是ACADO自动生成的列优先C数组代码;中间层mpc_wrapper使用**Eigen::Map在不拷贝数据的情况下将原始C数组映射为Eigen矩阵对象**;顶层mpc_controller提供完整ROS控制器接口并继承ControllerBase。这个从自动生成C代码到类型安全C++接口的渐进封装过程,是讲解"如何优雅地包装遗留C代码"的绝佳案例。
推荐精读: mpc_wrapper/(Eigen::Map核心用法)、model/(ACADO模型描述→代码生成工作流)
2.12 FIESTA — 自定义空间数据结构的精品案例¶
GitHub: https://github.com/HKUST-Aerial-Robotics/FIESTA | 论文: IROS 2019
FIESTA的ESDF实现展示了**如何用BFS队列+双向链表+增量索引实现高效的距离场更新**。与voxblox的全量更新不同,FIESTA直接在占据栅格上操作,通过维护障碍物的链表结构实现O(changed_voxels)的增量更新。ESDFMap类使用flat buffer存储配合BFS队列遍历,是数据结构课程中"将理论算法应用于实际3D空间问题"的完美案例。
推荐精读: src/ESDFMap.cpp(增量ESDF的完整实现)
2.13 kr_autonomous_flight — 专业级ROS C++工程实践¶
GitHub: https://github.com/KumarRobotics/kr_autonomous_flight | Stars: ~763 | 论文: JFR 2018, RA-L 2022
在所有调研项目中,kr_autonomous_flight展现了**最成熟的软件工程实践**。.clang-format和.cmake-format.yaml强制代码风格一致;GitHub Actions实现**CI/CD自动化测试**;Docker化部署将state_machine、control、map_plan、sim分离为独立容器;Nodelet用于**零拷贝消息传递**。分层架构autonomy_core/(核心算法)/ autonomy_sim/(仿真)/ autonomy_real/(硬件接口)清晰分离关注点。
这是讲解"从学术原型到工程化产品"的最佳案例。
2.14 flightmare — C++17与跨语言集成¶
GitHub: https://github.com/uzh-rpg/flightmare | Stars: ~1,300 | 论文: CoRL 2020 | 许可: MIT
flightmare的flightlib展示了**现代C++17的多项高级特性**。template<typename EnvBase> VecEnv**实现了向量化并行RL环境——可同时模拟数百架无人机。**ZeroMQ**用于C++物理引擎与Unity渲染器之间的进程间通信,UnityBridge采用**Singleton模式(getInstance())。**pybind11**实现了完整的Python绑定接口。自定义类型别名Vector<3>、Vector<4>简化了Eigen使用。
项目的CMake构建完全独立于ROS,但可选集成catkin——这种灵活的构建策略是现代C++机器人库的发展方向。
推荐精读: flightlib/src/envs/vec_env.cpp(模板化环境)、flightlib/src/bridges/unity_bridge.cpp(ZeroMQ通信)
2.15 LBFGS-Lite — 单文件优化器的极简之美¶
GitHub: https://github.com/ZJU-FAST-Lab/LBFGS-Lite
约**800行C++**的header-only L-BFGS优化器,被ZJU FAST Lab几乎所有项目使用。支持Lewis-Overton线搜索、非光滑C0分段C2函数优化、非凸情况下的cautious更新。这是一个"小而完美"的教学组件——学生可以在一节课内完整阅读并理解整个优化器的实现。
2.16 SUPER — ROS1/ROS2双支持的工程参考¶
GitHub: https://github.com/hku-mars/SUPER | Stars: ~828 | 论文: Science Robotics 2025
SUPER的最大工程亮点是**同时支持ROS1(Noetic)和ROS2(Foxy)**。通过scripts/select_ros_version.sh脚本实现版本切换,多包工作空间结构(super_planner、rog_map、mission_planner、mars_uav_sim)展示了如何组织大型ROS项目。ROGMap::Ptr使用std::make_shared<rog_map::ROGMap>(nh)的共享指针工厂模式。
2.17 IPC — OSQP实时QP求解的集成案例¶
GitHub: https://github.com/hku-mars/IPC | Stars: ~240 | 论文: IEEE RA-L 2023
IPC将规划与控制统一为**100Hz的QP求解问题**,通过**OSQP-Eigen**库将安全飞行走廊约束编码为QP的线性约束。这是讲解"如何在C++中集成QP求解器实现实时控制"的理想案例。项目附带论文PDF,代码与论文可对照阅读。
2.18 AirSim — 大型C++项目架构的工业案例¶
GitHub: https://github.com/microsoft/AirSim | Stars: ~17,000
AirSim的**三层架构**(AirLib平台无关核心→Unreal Engine插件→MavLinkCom通信库)是大型C++项目解耦设计的典范。AirLib的物理引擎和传感器模型全部为**header-only设计**,可用任何C++11编译器独立编译。Factory模式创建不同飞行器配置,Strategy模式适配不同固件(PX4/ArduPilot/SimpleFlight),rpclib实现跨语言API调用。
2.19 rotors_simulator — Gazebo插件架构的标准参考¶
GitHub: https://github.com/ethz-asl/rotors_simulator | Stars: ~1,500 | 论文: Springer 2016
rotors_simulator遵循Google C++风格指南,是学习**Gazebo插件开发**的标准参考。每个传感器/执行器独立实现为ModelPlugin:GazeboMotorModel使用FirstOrderFilter<T>模板模拟电机动力学、GazeboIMUPlugin实现带噪声模型的IMU传感、GazeboWindPlugin模拟风场扰动。boost::bind用于Gazebo事件回调注册,Protobuf用于Gazebo内部消息传输。
2.20 DecompUtil — Header-only几何工具库¶
GitHub: https://github.com/sikang/DecompUtil | Stars: ~200
UPenn GRASP Lab开发的header-only凸分解库,被FASTER、MADER等多个规划器使用。提供椭球分解、种子分解、线段分解、迭代分解等多种自由空间建模方法。纯Eigen实现,API简洁,是讲解"如何设计可复用的C++计算几何库"的优秀案例。
三、可提炼的C++中高级教学主题¶
3.1 模板编程专题¶
主题一:非类型模板参数与编译期计算
- 最佳案例: mav_trajectory_generation — PolynomialOptimization<N>将多项式阶数作为编译期参数
- 进阶案例: ethz-adrl/control-toolbox — <STATE_DIM, CONTROL_DIM, P_DIM, V_DIM, SCALAR, CONTINUOUS>六参数模板
- 嵌入式案例: PX4 Matrix库 — Matrix<Type, M, N>替代Eigen实现零堆分配
主题二:类模板与泛型数据结构
- 最佳案例: ikd-Tree — template <typename PointType> class KD_TREE支持任意点类型
- 进阶案例: voxblox — Layer<VoxelType>/Block<VoxelType>泛型空间索引
- 应用案例: flightmare — template<typename EnvBase> VecEnv向量化RL环境
主题三:CRTP(奇异递归模板模式)
- 最佳案例: PX4 — ModuleBase<T>实现静态分派的模块生命周期管理
- 对比案例: rpg_quadrotor_control — ControllerBase使用传统虚函数多态
- 讨论点: 静态多态 vs 动态多态的性能与灵活性权衡
3.2 并发与多线程专题¶
主题四:std::thread与互斥锁的实战用法
- 最佳案例: ikd-Tree — 主线程操作+后台重建线程的双线程架构
- 进阶案例: voxblox — 三种TSDF积分线程模式(Simple/Merged/Fast),每个函数标注线程安全性
- 嵌入式案例: PX4 uORB — 无锁共享内存发布-订阅
主题五:发布-订阅与事件驱动架构
- 最佳案例: PX4 uORB — 类型安全的uORB::Publication<T>/uORB::Subscription
- ROS1案例: EGO-Planner — Timer驱动FSM + Subscriber回调
- 跨进程案例: flightmare — ZeroMQ实现C++↔Unity进程间通信
3.3 设计模式专题¶
主题六:有限状态机(FSM)模式
- 最佳案例: Fast-Planner — KinoReplanFSM五状态机(INIT→WAIT_TARGET→GEN_NEW_TRAJ→REPLAN_TRAJ→EXEC_TRAJ)
- 复杂案例: PX4 Commander — 含arming/failsafe/mode切换的完整飞行器状态机
- 系统案例: agilicious Pilot — 含Guard安全备份的双流水线状态机
主题七:工厂模式与策略模式
- 工厂案例: agilicious — 从YAML配置动态创建控制器/估计器实例
- 策略案例: voxblox — TsdfIntegratorType枚举选择不同积分器实现
- 策略案例: PX4 Navigator — NavigatorMode基类+Mission/RTL/Loiter派生类
主题八:流水线架构与模块化组合 - 最佳案例: agilicious — 控制器/估计器/参考源运行时可组合切换 - 数据流案例: rpg_mpc三层架构 — 生成的C代码→Eigen封装→ROS控制器 - 工程案例: kr_autonomous_flight — Docker容器化的模块分离
3.4 Eigen高级用法专题¶
主题九:Eigen模板表达式与性能优化
- Block操作: GCOPTER — block<1,3>(i,j)固定大小块访问 vs block(i,j,m,n)动态块
- 逐元素操作: GCOPTER — .cwiseAbs(), .cwiseQuotient(), .cwiseProduct()
- 分解算法: GCOPTER — JacobiSVD用于走廊生成
- 对齐分配: ikd-Tree — std::vector<PointType, Eigen::aligned_allocator<PointType>>
主题十:Eigen::Map与零拷贝接口
- 最佳案例: rpg_mpc — Eigen::Map将ACADO生成的列优先C数组映射为Eigen矩阵
- 应用场景: 封装遗留C代码、与GPU内存交互、避免不必要的数据拷贝
3.5 内存管理与性能专题¶
主题十一:无堆分配与嵌入式C++
- 最佳案例: PX4 — 控制回路中禁止new和std::vector,全部使用固定大小栈分配
- 对比案例: acados生成代码 — 静态内存分配的优化控制求解器
- 讨论: 安全关键系统中的内存确定性要求
主题十二:缓存友好的数据布局
- 最佳案例: Fast-Planner SDFMap — std::vector<double> flat array + 手动3D索引计算
- 对比案例: voxblox — 空间哈希分块存储 vs 连续数组
- 进阶案例: ewok — 3D环形缓冲区(circular buffer)实现高效的滑动窗口ESDF
3.6 库设计与构建系统专题¶
主题十三:Header-only库设计 - 最佳案例: GCOPTER — 完整轨迹优化框架全头文件实现 - 极简案例: large_scale_traj_optimizer — 仅2个头文件 - 单文件案例: LBFGS-Lite — ~800行的完整优化器 - 讨论: 编译时间 vs 使用便捷性的权衡,何时选择header-only
主题十四:库/ROS分离架构
- 最佳案例: voxblox — voxblox/(纯C++库) + voxblox_ros/(ROS封装)
- 现代案例: agilicious — agilib(Eigen依赖) + agiros(ROS绑定)
- 仿真案例: flightmare — flightlib(CMake独立) + flightros(catkin可选)
主题十五:跨语言绑定与代码生成 - pybind11: flightmare — C++物理引擎的Python RL接口 - ACADO代码生成: rpg_mpc — 符号化OCP→C代码→C++封装 - Protobuf序列化: voxblox — 地图持久化与跨节点传输 - RPC通信: AirSim — rpclib实现C++/Python/C#多语言API
3.7 优化库集成专题¶
主题十六:数值优化器的C++集成方法
| 优化库 | 代表项目 | 集成方式 | 问题类型 |
|---|---|---|---|
| LBFGS-Lite | GCOPTER, EGO-Planner | Header-only直接包含 | 无约束非线性 |
| NLopt | Fast-Planner, mav_trajectory_generation | C回调+void*用户数据 | 约束/无约束非线性 |
| OSQP/OSQP-Eigen | IPC | C++封装,稀疏矩阵接口 | 二次规划(QP) |
| ACADO+qpOASES | rpg_mpc, agilicious | 代码生成离线+编译集成 | MPC(OCP→QP) |
| Gurobi | FASTER, MADER | C++ API直接调用 | LP/QP/MIP |
| Mosek | Btraj, TimeOptimizer | C API封装 | QP/SOCP |
| CppAD/CppADCodeGen | control-toolbox | 模板化自动微分 | 动力学求导 |
| CasADi | data_driven_mpc, pinocchio | Python接口+C代码生成 | 符号化NLP |
四、关键发现与教学路径建议¶
从简单到复杂的推荐学习路径¶
第一阶段(C++基础强化): 从LBFGS-Lite(单文件优化器)和large_scale_traj_optimizer(2个头文件)入手,理解header-only库设计和数学库API设计范式。配合mockamap学习基础ROS C++节点开发。
第二阶段(核心数据结构): 精读ikd-Tree学习C++模板类、std::thread和mutex;精读FIESTA学习BFS+链表的增量空间数据结构;精读voxblox学习模板化泛型容器和多线程策略选择。
第三阶段(规划系统架构): 从EGO-Planner学习FSM+Manager架构模式和B-spline优化;从GCOPTER学习MINCO轨迹表示和Eigen高级用法;从Fast-Planner学习完整的感知-规划管线。
第四阶段(控制与MPC): 从rpg_mpc学习Eigen::Map和代码生成工作流;从PX4学习CRTP、uORB和嵌入式C++;从agilicious学习C++17流水线架构和工厂模式。
第五阶段(系统集成): 从kr_autonomous_flight学习专业级C++工程实践(CI/CD、Docker、代码规范);从EGO-Swarm/RACER学习分布式多机协同;从flightmare学习跨语言绑定和现代C++17模式。
项目生态的演进趋势¶
调研显示无人机规控C++项目正在经历三个明显趋势:一是**从C++11向C++17迁移**(agilicious、flightmare、MAVSDK已使用C++17,pinocchio支持C++23);二是**从ROS1-only向ROS1/ROS2双支持过渡**(SUPER、kr_param_map、ego-planner-swarm已提供ROS2分支);三是**从catkin_make向更灵活的CMake独立构建演进**(voxblox、agilicious、flightmare的核心库均可脱离ROS独立构建)。这些趋势直接影响教学内容的设计——现代C++特性和构建系统的灵活性应作为重点。
数据说明:Star数据和活跃度信息基于2026年4月调研时的GitHub公开信息,部分数据为近似值。EFOPT(~18星)等极新项目的star数和文档完整度可能快速变化。agilicious的完整代码可能需要注册获取。ethz-adrl/control-toolbox自2021年后维护有限但架构设计仍具参考价值。
以上项目调研提供了"哪些代码值得读、为什么值得读"的工程全景。接下来的四篇深度技术叙述则从**算法演进史**的角度,对教学大纲中最核心的四个专题进行十年尺度的全景分析。每篇叙述都是独立可读的技术报告,与主大纲章节的对应关系如下:附录 A(轨迹生成)对应 D3-D5,梳理从 Min-Snap 到 MINCO 的十五年演化;附录 B(感知-规划一体)对应 D6-D7,覆盖环境表征、自主探索与 3DGS 新范式;附录 C(MPC 与几何控制)对应 D1-D2,追溯从 SE(3) 控制到神经动力学 MPC 的控制器发展脉络;附录 D(RL 敏捷飞行)对应 D8-D9,复盘从勉强悬停到击败世界冠军的强化学习十年史。建议在学完对应大纲章节后精读相应附录,以获得更深层的理论脉络理解。