我有一堆点在垂直的平面上。实际上这架飞机 应该是完全垂直的。但是,当我想象点云时,有一个 与垂直度略微倾斜(接近2度)。目前,我可以计算 只有这种倾向。关于其他错误,我认为没有 转变或类似的东西。
所以,我想更新我的点数据的坐标,使它们位于垂直平面上。我想,我应该做一些改造。它可能只是通过沿X轴旋转。不确定它会是什么。
我想,你了解我的问题。老实说,我很擅长 数学。所以,请让我知道如何更新我的点坐标 躺在确切的垂直平面上。
注意:我正在用c ++实现这一点,并且有许多程序员对这些事情有充分的了解,我在c ++下发布这个问题。
更新
如果我确切地说到目前为止我所做的事情; 我有点云数据表示垂直对象及其周围的事物。 (数据由移动扫描仪收集,可能与正确的世界轴有偏差)。问题是,我不能确切地说我的数据是否存在错误。因此,我使用垂直平面对象(我的数据中也是主导对象)来检查它。实际上,飞机是真正的垂直。但是,当我通过移除异常值来适应飞机时,那个飞机并不是真正垂直的并且具有近2度的倾斜度。因此,我怀疑我的数据有一些错误。所以我想更新我所有的点云(包括平面上的点和代表其他物体的点),以便将这些特定的平面点准确地放置在垂直平面上。然后,我猜,所有的点都会像现实一样更新到正确的位置。那就是应该更新所有(x,y,z)坐标。
作为示例,请参考下图。
左 - 表示原始点云(如您所见,点本身不是垂直的),后面线表示我拟合的垂直平面,红色是天顶线。如你所见,垂直平面倾斜。 所以,我想在右图中更新我的整个数据。然后,在更新后如果我再次适合一个平面(去除异常值),那么它与天顶线完全平行。请帮帮我。
答案 0 :(得分:1)
考虑到我最近在飞机上工作,我或许可以帮到你。首先,为什么这些积分不是共同的?我首先让这些点共面,而不是倾向于(从什么起源?),然后必须修复它们。此外,在你第一次使用这些点是共面的,可以提高效率。
很抱歉,如果这是您不想要的答案,但我需要更多信息才能帮助您。此外,3D数学很难。如果你使用它足够的话,它会开始被砸到你的脑袋里,你永远不会忘记它,特别是如果你经历了我必须经历的头痛。
答案 1 :(得分:1)
我对它做了一些思考,并且因为你想沿着x轴旋转,你的旋转将在xz平面上完成,这意味着我们可以将它变成2D问题。在对维基百科进行一些研究之后,这可能是您的解决方案。
new z = ((x - intended x) * sin(angle)) + (z * cos(angle)) + intended x
我在这里做的是从我们当前的x值中减去我们想要的x值,这样我们就可以使(想要x,0)我们的原点旋转。旋转点后,我将(预期的x,0)添加回我们的坐标,以便我们得到正确的结果。
答案 2 :(得分:1)
根据您获得积分的位置(我猜测某种测量方式)以及您想要使用它们的方式,您可以对数据进行多种不同的操作。
搜索关键字“回归平面”可能有所帮助 - 有几种方法可以找到近似点云的平面,还有几种方法可以将点“捕捉”到平面上。
编辑:您希望围绕由回归平面上法线向量的叉积和所需平面的法线定义的轴应用旋转,以及您选择的点。从您的插图中我可以看出,您可能希望垂直平面物体的底部成为旋转的参考点。
所以你已经得到了你的参考点,现在你想要旋转的轴和角度。您所需要做的就是:
答案 3 :(得分:0)
我再次阅读了你的问题,希望这个答案可以帮到你。如果我还需要了解其他信息,请告诉我。
现在,为了旋转任何东西,必须有一个中心点来旋转。现在你已经能够检测到倾斜角度,所以现在我们需要一个公式来围绕原点旋转一个特定角度的点。此外,由于此问题仅发生在2D平面上,我们可以使用此基本公式来重新调整点。对于任何两个轴x和y:
Theta是您将以逆时针方向旋转的角度。 x'和y'是你的新观点。 x.origin和y.origin是你要到处的点的坐标。现在我不知道我的数学是否100%正确,但如果不是,希望你能改变一两件事就可以了。