我有一些点 Cloud 从一个类似kinect的仪器中取出,安装在三脚架上然后旋转 . 如何准确确定旋转轴?我正在使用c PCL和Eigen .
我可以将点 Cloud 与ICP匹配并运行全局注册(SLAM或ELCH)以获得组合点 Cloud ,但出于多种原因,我希望能够准确地确定轴并迫使注册遵循此旋转 .
与此问题相关的一个问题是我的乐器的起源 . 我可以非常准确地测量距设备外部尺寸到旋转轴的距离,但我不确切知道设备末端的原点在哪里 . 解决这个问题可以帮助我找到原点 .
我正在考虑两种方法 .
一种是获取已注册点 Cloud 的变换矩阵,并提取表示变换将在当前位置投影内部原点的位置的平移向量 . 对于以这种方式获得的点集,我可以尝试拟合圆,并且中心点将表示从原点到旋转轴的矢量,并且圆的法线方向将是轴的方向 .
另一个选项是直接从任何单个旋转矩阵确定旋转轴,但是旋转轴的矢量似乎是不稳定的 .
有关该问题的更好的解决方案或见解?
3 回答
您需要计算惯性张量的主轴 . https://en.m.wikipedia.org/wiki/Moment_of_inertia .
可以认为所有点具有相同的质量 . 然后你可以使用Steiner方法 .
这不是对原始问题的回答,但澄清了关于在两个位置之间确定旋转轴的讨论
深度冻结 . 这是一个Octave脚本,用于演示我们在聊天中讨论的内容 . 我知道在没有提出答案时发表答案可能是不好的做法,但我希望这能让你深入了解我试图解释翻译矢量和旋转轴上的点之间的关系(t_i在你的符号) .
一个选项是将棋盘放置在~1 [m] . 使用kinect相机制作不同旋转的图像,孔棋盘仍然可见 . 使用OpenCV调整棋盘 .
目标是找到不同方向的棋盘的xyz坐标 . 使用相机api功能确定棋盘的xyz坐标或执行以下操作:
确定相机1和2的相机内在因素 . (同时使用彩色和红外图像作为kinect) .
确定相机外部设备(相机2 [R,t]相机1)
使用这些值计算投影矩阵
使用棋盘的triangulate the points投影矩阵获取[X,Y,Z]和相机1坐标系中的坐标 .
每组棋盘点称为[x_i] . 现在我们可以写出等式:
Update: 这个等式可以用非线性求解器求解,我使用ceres-solver .
结果我得到了:
角度结果相当不错10度 . 这些甚至可以修复我的情况,因为我从旋转阶段非常准确地知道旋转 . t和轴有一个小的差异 . 这是由于我的虚拟立体声相机模拟中的不准确造成的 . 我的棋盘方块不是正方形,尺寸也有点偏......
我的模拟脚本,图像,结果:blender_simulation.zip