当你第一次打开VINS-Fusion的GitHub页面时,可能会被那些简洁的命令行和酷炫的演示视频所吸引。但真正开始动手实践时,从环境配置到成功运行数据集,中间往往隐藏着无数"坑"。本文将带你完整走通整个流程,特别针对Ubuntu 20.04系统下的特殊配置需求,以及如何高效运行Euroc数据集并实现RVIZ可视化。
在开始VINS-Fusion的旅程前,我们需要确保基础环境完全就绪。Ubuntu 20.04作为长期支持版本,提供了稳定的开发环境,但同时也带来了一些特有的配置挑战。
ROS Noetic是专为Ubuntu 20.04设计的ROS版本,安装过程看似简单,但有几个关键点需要注意:
bash复制sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-noetic-desktop-full
安装完成后,务必记得初始化rosdep,这一步经常被忽略但至关重要:
bash复制sudo rosdep init
rosdep update
VINS-Fusion对Ceres Solver的版本有严格要求。官方文档可能推荐最新版本,但实际使用中发现1.14.0版本最为稳定。以下是具体安装步骤:
首先安装依赖项:
bash复制sudo apt-get install -y cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev libsuitesparse-dev
下载并编译指定版本:
bash复制wget http://ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar xvf ceres-solver-1.14.0.tar.gz
cd ceres-solver-1.14.0
mkdir build && cd build
cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j$(nproc)
sudo make install
提示:编译时使用
-j$(nproc)参数可以充分利用多核CPU加速编译过程,节省大量时间。
建议为VINS-Fusion创建独立的工作空间,避免与其他项目产生冲突:
bash复制mkdir -p ~/vins_ws/src
cd ~/vins_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ..
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
Ubuntu 20.04默认安装OpenCV4,而VINS-Fusion最初是为OpenCV3设计的。以下是必须进行的修改:
| 文件位置 | 需要添加的头文件 | 需要替换的变量 |
|---|---|---|
| src/VINS-Fusion/camera_model/include/camera_model/Chessboard.h | #include <opencv2/imgproc/types_c.h>#include <opencv2/calib3d/calib3d_c.h> |
无 |
| src/VINS-Fusion/camera_model/include/camera_model/CameraCalibration.h | #include <opencv2/imgproc/types_c.h>#include <opencv2/imgproc/imgproc_c.h> |
无 |
| 各处使用字体处 | 无 | CV_FONT_HERSHEY_SIMPLEX → cv::FONT_HERSHEY_SIMPLEX |
| 颜色转换处 | 无 | CV_BGR2GRAY → cv::COLOR_BGR2GRAY |
| 图像加载处 | 无 | CV_LOAD_IMAGE_GRAYSCALE → cv::IMREAD_GRAYSCALE |
下表总结了编译过程中可能遇到的典型错误及解决方案:
| 错误信息 | 解决方案 | 相关文件 |
|---|---|---|
| undefined reference to `google::base::CheckOpMessageBuilder' | 确保Ceres版本为1.14.0 | 全局链接问题 |
| 'SLAM_POSE' was not declared in this scope | 更新ROS package.xml中的依赖 | package.xml |
| cv_bridge找不到 | 安装正确版本:sudo apt install ros-noetic-cv-bridge |
CMakeLists.txt |
Euroc数据集是视觉-惯性SLAM研究的黄金标准,包含丰富的室内飞行数据。建议从官方下载MH_01_easy作为入门:
bash复制wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/vicon_room1/V1_01_easy/V1_01_easy.zip
unzip V1_01_easy.zip -d ~/Datasets/Euroc/V1_01_easy
数据集目录结构应保持如下形式:
code复制V1_01_easy/
├── mav0
│ ├── cam0
│ ├── cam1
│ ├── imu0
│ └── leica0
└── ...
运行VINS-Fusion需要同时启动多个节点,合理组织终端布局能极大提升效率。推荐使用tmux或terminator分屏工具:
终端1 - 启动RVIZ可视化:
bash复制roslaunch vins vins_rviz.launch
终端2 - 运行VINS主节点:
bash复制rosrun vins vins_node ~/vins_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
终端3 - (可选)启动回环检测:
bash复制rosrun loop_fusion loop_fusion_node ~/vins_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
终端4 - 播放数据集:
bash复制rosbag play ~/Datasets/Euroc/V1_01_easy/V1_01_easy.bag
注意:如果使用双摄像头配置,需要相应修改配置文件为
euroc_stereo_imu_config.yaml
初次运行后,可能需要根据具体环境调整参数。以下是关键参数及其影响:
| 参数 | 默认值 | 建议调整范围 | 作用 |
|---|---|---|---|
| estimator_type | 1 | 0-2 | 0: 仅视觉, 1: 视觉-惯性, 2: 仅惯性 |
| acc_n | 0.01962 | 0.01-0.05 | 加速度计噪声密度 |
| gyr_n | 0.000174533 | 0.0001-0.0005 | 陀螺仪噪声密度 |
| acc_w | 0.0001962 | 0.0001-0.001 | 加速度计随机游走 |
| gyr_w | 1.74533e-05 | 1e-5-5e-5 | 陀螺仪随机游走 |
使用rqt工具可以实时监控系统资源占用和节点状态:
bash复制rosrun rqt_graph rqt_graph # 查看节点拓扑
rosrun rqt_plot rqt_plot # 绘制数据曲线
rosrun rqt_reconfigure rqt_reconfigure # 动态参数调整
安装evo工具进行定量评估:
bash复制pip install evo --upgrade --no-binary evo
常用评估命令:
bash复制# 绝对位姿误差
evo_ape tum groundtruth.txt estimated.txt -r full --plot --plot_mode xz
# 相对位姿误差
evo_rpe tum groundtruth.txt estimated.txt -r trans_part --delta 1 --delta_unit m --plot --plot_mode xz
为方便环境复现,可以考虑使用Docker容器。以下是Dockerfile示例:
dockerfile复制FROM osrf/ros:noetic-desktop-full
RUN apt-get update && apt-get install -y \
git cmake libgoogle-glog-dev libgflags-dev \
libatlas-base-dev libeigen3-dev libsuitesparse-dev
WORKDIR /root
RUN git clone https://github.com/ceres-solver/ceres-solver.git && \
cd ceres-solver && \
git checkout 1.14.0 && \
mkdir build && cd build && \
cmake .. -DBUILD_TESTING=OFF && \
make -j8 && make install
RUN mkdir -p /root/catkin_ws/src && \
cd /root/catkin_ws/src && \
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
WORKDIR /root/catkin_ws
RUN /bin/bash -c '. /opt/ros/noetic/setup.bash; catkin_make'
构建并运行容器:
bash复制docker build -t vins-fusion .
docker run -it --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" vins-fusion
在实际项目中,我发现数据集路径的正确设置往往是新手最容易出错的地方。有一次调试了三小时才发现是因为rosbag play时使用了相对路径而非绝对路径。另一个常见问题是RVIZ中无法显示轨迹,这通常是因为global_options/fixed_frame没有正确设置为"world"。