定义 3-D 变换估计的准确性 space

Define the accuracy of transformation estimation in 3-D space

我正在使用 Umeyama's SVD method 来估计两个 3-D 点集之间的刚性变换。请参阅下面的代码片段-

Eigen::Matrix4f T_svd;
const pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> trans_est_svd;
trans_est_svd.estimateRigidTransformation(source, target, T_svd);

后来源点集使用上面估计的变换矩阵进行了变换

pcl::PointCloud<pcl::PointXYZ> target_est;
pcl::transformPointCloud(source, target_est, T_svd);

为了计算上述变换估计的准确性,我是这样处理的:

import numpy as np

# target and target_est clouds were saved as csv
y = np.loadtxt(target, delimiter=',')
y_est = np.loadtxt(target_est, delimiter=',')

y_est = np.sqrt(np.sum((y_est)**2, axis=1))
y_sum = np.sqrt(np.sum((y)**2, axis=1))

acc = y_est/y_sum
mean_acc = acc.mean()

上面代码的平均精度显示为 1.0001,这让我怀疑我的方法。

我想知道如何定义 3-D 变换估计的准确性 space。

对我已经在 pcl 用户论坛上给出的答案提供更多见解。

查看基于模型的训练、检测和姿势的等式 1 和 2 来自 Hinsterstoisser 等人的 Texture-Less 严重混乱场景中的 3D 对象估计 。俗称LineMOD。这是刚性物体姿态估计问题的常用方法。

公式 1 适用于 non-symetric 对象,公式 2 适用于对称对象。我无法输入表达式,因为 Stack Overflow 不支持 mathjax,但总体思路是:

  1. 您的点的估计位置与实际位置之间的差异的范数,对所有点求和,并按点数归一化
  2. 第一个的不同之处在于您不再强制您点对应。源云中的每个点都会选择目标云上最近的点。然后像以前一样进行求和和平均。

这不完全是堆栈溢出问题,而是数学交换问题。