ArUco姿态估计中的不稳定值

3
我正尝试使用Aruco标记找到相机的方向。从旋转矩阵中提取的欧拉角在某个点之后变得不稳定。随着相机与标记之间的距离增加,相机的偏航角值变得不稳定。标记上的“Z”轴会翻转。欧拉角很抖动,在每个帧中都不相同,并需要时间稳定。我该如何获得一些可靠的偏航角和相机与标记之间的距离值?我正在寻找相对于静态标记的移动相机的姿势。我实现了solvePnP和solvePnPRansac,但都得到不稳定的结果。通过从estimatePoseSingleMarker估计旋转向量转换得到的旋转矩阵在某个点之前看起来还可以,但是失去了稳定性。我该怎么做?谢谢
2个回答

10
一般来说,单个标记无法准确估计相机的姿态。解决方法是增加更多的标记。您可以使用标记板或更稀疏的标记模式。
随着单个标记距离相机越远,有几个因素会降低标记姿态估计的准确性。
  1. 标记的投影大小变小并且被像素网格量化。距离通过逆透视除法估计,因此随着距离的增加,精度变得不那么准确。
  2. 透视畸变减少,接近平行投影。在平行投影中,标记有两个同样可行的方向,可能会交替返回(请参见 https://en.wikipedia.org/wiki/Necker_cube)。标记相对于相机的方向也很重要 - 在标记的更垂直视图(正交投影)中,标记的俯仰和偏航是不明确的,与斜视图相比。随着距离的减小,透视畸变减少使这种效应更加严重,并将导致计算出的相机姿态偏航、俯仰和侧移。
  3. 由于标记中像素数量较少,小尺度效应如传感器噪声和量化变得更加显著,从而降低了帧与帧之间的稳定性并导致抖动。
正如您所发现的那样,姿态估计在单个标记的近距离斜视图中运作良好,因为传递给solvePnP()的投影点相距较远且具有很大的透视畸变。通过添加更多的标记,您始终拥有solvePnP()的理想投影点。

谢谢。这确实很有用。我能实现某种过滤技术来稳定数值吗? - slayer2309
我添加了另一个标记,它与第一个标记相邻。我得到了两组不同的结果。这两组值之间存在一些轻微的差异。由于每个标记都有2组值,我很困惑应该考虑哪些值。 - slayer2309
你需要知道所有标记物的角落相对于某个三维坐标系的位置,因此首先要进行测量。尽可能检测到多个标记物,建立3D角点坐标和相应的投影2D坐标列表,并传递给solvePnP()函数。这将为您提供相机姿态的最佳拟合解,涵盖所有可见标记物的所有角点。与使用estimatePoseSingleMarker()单独解决每个标记物的问题相比,它将更加稳定,后者存在上述所有问题。 - Chungzuwalla
最简单的解决方案是使用ArUco板,它可以为您执行我所描述的所有步骤。请注意,“板”不需要是标记的常规网格,甚至不需要是平面的。我已经为覆盖有标记的立方体定义了一个“板”,它可以正常工作。只需确保您的“板”尽可能与实际标记的排列匹配即可。 - Chungzuwalla
嘿,你能提供一些研究论文的线索吗?这些论文描述了你在回答中提到的影响吗? - slayer2309

0
由于算法中的其他角度是相互依赖的,请确保检查滚动值是否相应变化。这将对z-flip起到最大的影响,因此只需制作基本滤波器以避免噪音。

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接