0

我有一堆点位于垂直平面上。实际上,这个平面应该是完全垂直的。但是,当我将点云可视化时,垂直度有轻微的倾斜(接近 2 度)。目前,我只能计算这个倾向。关于其他错误,我认为没有变化或类似的东西。

所以,我想更新我的点数据的坐标,使它们位于垂直平面上。我想,我应该做一些转变。它可能仅通过沿 X 轴旋转。不知道会是什么。

我想,你明白我的问题。老实说,我数学很差。所以,请让我知道如何更新我的点坐标以位于确切的垂直平面上。

注意:因为我在 c++ 中实现这个并且有很多程序员对这些东西有很好的了解,所以我在 c++ 下发布了这个问题。

更新

如果我确切地说我到目前为止所做的事情;我有代表垂直对象+其周围事物的点云数据。(数据由移动的扫描仪收集,可能与正确的世界轴有轴偏差)。问题是,我不能确切地说我的数据是否存在错误。因此,我使用垂直平面对象(这也是我的数据中的主要对象)检查了这一点。实际上,该平面是真正垂直的。但是,当我通过移除异常值来拟合平面时,该平面并不是真正垂直的并且具有近 2 度的倾角。因此,我怀疑我的数据有一些错误。所以我想更新我的所有点云(包括平面上的点和代表其他对象的点),以便将特定的平面点精确地放置在垂直平面上。那么,我猜,所有的点都将更新到它们在现实中的正确位置。也就是说,所有 (x,y,z) 坐标都应该更新。

例如,请参考下图。 在此处输入图像描述

left-表示原始点云(如您所见,点本身不是垂直的),后线表示我拟合的垂直平面,红色是天顶线。如您所见,垂直平面有一个倾斜。所以,我想在正确的图中更新我的整个数据。然后,在更新后如果我再次适合一个平面(去除异常值),那么它与天顶线完全平行。请帮我。

4

4 回答 4

1

考虑到我最近在飞机上工作,我也许可以帮助你。首先,为什么这些点从一开始就不共面?我首先会让这些点共面,而不是让它们倾斜(从什么起源?),然后必须修复它们。此外,让这些点在您第一次开始时共面会提高效率。

抱歉,如果这是您不想要的答案,但我需要更多信息才能为您提供帮助。此外,3D 数学很难。如果你使用它足够多,它就会开始冲击你的大脑,你永远不会忘记它,特别是如果你经历了我不得不经历的头痛。

于 2013-07-07T13:34:29.123 回答
1

我对此做了一些思考,既然你想沿 x 轴旋转,那么你的旋转将在 xz 平面上完成,这意味着我们可以把它变成一个 2D 问题。在对 Wikipedia 进行一些研究之后,这可能是您的解决方案。

new z = ((x - intended x) * sin(angle)) + (z * cos(angle)) + intended x

我在这里所做的是从我们当前的 x 值中减去我们预期的 x 值,以便我们使 (intended x, 0) 我们的原点旋转。旋转该点后,我将 (intended x, 0) 添加回我们的坐标,以便我们得到正确的结果。

于 2013-07-07T14:02:40.240 回答
1

根据你从哪里得到你的观点(我猜是某种测量)以及你想用它们做什么,你可以用你的数据做几件不同的事情。

搜索关键字“回归平面”可能会有所帮助 - 有几种方法可以找到近似点云的平面,还有几种方法可以将点“捕捉”到平面。

编辑:您想要围绕由回归平面上的法线向量与所需平面的法线的叉积定义的轴应用旋转,以及您选择的点。从您的插图中,我认为您可能希望垂直平面对象的底部成为旋转的参考点。

所以你已经有了你的参考点,你现在想要旋转的轴和角度。您需要做的就是:

  1. 翻译(到达您的参考点)
  2. 回转
于 2013-07-07T14:07:52.523 回答
0

我再次阅读了您的问题,希望这个答案对您有所帮助。如果还有什么我需要知道的,请告诉我。

现在,为了旋转任何东西,必须有一个中心点来旋转。现在您已经能够检测到倾斜角度,所以现在我们需要一个公式来将点围绕原点旋转一定角度。另外,由于这个问题只发生在二维平面上,我们可以使用这个基本公式来重新调整点。对于任意两个轴 x 和 y:

Theta 是您将沿逆时针方向旋转的角度。x' 和 y' 是你的新点。x.origin 和 y.origin 是您将要绕过的点的坐标。现在我不知道我的数学是否 100% 正确,但如果不是,希望你能改变一两件事,它会起作用。

于 2013-07-07T15:47:44.537 回答