主要内容

利用位姿图减少三维视觉里程计轨迹漂移

这个例子展示了如何使用三维姿态图优化减少单目摄像机估计轨迹(位置和方向)中的漂移。视觉里程计估计相机当前的全局姿态(当前帧)。由于三维点三角剖分匹配不佳或存在误差,使得机器人的轨迹往往偏离地面实际。环路闭合检测和位姿图优化可以减少这种漂移并纠正错误。

负载估计的姿态图优化

加载估计的相机姿态和环路闭合边缘。估计的相机姿态是用视觉里程计计算的。循环闭合边缘的计算方法是找到看到当前场景的前一帧,并估计当前帧和循环闭合候选帧之间的相对姿态。相机帧从[1]中采样。

%估计姿势负载(“estimatedpose.mat”);% Loopclosure边缘负载(“loopedge.mat”);% Groundtruth相机位置负载(“groundtruthlocations.mat”);

构建三维姿态图

创建一个空的姿势图。

pg3D = poseGraph3D;

在位姿图中添加节点,用边定义位姿图的相对位姿和信息矩阵。转换估计的姿态,给出的转换,相对姿态作为一个[x y qw qx qy qz]向量。每个姿态的信息矩阵使用单位矩阵。

len =大小(estimatedPose, 2);信息矩阵= [1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1];在所有连续帧之间插入相对姿态k = 2:兰当前帧和前一帧之间的相对姿态relativePose = estimatedPose {k - 1} / estimatedPose {k};%用四元数表示的相对方向relativeQuat = tform2quat (relativePose);%相对位姿为[x y qw qx qy qz]relativePose = [tform2trvec (relativePose) relativeQuat);添加姿势到姿势图addRelativePose (pg3D relativePose informationmatrix);结束

添加一个循环闭合边。将当前帧的两个现有节点之间的这条边添加到上一帧。

%转换姿势从变换到姿势向量。relativeQuat = tform2quat (loopedge);relativePose = [tform2trvec (loopedge) relativeQuat);%循环候选人loopcandidateframeid = 1;%当前帧currentframeid = 100;addRelativePose (pg3D relativePose informationmatrix,...loopcandidateframeid currentframeid);图显示(pg3D);

图中包含一个坐标轴。轴包含6个类型为line, text的对象。

优化姿势图。基于边缘约束对节点进行调整,以改善整体姿态图。为了看到漂移的变化,根据地面真实绘制估计的姿态和新的优化姿态。

位姿图优化optimizedPosegraph = optimizePoseGraph (pg3D);optimizedposes =节点(optimizedPosegraph);%摄像机轨迹图figure estimatedpose = nodes(pg3D);plot3 (estimatedposes (: 1) estimatedposes (:, 2), estimatedposes (:, 3),“r”);持有plot3 (groundtruthlocations (: 1) groundtruthlocations (:, 2), groundtruthlocations (:, 3),‘g’);plot3 (optimizedposes (: 1) optimizedposes (:, 2), optimizedposes (:, 3),“b”);持有传奇(“估计姿势图”“地面真实姿势图”“优化构成图”);视图(-20.8,-56.4);

图中包含一个坐标轴。轴线包含3个线型对象。这些物体分别代表估计位姿图、地面真实位姿图、优化位姿图。

参考文献

[1] Galvez-López, D,和J. D. Tardós。用于图像序列中快速位置识别的二进制词袋。IEEE机器人学报。第28卷第5期,2012年,第1188-1197页。