在估计RGB-D相机轨迹并将其保存到文件中后,我们需要通过将其与地面事实进行比较来评估估计轨迹中的误差。有不同的错误指标。两种突出的方法是绝对轨迹误差(ATE)和相对姿势误差(RPE)。ATE非常适合测量可视 SLAM 系统的性能。相比之下,RPE非常适合测量视觉里程计系统的漂移,例如每秒漂移。
一、准备工作
1.运行rgb-d数据集
(base) dzh@dzh-Lenovo-Legion-Y7000:~$ cd slambook/
(base) dzh@dzh-Lenovo-Legion-Y7000:~/slambook$ cd ORB_SLAM2/
(base) dzh@dzh-Lenovo-Legion-Y7000:~/slambook/ORB_SLAM2$ ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ../TUM_DataSet/freiburg3_walking_xyz ../TUM_DataSet/freiburg3_walking_xyz/associations.txt
运行结束后,可以看到相机的轨迹被保存到了CameraTrajectory.txt
;关键帧的轨迹被保存到了KeyFrameTrajectory.txt
。
2.复制文件
我们可以在ORB-SLAM2的根目录下找到这两个轨迹文件。
然后将运行得到的轨迹文件和数据集自带的groundtruth文件复制到一个文件夹中,然后是两个python脚本,便于操作。
3.解决报错
打开终端输入运行脚本的命令python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
,我的base环境是Python3.9,而评估脚本都是python2的代码,所以运行会出现以下报错并修改脚本:
(base) dzh@dzh-Lenovo-Legion-Y7000:~/slambook/Evaluation$ python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
File "/home/dzh/slambook/Evaluation/evaluate_ate.py", line 153
print "compared_pose_pairs %d pairs"%(len(trans_error))
^
SyntaxError: invalid syntax
python2和python3print的格式不同,python3必须要加上()。
(base) dzh@dzh-Lenovo-Legion-Y7000:~/slambook/Evaluation$ python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
Traceback (most recent call last):
File "/home/dzh/slambook/Evaluation/evaluate_ate.py", line 45, in <module>
import associate
ModuleNotFoundError: No module named 'associate'
复制associate.py到当前文件夹。
(base) dzh@dzh-Lenovo-Legion-Y7000:~/slambook/Evaluation$ python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
Traceback (most recent call last):
File "/home/dzh/slambook/Evaluation/evaluate_ate.py", line 129, in <module>
first_list = associate.read_file_list(args.first_file)
TypeError: read_file_list() missing 1 required positional argument: 'remove_bounds'
def read_file_list(filename,remove_bounds=‘False’):
(yolov5) dzh@dzh-Lenovo-Legion-Y7000:~/slambook/Evaluation$ python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
Traceback (most recent call last):
File "evaluate_ate.py", line 144, in <module>
first_stamps.sort()
AttributeError: 'dict_keys' object has no attribute 'sort'
sorted(first_stamps)
Traceback (most recent call last):
File "/home/dzh/slambook/Evaluation/evaluate_ate.py", line 182, in <module>
plot_traj(ax,first_stamps,first_xyz_full.transpose().A,'-',"black","ground truth")
File "/home/dzh/slambook/Evaluation/evaluate_ate.py", line 95, in plot_traj
interval = numpy.median([s-t for s,t in zip(stamps[1:],stamps[:-1])])
TypeError: 'dict_keys' object is not subscriptable
list(stamps)[1:]
二、绝对轨迹误差 (ATE)
- 仅输出RMSE/cm误差,执行如下命令:
python evaluate_ate.py groundtruth.txt CameraTrajectory.txt
- 输出真实轨迹和预测轨迹以及误差,并直观显示,执行如下命令:
python evaluate_ate.py groundtruth.txt CameraTrajectory.txt --plot result.png
- 输出所有误差,包含平均值,中值等, 执行如下命令:
python evaluate_ate.py groundtruth.txt CameraTrajectory.txt --verbose
三、相对位姿误差 (RPE)
python evaluate_rpe.py groundtruth.txt KeyFrameTrajectory.txt --fixed_delta --plot rpe2.png
四、从图像生成点云
python generate_pointcloud.py path_rgb path_depth path_ply
打开meshlab,然后import mesh,可以查看到数据集第一帧的3D点云。
SLAM是一项和实践紧密相关的技术,再漂亮的数学理论,如果不能转化为可以运行的代码,那就仍是可望而不可及的空中楼阁,没有实际意义。实践出真知,实践出真爱。