【发布时间】:2021-11-23 03:40:02
【问题描述】:
我有两个元素数量相同的二维点云。对于这些元素,我知道它们的对应关系,即对于 PC1 中的每个点,我都知道 PC2 中的对应元素,反之亦然。
我现在想估计这两个点云之间的旋转。也就是说,我想找到角度alpha,我必须围绕原点旋转PC1中的所有点,以使PC1和PC2中对应点之间的距离最小。
我可以使用 scipy 的线性优化器解决这个问题(见下文);但是,这种优化位于我的代码关键路径的循环内,是当前的瓶颈。
import numpy as np
from scipy.optimize import minimize_scalar
from math import sin, cos
# generate some data for demonstration purposes
# points in each point cloud are ordered by correspondence
num_points = 10
distance = np.random.rand(num_points) * 3
radii = np.random.rand(num_points) * 2*np.pi
pc1 = distance[:, None] * np.stack([np.cos(radii), np.sin(radii)], axis=1)
distance = np.random.rand(num_points) * 3
radii = np.random.rand(num_points) * 2*np.pi
pc2 = distance[:, None] * np.stack([np.cos(radii), np.sin(radii)], axis=1)
# solve using scipy
def score(alpha):
rot_matrix = np.array([
[cos(alpha), -sin(alpha)],
[sin(alpha), cos(alpha)]
])
pc1_rotated = (rot_matrix @ pc1.T).T
sum_of_squares = np.sum((pc2 - pc1_rotated)**2, axis=1)
mse = np.mean(sum_of_squares)
return mse
# simple solution via scipy
result = minimize_scalar(
score,
bounds=(0, 2*np.pi),
method="bounded",
options={"maxiter": 1000},
)
if result.success:
print(f"Best angle: {result.x}")
else:
raise RuntimeError(f"IK failed. Reason: {result.message}")
对于这个问题有更快(可能是分析)的解决方案吗?
【问题讨论】:
标签: python numpy optimization scipy rotation