2

对于增强现实应用程序,我正在使用一些 slam 算法来预测我手机的当前方向。

该算法 ( LSD-Slam ) 以 SE3 谎言组的形式提供当前姿势(使用Sophus::Sim3f)。如果我做对了,这种类型包含一个矩阵,可以解释为相机的 Viewmatrix。初始化后,例如矩阵如下所示:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

为了可视化 3D 内容,我使用 OpenSceneGraph。Fortunatley,在 OSG 中,您可以使用视图矩阵直接设置相机位置:

camera->setViewMatrix(matrix);

现在,当我运行代码时,如果我围绕 Y(滚动)或 Z(偏航)旋转,事情似乎工作正常。但是当我围绕 X(俯仰)旋转时,我在 OSG 中的数码相机似乎与它应该做的完全相反。

例如:想象一个 3D 模型直接在相机前面。如果我然后慢慢向上倾斜相机(围绕 X),3D 模型也会向上移动,而它实际上应该离开屏幕的底端。我试图用下图来说明这种行为:轴行为

可能有一个非常简单的解决方案,但即使经过数小时的尝试,我也无法解决。如果我理解正确,第一列代表围绕某个轴的旋转,所以我尝试反转单个向量,例如这样做:

u u u 0       -u u u 0          -u -u -u 0
v v v 0   =>  -v v v 0   ...     v v v 0 
n n n 0       -n n n 0           n n n 0
0 0 0 1        0 0 0 1           0 0 0 1

虽然有些尝试确实解决了 Pitch-Issue,但他们却搞砸了另一个轴。至少似乎总是有一个轴是错误的。有人知道我该如何解决这个问题吗?我非常感谢有关此问题的任何提示。

4

2 回答 2

1

再次检查 Sophus 后,我发现我可以分别得到一个旋转矩阵和平移向量。使用这篇文章,我将旋转矩阵转换为欧拉角。使用欧拉角,我可以分别设置每个轴的旋转:

  rotationMatrix.makeRotate(
  osg::DegreesToRadians(-angleZ), osg::Vec3(0,1,0), // roll
  osg::DegreesToRadians(angleX), osg::Vec3(1,0,0) , // pitch
  osg::DegreesToRadians(angleY), osg::Vec3(0,0,1) ); // heading

反转辊终于成功了……

于 2017-02-01T12:29:43.367 回答
1

如果您从库中获得的姿势对应于 OpenGL 视图矩阵,您应该能够将它直接传递给您提到的 osg 相机。

但是,请记住,OSG 采用优先矩阵约定(例如,参见这篇文章),因此您可能需要在矩阵中切换行/列。

如果这不起作用,我建议您确定 Sophus 使用的姿势约定(相对于世界坐标中的哪个静止位置旋转)并重新创建相同的变换是从头开始的 osg。

于 2017-02-01T08:20:13.840 回答