点云的规范位姿
Canonical Pose of PointCloud
我有一个奇怪的观察,我在问自己是否有人有解释。
假设我们有 PointCloud,例如一个完美的圆柱体。这个圆柱体以某种方式放置并在 space 中旋转。现在对于这个圆柱体,我们通过主成分分析计算它的质心和特征向量。
现在我可以将其姿势描述为以下形式的仿射变换:
Eigen::Affine3d pose;
pose.translation << centroid[0], centroid[1], centroid[2];
pose.linear() = evecs;
现在假设我想将对象转换为明确的规范姿势,那么我将执行以下操作:
obj.transform(obj.getPose().inverse());
通过这个,我会将对象转换到它的局部坐标系中,因此它是规范的姿势。 obj.getPose()
会在重新计算它的新特征向量和质心位置(然后应该在 (0,0,0))之后再次构建它的新姿势。
在我这样做之后,最终对象的新的、规范的姿势有时是这样的:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
所以单位矩阵。我会预料到这一点,但有时我会得到这个:
-1 0 0 0
0 -1 0 0
0 0 1 0
0 0 0 1
我真的无法向自己解释这种行为,而且我在比较姿势时给我带来了问题。你知道为什么会这样吗?
特征向量不是唯一定义的,如果v
是一个特征向量那么-v
也是一个特征向量。这正是您所观察到的。
此外,如果你有一个完全对称的圆柱体,那么两个特征值应该相等,并且可以任意选择两个各自的特征向量作为与第三个特征向量(圆柱体的轴)正交的平面内的一对正交向量).
我有一个奇怪的观察,我在问自己是否有人有解释。
假设我们有 PointCloud,例如一个完美的圆柱体。这个圆柱体以某种方式放置并在 space 中旋转。现在对于这个圆柱体,我们通过主成分分析计算它的质心和特征向量。
现在我可以将其姿势描述为以下形式的仿射变换:
Eigen::Affine3d pose;
pose.translation << centroid[0], centroid[1], centroid[2];
pose.linear() = evecs;
现在假设我想将对象转换为明确的规范姿势,那么我将执行以下操作:
obj.transform(obj.getPose().inverse());
通过这个,我会将对象转换到它的局部坐标系中,因此它是规范的姿势。 obj.getPose()
会在重新计算它的新特征向量和质心位置(然后应该在 (0,0,0))之后再次构建它的新姿势。
在我这样做之后,最终对象的新的、规范的姿势有时是这样的:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
所以单位矩阵。我会预料到这一点,但有时我会得到这个:
-1 0 0 0
0 -1 0 0
0 0 1 0
0 0 0 1
我真的无法向自己解释这种行为,而且我在比较姿势时给我带来了问题。你知道为什么会这样吗?
特征向量不是唯一定义的,如果v
是一个特征向量那么-v
也是一个特征向量。这正是您所观察到的。
此外,如果你有一个完全对称的圆柱体,那么两个特征值应该相等,并且可以任意选择两个各自的特征向量作为与第三个特征向量(圆柱体的轴)正交的平面内的一对正交向量).