主要内容

trimLoopClosures

优化构成图和删除不良循环闭包

描述

poseGraphUpdated= trimLoopClosures (poseGraphObj,trimParams,solverOptions)优化构成图最好满足边缘约束并删除任何不良循环闭合边缘基于残留误差参数中指定trimParams。创建solverOptions输入用poseGraphSolverOptions函数。

函数实现了毕业non-convexity (GNC)方法与截断最小二乘(TLS)健壮的成本结合non-minimal解算器构成图[1]

例子

(poseGraphUpdated,trimInfo)= trimLoopClosures (poseGraphObj,trimParams,solverOptions)返回修剪过程相关的额外信息。

例子

全部折叠

优化一个姿势图基于节点和边缘约束。根据他们的边缘修剪循环封闭残留的错误。

加载数据集,其中包含一个二维图。检查poseGraph对象查看的节点数和循环闭包。

负载grid-2d-posegraph.matpgdisp (pg)
poseGraph属性:NumNodes: 120 NumEdges: 193 NumLoopClosureEdges: 74 LoopClosureEdgeIDs: [120 121 122 123 124 125 126 127 128 129 130…]LandmarkNodeIDs (x0 1双):

情节构成图与IDs,红线表示循环闭包中标识的数据集。提出了网格图中应该遵循的模式,但显示随时间漂移的证据。

显示(pg,“id”,“关闭”);标题(“原来的姿势图”)

图包含一个坐标轴对象。坐标轴对象与原有标题构成图包含3线类型的对象。

优化构成grap使用optimizePoseGraph函数。默认情况下,该函数使用“builtin-trust-region”解算器。因为姿势图包含一些坏循环闭包,结果造成图实际是不可取的。

pgOptim = optimizePoseGraph (pg);图;显示(pgOptim);

图包含一个坐标轴对象。坐标轴对象包含225行类型的对象,文本。

看原始的边缘残留的错误姿势图。最后离群值错误值大说明坏循环闭包。

resErrorVec = edgeResidualErrors (pg);情节(resErrorVec);标题(边缘的边缘残留错误ID”)

图包含一个坐标轴对象。坐标轴对象与标题边缘残留错误通过边缘ID包含一个类型的对象。

某些循环闭包应该削减从构成图基于他们的剩余误差。使用trimLoopClosures函数来修剪therse坏循环闭包。设置最大和截断阈值的微调参数。这个阈值是基于系统的测量精度,应该调整。

trimParams。MaxIterations = 100;trimParams。TruncationThreshold = 25;solverOptions = poseGraphSolverOptions;

使用trimLoopClosures函数与微调参数和规划求解选项。

[pgNew, trimInfo debugInfo] = trimLoopClosures (pg, trimParams solverOptions);

trimInfo关闭输出,绘制循环从优化构成图中删除。通过绘制的残余误差图之前,你可以看到大错误循环闭包被移除。

removedLCs = trimInfo.LoopClosuresToRemove;持有情节(removedLCs 0(长度(removedLCs)),”或“)标题(“边缘残留错误和循环关闭删除)传说(“剩余错误”,“删除循环闭包”)包含(“边缘id”)ylabel (“边缘残留误差”)举行

图包含一个坐标轴对象。坐标轴对象删除标题边缘残留错误和循环闭包包含45行类型的对象。这些对象代表剩余错误,删除循环闭包。


                    

显示新的姿势图与坏循环闭包了。

显示(pgNew“id”,“关闭”);

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。

输入参数

全部折叠

构成图,指定为一个poseGraphposeGraph3D对象。

残留误差参数调整循环闭包,与字段指定为一个结构:

  • MaxIterations——最大允许关闭循环的迭代次数减少,指定为一个正整数。减少迭代,构成图优化基于解算器选项和之外的边缘TruncationThreshold修剪。

  • TruncationThreshold——最大允许残留误差的边缘。这个值在很大程度上依赖于你指定的构成图poseGraphObj。找到一个合适的阈值基于所有的错误使用edgeResidualErrors函数的构成图。

例子:结构(“TruncationThreshold”“MaxIterations”, 10日,20)

数据类型:结构体

造成图像解算器选项,指定为一组参数通过调用生成的poseGraphSolverOptions函数。函数生成一组解算器选项的默认值为指定的姿势图解算器类型:

pgSolverTrustRegion = poseGraphSolverOptions (“builtin-trust-region”)
pgSolverTrustRegion = TrustRegion (builtin-trust-region-dogleg)选项:MaxIterations: 300 MaxTime: 10 FunctionTolerance: 1.0000 e-08 GradientTolerance: 5.0000 e-09 StepTolerance: 1.0000 e-12 InitialTrustRegionRadius: 100 VerboseOutput:“了”
pgSolverG2o = poseGraphSolverOptions (“g2o-levenberg-marquardt”)
pgSolverG2o = G2oLevenbergMarquardt (g2o-levenberg-marquardt)选项:MaxIterations: 300 MaxTime: 10 FunctionTolerance: 1.0000 e-09 VerboseOutput:“了”

修改选项来优化求解参数使用点符号。

pgSolverG2o。MaxIterations = 200;

输出参数

全部折叠

构成图和修剪毛圈闭包,指定为一个poseGraphposeGraph3D对象。

信息从修剪过程中,作为结构返回字段:

  • LoopClosuresToRemove——循环闭合边缘id删除从输入poseGraphObj。这些循环闭包是在输出中删除poseGraphUpdated

  • 迭代——数量的减少迭代执行。

引用

[1],亨,et al。”毕业Non-Convexity健壮的空间知觉:从解决Non-Minimal全球离群值被拒绝。”IEEE机器人与自动化信件,5卷,不。2、2020年4月,页1127 - 34。DOI.org (Crossref),doi: 10.1109 / LRA.2020.2965893。

版本历史

介绍了R2020b