VINS-Fusion 官方只有 ROS1 版。现以其 Humble 版( zinuok/VINS-Fusion-ROS2)为底座完成 Jazzy 适配,代码开源:stronghasaki/VINS-ROS2_jazzy,EuRoC MH_01_easy VIO ATE 0.118m(与 ROS1 原版同数量级)。
坑 1:Ceres 2.1.0 CMake 报 CXSparse::CXSparse target 不存在
- 现象:
CMake Error at internal/ceres/CMakeLists.txt:329 (target_link_libraries): Target "ceres" links to: CXSparse::CXSparse but the target was not found. ... An ALIAS target is missing.- 根因:noble 的 SuiteSparse/CMake 打包方式变更,Ceres 2.1.0 自带的
FindCXSparse.cmake找不到新的 imported target。该兼容问题在 Ceres 2.2.0 修复。 - 为什么不能升 Ceres 2.2:VINS-Fusion 与 camera_models(camodocal)大量使用
ceres::LocalParameterization,该类 2.1 已 deprecated、2.2 中移除(替代品Manifold)。升级 = 手改全部因子类,工作量高一个量级。 - 解法:VINS 求解器不使用 CXSparse,直接关闭:
cmake..-DBUILD_TESTING=OFF-DBUILD_EXAMPLES=OFF-DCXSPARSE=OFF- 原理:报错指向的依赖不等于被使用的依赖,先确认依赖的实际使用方,再决定修复路径。
坑 2:编译 loop_fusion 时 cc1plus 被 Killed
- 现象:
c++: fatal error: Killed signal terminated program cc1plus(无任何 error 行,只有 Killed = OOM 签名)。 - 根因:DBoW2 词袋模板代码 + Release
-O3,单翻译单元峰值内存超 2GB;colcon 默认按核数开 8 路并行,8G 内存爆掉。 - 解法:
MAKEFLAGS=-j2 colcon build --parallel-workers1- 原理:模板重度代码在
-O3下内存膨胀是乘法关系(模板实例数 × 优化开销),并行度决定峰值内存,低配机器先限并行度。
坑 3:ros:jazzy 基础镜像缺 OpenCV 开发包
- 现象:colcon 报
Could NOT find OpenCV (missing: OpenCVConfig.cmake)。 - 根因:ros 基础镜像只含运行库,不含开发头文件(
OpenCVConfig.cmake在 dev 包里)。 - 解法:Dockerfile 补装(Boost 三件套为 camera_models 所需):
RUN apt-get install -y libopencv-dev libboost-filesystem-dev \ libboost-program-options-dev libboost-system-dev坑 4:ament symlink install 报 …/config 不存在
- 现象:
ament_cmake_symlink_install_directory() can't find '/ws/src/src/vins/../config/'。 - 根因:CMakeLists 用
install(DIRECTORY ../config/)引用包外目录(zinuok 原仓库 layout 为 workspace 根下 config/),目录结构变化后相对路径断裂。 - 解法:照原 layout 将 config/ 放回包的兄弟目录。
- 原理:CMake 引用包外路径时,编译期不校验、install 期才解析,报错点远离出错点。移植他人仓库先执行
git grep "\.\./"排查此类引用。
下一篇
评测链路的坑:Jazzy 移除了 rosbag1 支持(.bag需转 rosbag2)、VINS 上游vio.csv时间戳被截成整数秒无法对齐真值、evo 的 numpy/scipy 二进制混搭问题。
仓库:https://github.com/stronghasaki/VINS-ROS2_jazzy (Docker 一键复现 + MH_01 基准数字)