Python实现3D刚体平移和旋转

8
我一直在尝试使用Python解决以下问题:
1. 我们有点a、b、c、d组成一个刚体 2. 对该刚体施加了未知的3D平移和旋转 3. 我们现在知道了a、b、c的坐标 4. 我们想要计算d的坐标
目前我所知道的是:
1. 试图使用“直接”的欧拉角计算似乎不是一个好主意,因为会出现万向节锁等问题。 2. 因此第四步涉及到一个转换矩阵,一旦你知道了旋转和平移矩阵,使用这些之一看起来很容易完成这一步骤: - http://www.lfd.uci.edu/~gohlke/code/transformations.py.html - https://pypi.python.org/pypi/euclid/0.01 我无法确定如何根据点a、b、c的“新”坐标计算旋转和平移矩阵。
我知道在一般情况下(非刚体),旋转部分是Wahba's problem,但我认为对于刚体,应该有一种更快的直接计算方法,通过使用这些点来计算一组正交单位向量。

2
你可以使用 http://www.lfd.uci.edu/~gohlke/code/transformations.py.html#line-882 中的 affine_matrix_from_points(abc, abc_new, shear=False, scale=False) 计算“未知的 3D 平移和旋转”矩阵,然后将其应用于 d - cgohlke
谢谢 - 实际上看起来superimposition_matrix在同样的情况下似乎可以解决我的问题?如果您将您上面的评论作为答案,我会接受它! - lost
1个回答

5

针对带有可能扰动的一组对应点的匹配,我使用了奇异值分解(SVD)的方法,该方法似乎存在于numpy中。

这种技术的一个例子(甚至是用Python编写的)可以在这里找到,但我还没有评估其正确性。

你要做的是找到一个“基础变换”或“基础变化”,它将被表示为转换矩阵。假设你的三个已知点不共线,你可以通过以下方式创建初始基础:

  1. 计算向量:x = (b-a) 和 y = (c-a)
  2. 归一化 x(x = x / magnitude(x))
  3. 将 y 投影到 x 上(proj_y = x DOT y * x)
  4. 从 y 中减去投影(y = y - proj_y)
  5. 归一化 y
  6. 计算 z = x CROSS y

这会给你一个初始的 x、y、z 坐标基础 A。对于你的新点,做同样的操作,得到第二个基础 B。现在你需要找到变换 T,它将把 A 中的点转换为 B(基础变化)。这部分很容易。你可以倒置 A 将点转换回正常基础,然后使用 B 转换为第二个基础。由于 A 是正交的,你只需转置 A 即可得到逆矩阵。所以“new d”等于 d * inverse(A) * B。(根据你的表示法,你可能需要使用 B * inverse(A) * d。)

你需要对矩阵有一些熟悉才能理解这些。你的向量和矩阵表示方法将告诉你按哪个顺序乘以矩阵来获取 T(T 是 inverse(A)*B 或 B*inverse(A) 中的一个)。

要从向量 x = (x1, x2, x3)、y = (y1, y2, y3)、z = (z1, z2, z3) 计算出基础矩阵,你可以按以下方式填充它:

| x1 y1 z1 |
| x2 y2 z2 |
| x3 y3 z3 |

1
接受这个答案是因为它提供了一个通用的、高质量的答案,尽管对我的问题的评论实际上更直接地解决了我的问题。 - lost
假设你的三个已知点不共面,而是共线的,对吧? - rschwieb
正确的,已修复。我原本想到了4个非共面点,但是你的更正让我知道只需要3个点。 - Mark Ping

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