文章目录
- 环境配置修改
- 编译项目
- 运行MSCKF_VIO
- 运行 Launch 文件
- 运行 rviz
- 播放 ROSBAG 数据集
- 运行结果
- 修改mskcf 保存轨迹
- EVO轨迹评价
- EVO轨迹评估流程
- 实操
- 先把euroc的真值转换为tum,保存为data.tum
- 正式评估
- 报错1
- 问题描述
- 报错2
- 问题描述
- 问题分析
- 问题解决
- 参考
环境配置修改
在CMakelists.txt中c++设置为14,OpenCV设置为4
add_compile_options(-std=c++14)
...
find_package(OpenCV 4 REQUIRED)
编译项目
cd ~/catkin_ws
catkin_make --pkg msckf_vio --cmake-args -DCMAKE_BUILD_TYPE=Release
编译完成后,使用以下命令加载 ROS 工作空间环境
source ~/catkin_ws/devel/setup.bash
运行MSCKF_VIO
项目提供了两个 .launch 文件,分别用于 EuRoC 数据集和 Fast Flight 数据集,运行以下命令来启动相应的 VIO 系统:
运行 Launch 文件
- 对于 EuRoC 数据集
roslaunch msckf_vio msckf_vio_euroc.launch
- 对于 Fast Flight 数据集
roslaunch msckf_vio msckf_vio_fla.launch
这会启动两个 ROS 节点:image_processor 和 vio。
运行 rviz
在目录中执行以下命令来运行 rviz :
rviz -d src/msckf_vio/rviz/rviz_euroc_config.rviz
播放 ROSBAG 数据集
rosbag play V1_01_easy.bag
注意,在初始化之前,机器人需要处于静止状态,以便滤波器能够使用前200个IMU消息来正确初始化陀螺仪和加速度计的偏置以及初始姿态。
运行结果
修改mskcf 保存轨迹
这部分完全按照这个进行的修改python2 安装evo 与 评价MSKCF 等slam系统
注意此处是w x y z顺序,而TUM顺序为x y z w
根据这个MSCKF-VIO输出轨迹文件,但没有验证。
https://github.com/symao/msckf_vio/blob/evaluation/src/msckf_vio.cpp
EVO轨迹评价
EVO轨迹评估流程
- 先把euroc的真值转换为tum,记得更改data.csv目录,在euroc
在这里插入代码片
的zip包中可以找到
evo_traj euroc data.csv --save_as_tum
- 正式评测,记得更改相应目录和对应的文件名
#输出轨迹、ape、rpe, p表示plot, va进行轨迹对齐
evo_traj tum vio.txt --ref groundtruth.tum -p -va
evo_ape tum groundtruth.tum vio.txt -p -va
evo_rpe tum groundtruth.tum vio.txt -p -va
实操
先把euroc的真值转换为tum,保存为data.tum
catkin_ws/src/msckf_vio$ evo_traj euroc /mnt/hgfs/Shared/datasets/EuRoC/V1_01_easy/mav0/state_groundtruth_estimate0/data.csv --save_as_tum
--------------------------------------------------------------------------------
name: data
infos: 28712 poses, 58.592m path length, 143.555s duration
--------------------------------------------------------------------------------
Trajectory saved to: data.tum
正式评估
evo_traj tum vio.txt --ref data.tum -p -va
catkin_ws/src/msckf_vio$ evo_traj tum vio.txt --ref data.tum -p -va
--------------------------------------------------------------------------------
Loaded 5805 stamps and poses from: vio.txt
Loaded 28712 stamps and poses from: data.tum
--------------------------------------------------------------------------------
Found 2872 of max. 5805 possible matching timestamps between...reference
and: vio.txt
..with max. time diff.: 0.01 (s) and time offset: 0.0 (s).
--------------------------------------------------------------------------------
Aligning vio.txt to reference.
Aligning using Umeyama's method...
Rotation of alignment:
[[-0.96918837 0.24620687 0.00748809][-0.24626393 -0.96916983 -0.00799443][ 0.00528894 -0.00959215 0.99994001]]
Translation of alignment:
[0.72924937 2.13045627 0.98621442]
Scale correction: 1.0
--------------------------------------------------------------------------------
name: vio
infos:duration (s) 143.5550000667572nr. of poses 2872path length (m) 59.50526035148245pos_end (m) [0.59253062 2.10984284 0.88684343]pos_start (m) [0.72924003 2.13096787 0.98620158]t_end (s) 1403715417.862143t_start (s) 1403715274.307143
--------------------------------------------------------------------------------
name: data
infos:duration (s) 143.5550000667572nr. of poses 28712path length (m) 58.591730330076274pos_end (m) [0.489592 1.967734 0.967288]pos_start (m) [0.878612 2.14247 0.947262]t_end (s) 1403715417.857143t_start (s) 1403715274.3021429
evo_ape tum data.tum vio.txt -p -va
catkin_ws/src/msckf_vio$ evo_ape tum data.tum vio.txt -p -va
--------------------------------------------------------------------------------
Loaded 28712 stamps and poses from: data.tum
Loaded 5805 stamps and poses from: vio.txt
--------------------------------------------------------------------------------
Synchronizing trajectories...
Found 2872 of max. 5805 possible matching timestamps between...data.tum
and: vio.txt
..with max. time diff.: 0.01 (s) and time offset: 0.0 (s).
--------------------------------------------------------------------------------
Aligning using Umeyama's method...
Rotation of alignment:
[[-0.96918837 0.24620687 0.00748809][-0.24626393 -0.96916983 -0.00799443][ 0.00528894 -0.00959215 0.99994001]]
Translation of alignment:
[0.72924937 2.13045627 0.98621442]
Scale correction: 1.0
--------------------------------------------------------------------------------
Compared 2872 absolute pose pairs.
Calculating APE for translation part pose relation...
--------------------------------------------------------------------------------
APE w.r.t. translation part (m)
(with SE(3) Umeyama alignment)max 0.244463mean 0.129176median 0.122528min 0.006008rmse 0.142572sse 58.378097std 0.060334--------------------------------------------------------------------------------
Plotting results...
APE(Absolute Pose Error,绝对位姿误差),用于评估VIO(视觉惯性里程计)或SLAM系统的绝对精度,反映了估计轨迹(vio.txt) 和地面真值(data.tum) 之间在平移方面的误差随时间的变化情况。
-
纵轴 (APE, 单位为米):表示估计轨迹与地面真值之间的绝对误差。数值越大,表示误差越大;数值越小,表示估计越准确。
-
横轴 (时间, t(s)):表示时间,以秒为单位。
-
曲线 (APE):灰色的曲线代表了随时间变化的绝对位姿误差。我们可以看到误差在整个时间段内的波动,表明估计轨迹的准确性在不同时间点存在差异。
-
统计线:
- 蓝色线 (rmse):均方根误差,代表整体误差的一个重要统计量,越小表示估计效果越好。
- 红色线(median):中位数误差,表示误差的中间值,通常能反映误差的分布情况。
- 绿色线(mean):均值误差,表示平均误差值,可以用来衡量整体的误差水平。
- 紫色阴影(std):标准差,表示误差的波动程度。紫色区域越宽,表示误差在不同时间点的波动越大。
-
误差变化趋势:
- 在最开始的时间段,误差波动较大,但整体稳定在一个相对较低的水平(大约 0.10 - 0.15 米之间)。
- 中期段,误差趋于降低,但仍存在一定的波动。
- 在 100 秒之后,误差逐渐增大,达到 0.2 米以上,说明在后续的轨迹估计中误差变得更明显,估计轨迹的准确性有所降低。
-
总结:
- 整体来说,系统的轨迹估计在前期和中期的表现较为稳定,但在后期误差有所增加。
- 均方根误差 (rmse) 和 均值误差 (mean) 都显示在 0.1 - 0.15 米之间,表明总体的误差水平相对可控,但在某些时刻误差波动较大。
- 标准差 (std) 的范围提示我们,误差在时间上的波动性较强,尤其在部分时间段内。
evo_rpe tum data.tum vio.txt -p -va
catkin_ws/src/msckf_vio$ evo_rpe tum data.tum vio.txt -p -va
--------------------------------------------------------------------------------
Loaded 28712 stamps and poses from: data.tum
Loaded 5805 stamps and poses from: vio.txt
--------------------------------------------------------------------------------
Synchronizing trajectories...
Found 2872 of max. 5805 possible matching timestamps between...data.tum
and: vio.txt
..with max. time diff.: 0.01 (s) and time offset: 0.0 (s).
--------------------------------------------------------------------------------
Aligning using Umeyama's method...
Rotation of alignment:
[[-0.96918837 0.24620687 0.00748809][-0.24626393 -0.96916983 -0.00799443][ 0.00528894 -0.00959215 0.99994001]]
Translation of alignment:
[0.72924937 2.13045627 0.98621442]
Scale correction: 1.0
--------------------------------------------------------------------------------
Found 2871 pairs with delta 1 (frames) among 2872 poses using consecutive pairs.
Compared 2871 relative pose pairs, delta = 1 (frames) with consecutive pairs.
Calculating RPE for translation part pose relation...
--------------------------------------------------------------------------------
RPE w.r.t. translation part (m)
for delta = 1 (frames) using consecutive pairs
(with SE(3) Umeyama alignment)max 0.147140mean 0.031982median 0.029215min 0.000090rmse 0.037516sse 4.040794std 0.019612--------------------------------------------------------------------------------
Plotting results...
报错1
问题描述
在项目构建时出现报错 Could not find a package configuration file provided by "random_numbers"
构建过程无法找到 random_numbers 包,这是一个 ROS 包,通常用于生成随机数。
安装 random_numbers 包:
sudo apt-get update
sudo apt-get install ros-noetic-random-numbers
报错2
问题描述
运行 rviz -d src/msckf_vio/rviz/rviz_euroc_config.rviz
时,出现闪退情况。
[ INFO] [1732588553.257890582]: rviz version 1.14.25
[ INFO] [1732588553.257936010]: compiled against Qt version 5.12.8
[ INFO] [1732588553.257940901]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1732588553.264549191]: Forcing OpenGl version 0.
[ INFO] [1732588554.146584297]: Stereo is NOT SUPPORTED
[ INFO] [1732588554.146659189]: OpenGL device: SVGA3D; build: RELEASE; LLVM;
[ INFO] [1732588554.146685523]: OpenGl version: 4.1 (GLSL 4.1) limited to GLSL 1.4 on Mesa system.
*** stack smashing detected ***: terminated
./run2.sh:行 4: 15123 已放弃 (核心已转储) rviz -d src/msckf_vio/rviz/rviz_euroc_config.rviz
问题分析
这个报错表明在运行 rviz 时发生了 “stack smashing”,这是一个与内存管理相关的问题,通常是因为程序访问了未定义或非法的内存区域,导致栈保护机制触发。
OpenGL 驱动问题
根据日志,rviz 在初始化 OpenGL 时出现了以下提示:
- Stereo is NOT SUPPORTED:表明当前显卡或虚拟机环境不支持立体视觉。
- OpenGL device: SVGA3D:这是虚拟机的虚拟显卡。
- OpenGl version: 4.1 (GLSL 4.1):虽然显示支持 OpenGL 4.1,但实际使用的是 Mesa 的软件渲染器。
在虚拟机中,显卡驱动和 OpenGL 支持可能不完善,rviz 依赖 OpenGL 来渲染,因此容易触发类似问题。
问题解决
解决方法
- 启用硬件加速: 在虚拟机设置中启用 3D 硬件加速。
- 更新虚拟机工具: 如果使用 VMware 或 VirtualBox,确保安装了最新版本的虚拟机工具(如 VMware Tools 或 VirtualBox Guest Additions),并启用了 3D 图形支持。
- 尝试使用软件模式运行 RViz: 修改 rviz 配置文件,强制使用软件渲染器运行:
export LIBGL_ALWAYS_SOFTWARE=1
rviz -d src/msckf_vio/rviz/rviz_euroc_config.rviz
export LIBGL_ALWAYS_SOFTWARE=1
是一个环境变量设置,用于告诉 OpenGL 强制使用 软件渲染(Software Rendering)而不是硬件渲染(Hardware Rendering)。它在运行依赖 OpenGL 的程序时非常有用。
具体含义
- LIBGL_ALWAYS_SOFTWARE 是 Mesa 3D 图形库的一个环境变量。
- 设置为 1 时,强制使用 CPU 进行 OpenGL 渲染,而不是依赖 GPU 的硬件加速。
参考
msckf_vio在ubuntu20.04中的编译
msckf-vio 跑Euroc数据集,并用evo进行评估
MSCKF-VIO输出轨迹文件
https://github.com/symao/msckf_vio/blob/evaluation/src/msckf_vio.cpp
rviz global status显示为error的问题解决
运行msckf_vio
运行msckf_vio
msckf-vio 跑Euroc数据集,并用evo进行评估