最近整理并开源了一个 MINCO 轨迹优化库:traj_opt。
它基于原有 GCOPTER 代码优化而来,支持 2D / 3D 轨迹和多种优化问题变形,并刻意做成与 ROS 解耦的纯 C++ 头文件库,方便集成到 ROS 1、ROS 2 或普通 CMake 项目中。
项目地址:
1. 项目来源与主要改进
原始项目是浙江大学 FAST Lab 的 GCOPTER:
- GCOPTER:https://github.com/ZJU-FAST-Lab/GCOPTER
- MINCO 论文:https://arxiv.org/abs/2103.00190
GCOPTER 是一个基于 MINCO 的多旋翼轨迹优化器,支持动力学约束和用户自定义约束。traj_opt 在此基础上主要做了这些整理:
- 统一支持 2D 和 3D 轨迹;
- 增加多种时间约束和优化目标;
- 提供
optimize_v1()、optimize_v2()、optimize_v3()三种接口; - 做成纯头文件 C++ 库,不依赖 ROS;
- 补充详细的头文件注释、参数说明和测试示例。
核心库使用 C++17 和 Eigen3。位置约束通过回调函数传入,因此不会绑定某一种地图或 ESDF 实现。
2. 先看测试示例:2D、3D 都能直接跑
仓库的 test 目录提供了比较完整的使用参考:
test_minco_optimizer_v1.cpptest_minco_optimizer_v2.cpptest_minco_optimizer_v3.cppplot_minco_result.py
测试程序覆盖了:初始状态、目标位置、中间航路点、时间分配、物理约束、位置违反量、梯度回调、优化和 JSON 结果绘图。2D 示例使用圆形障碍物,3D 示例使用球形障碍物。
编译并运行:
bash
mkdir build && cd build
cmake .. -DBUILD_TESTING=ON
make
cd ../test
# v1:自由总时间,分别运行 3D 和 2D
./../build/test/test_minco_optimizer_v1
./../build/test/test_minco_optimizer_v1 2d
# v2:固定总时间
./../build/test/test_minco_optimizer_v2
./../build/test/test_minco_optimizer_v2 2d
绘制结果:
bash
python plot_minco_result.py minco_result_2d.json 2d
python plot_minco_result.py minco_result_3d.json 3d


3. 三种优化形式和约束接口
optimize_v1():轨迹总时间自由
起点PVA固定,优化每段时间、中间航路点和末端 PVA 状态,目标主要是:
text
时间代价 + 能量代价
适合在轨迹耗时、平滑性和能量之间自动权衡。
和gcopter不同,此处末端 PVA 状态也作为优化变量没有固定,但被限制在一个球形区域内,可以设置该球形区域半径为零来达到固定末端状态的目的,因此比直接固定末端位置更加通用。
optimize_v2():固定轨迹总时间
总时间固定,优化中间航路点、末端 PVA 和段时间分配,目标主要是:
text
末端位置误差 + 能量代价
适合任务已经规定总时长的情况。
optimize_v3():自由时间 + 末端位置代价
总时间不固定,同时考虑时间代价、能量代价和末端位置误差:
text
时间代价 + 末端位置误差 + 能量代价
三个版本都支持 2D / 3D,通过模板参数指定维度:
cpp
minco_optimizer::MINCO_Optimizer<2> optimizer2d;
minco_optimizer::MINCO_Optimizer<3> optimizer3d;
库还提供速度、角速度、倾角、推力和位置等约束配置。位置约束回调返回违反量、位置梯度和时间梯度,可以接入圆形/球形障碍物、ESDF、栅格地图或动态障碍物。
4. 安装与集成到 ROS 1 / ROS 2
编译测试
bash
git clone https://github.com/shupx/traj_opt.git
cd traj_opt
./compile.sh
# 或:./compile.sh -c
如果使用 Gitee:
bash
git clone https://gitee.com/shu-peixuan/traj_opt.git
作为子目录集成
这是 README 推荐的方式。把仓库放到自己的工程中:
cmake
add_subdirectory(traj_opt)
target_link_libraries(your_target PRIVATE traj_opt::traj_opt)
源码中直接包含:
cpp
#include "traj_opt/minco_optimizer.hpp"
这种方式适合放进 ROS 1 catkin、ROS 2 ament / colcon 或普通 CMake 工程一起编译,不需要库本身依赖 ROS。
安装后使用
bash
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../install
make install
在其他工程中:
cmake
find_package(traj_opt REQUIRED)
target_link_libraries(your_target PRIVATE traj_opt::traj_opt)
如果安装路径不是系统默认路径,可以设置:
bash
cmake .. -DCMAKE_PREFIX_PATH=/path/to/traj_opt/install
5. 适用场景
traj_opt 更适合作为轨迹规划后端,接在 A*、RRT 等路径搜索器后面,用于:
- 无人机轨迹平滑和优化;
- 2D 移动机器人轨迹优化;
- 3D 无人机避障;
- 编队和多旋翼轨迹生成;
- 带速度、推力和倾角约束的轨迹规划;
- ROS 1 / ROS 2 之间复用同一套 C++ 优化代码。
它本身不负责路径搜索、建图或发布 ROS topic,提供的是一个独立、可嵌入的 MINCO 轨迹优化后端。
如果你正在使用 GCOPTER,或者想在 ROS 工程中接入 MINCO,可以先运行 test 示例,再把示例中的位置约束回调替换成自己的地图查询接口。
项目地址:
- GitHub:https://github.com/shupx/traj_opt
- Gitee:https://gitee.com/shu-peixuan/traj_opt
- 原始 GCOPTER:https://github.com/ZJU-FAST-Lab/GCOPTER
参考资料:
- MINCO 论文:https://arxiv.org/abs/2103.00190
- GCOPTER 论文:https://doi.org/10.1109/TRO.2022.3160022