我做了一个奇怪的观察,我在问自己是否有人有解释。
假设我们有PointCloud,例如一个完美的圆柱体。这个圆柱体是以某种方式在空间中放置和旋转的。现在,对于这个圆柱体,我们用主成分分析来计算它的质心和特征向量。
现在我可以把它的姿态描述为形式的仿射变换:
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
也是特征向量。这正是你观察到的。
此外,如果你有一个完全对称的圆柱体,那么两个特征值应该相等,并且两个各自的特征向量可以任意选择为与第三个特征向量(圆柱体的轴)正交的平面内的一对正交向量。