基于 openvins 的 square root filter based VIO 实现,参考 ultra fast VINS。
| 依赖项 | 版本要求 |
|---|---|
| ROS | Noetic 或其他版本 |
| CMake | >= 3.10 |
| C++ 编译器 | C++17 支持 |
| OpenCV | >= 4.0 |
| Eigen3 | - |
| Boost | - |
| Google glog | libgoogle-glog-dev |
source /opt/ros/noetic/setup.bashmkdir -p build && cd build
cmake ..
make -j$(nproc)mkdir -p build && cd build
cmake -DVIO_FILTER=SRF ..
make -j$(nproc)mkdir -p build && cd build
cmake -DVIO_FILTER=SRF -DVIO_USE_FLOAT=ON ..
make -j$(nproc)💡 提示: 编译完成后,可执行文件位于
build/application/vio_sim/mono_vio
| 选项 | 说明 | 状态 |
|---|---|---|
EKF |
扩展卡尔曼滤波器(默认) | ✅ 推荐 |
SRF |
平方根滤波器(Square Root Filter) | ✅ 推荐 |
SRIF |
平方根信息滤波器(Square Root Information Filter) |
⚠️ 注意: 当前 SRIF 实现存在精度问题,不推荐用于生产环境
| 选项 | 说明 | 默认值 |
|---|---|---|
VIO_USE_FLOAT |
使用浮点数而非双精度 | ON (SRF 推荐开启,SRIF 不推荐使用) |
VIO_BUILD_TEST |
编译单元测试 | OFF |
VIO_ENABLE_VISUALIZATION |
启用可视化 | OFF |
mono_vio 是样例程序,用于处理 ROS bag 文件中的 IMU 和相机数据,并输出轨迹估计结果。
./build/application/vio_sim/mono_vio -c <配置文件> -d <bag文件路径> [选项]| 参数 | 长参数 | 说明 | 必需 |
|---|---|---|---|
-c |
--config |
配置文件路径(YAML 格式) | ✅ |
-d |
--dataset |
ROS bag 文件路径 | ✅ |
-t |
--trajectory |
保存轨迹文件的路径(TUM 格式) | ❌ |
-l |
--log |
保存日志文件的目录路径 | ❌ |
配置文件需要包含以下内容:
VIO 系统的主要参数配置:
- 特征跟踪参数(KLT、特征点数量等)
- 滤波器参数(滑动窗口大小、SLAM 特征数量等)
- 初始化参数
- 相机和 IMU 的相对配置文件路径
IMU 传感器参数:
- IMU 噪声参数
- ROS 话题名称
- 更新频率
相机标定参数:
- 相机内参(焦距、主点、畸变系数)
- 相机到 IMU 的外参(旋转和平移)
- ROS 话题名称
- 相机分辨率
📁 配置文件示例位于
config/euroc_mav/目录下
./build/application/vio_sim/mono_vio \
-c ./config/euroc_mav/estimator_config.yaml \
-d /path/to/your/dataset.bag./build/application/vio_sim/mono_vio \
-c ./config/euroc_mav/estimator_config.yaml \
-d /path/to/your/dataset.bag \
-t ./trajectory_output.txt./build/application/vio_sim/mono_vio \
-c ./config/euroc_mav/estimator_config.yaml \
-d /path/to/your/dataset.bag \
-t ./trajectory_output.txt \
-l ./log_output/TUM 格式的轨迹文件,包含时间戳、位置和四元数姿态:
timestamp tx ty tz qx qy qz qw
包含系统运行日志,包括:
- VIO 位置、速度、姿态
- IMU 偏置
- 真值位置(如果 bag 文件中包含
/gt_pose话题)
-
ROS 环境: 虽然
mono_vio从 bag 文件读取数据,但需要 ROS 环境来解析 bag 文件格式 -
配置文件路径: 配置文件中的相对路径(如
relative_config_imu和relative_config_imucam)是相对于主配置文件所在目录的 -
真值对齐: 如果 bag 文件中包含
/gt_pose话题,程序会自动对齐 VIO 估计和真值轨迹 -
性能优化:
- 可以通过配置文件调整特征点数量 (
num_pts) - 调整跟踪频率 (
track_frequency) 可以平衡精度和计算量 - 使用多线程可以加速处理(在配置文件中设置
num_opencv_threads)
- 可以通过配置文件调整特征点数量 (
| 问题 | 解决方案 |
|---|---|
| 配置文件解析错误 | 检查 YAML 文件格式是否正确,路径是否正确 |
| Bag 文件读取错误 | 确认 bag 文件路径正确,且包含所需的 IMU 和相机话题 |
| 话题名称不匹配 | 检查配置文件中的 rostopic 是否与 bag 文件中的话题名称一致 |
SRF (Square Root Filter) 是项目支持的三种滤波器之一,使用平方根形式的协方差矩阵,具有更好的数值稳定性和计算效率。
💡 当启用
VIO_USE_FLOAT=ON时,SRF 使用单精度浮点数,可以进一步提升性能。
mkdir -p build && cd build
cmake -DVIO_FILTER=SRF ..
make -j$(nproc)mkdir -p build && cd build
cmake -DVIO_FILTER=SRF -DVIO_USE_FLOAT=ON ..
make -j$(nproc)编译时会显示以下信息确认 SRF 已启用:
-- VIO: USE SRF enabled
-- VIO: USE FLOAT enabled (如果启用了 VIO_USE_FLOAT)
SRF 版本的 mono_vio 使用方法与标准版本完全相同:
./build/application/vio_sim/mono_vio \
-c ./config/euroc_mav/estimator_config.yaml \
-d /path/to/your/dataset.bag \
-t ./trajectory_output.txt项目包含 SRF 滤波器的单元测试,用于验证滤波器实现的正确性。
mkdir -p build && cd build
cmake -DVIO_FILTER=SRF -DVIO_BUILD_TEST=ON ..
make -j$(nproc)./build/msckf/test_filters_srf测试会验证以下功能:
- ✅ 状态更新 (Update)
- ✅ 协方差初始化 (Initialize)
- ✅ 状态传播 (Propagation)
- ✅ 边缘化 (Marginalize)
- ✅ 状态克隆 (Clone)
- ✅ 克隆增强 (AugmentClone)
- ✅ 传播和克隆组合 (PropagationAndClone)
- ✅ 边缘协方差提取 (GetMarginalCovariance)
所有测试通过时会显示类似以下信息:
[==========] Running X tests from 1 test case.
[----------] Global test environment set-up.
[----------] X tests from FilterSRFTest
[ RUN ] FilterSRFTest.Update
[ OK ] FilterSRFTest.Update
...
[==========] X tests from 1 test case ran.
[ PASSED ] X tests.
| 特性 | EKF | SRF | SRIF |
|---|---|---|---|
| 数值稳定性 | 标准 | 更好(平方根形式) | 较好(信息矩阵形式) |
| 计算效率 | 标准 | 更高(特别是启用浮点数时) | 中等 |
| 内存使用 | 标准 | 可能更少(浮点数模式) | 标准 |
| 精度 | 双精度 | 单精度(浮点数模式)或双精度 | |
| 生产就绪 | ✅ 是 | ✅ 是 | ❌ 否(存在已知问题) |
- SRF + 浮点数: 适用于对性能要求高、对精度要求适中的实时应用 ⭐ 推荐
- EKF: 适用于对精度要求极高的应用场景 ⭐ 推荐
- SRIF:
⚠️ 当前实现存在精度问题,仅用于研究和测试,不推荐用于生产环境
如果需要切换滤波器类型,建议清理构建目录:
rm -rf build
mkdir build && cd build
cmake -DVIO_FILTER=SRF .. # 或其他滤波器选项
make -j$(nproc)