将设备姿势转换为相机姿势

时间:2015-10-06 16:53:45

标签: matrix depth google-project-tango

我正在使用相机内在(fx,fy,cx,cy,width,hight)来存储TangoXyzIjData.xyz缓冲区的深度图像。因此,我为xyz的每个点计算相应的图像点并存储其z值

x' = (fx * x) / z + cx
y' = (fy * y) / z + cy
depthImage[x'][y'] = z

现在我想存储相应的姿势数据。我正在使用TangoXyzIjData.timestamp的时间戳和以下函数

getPoseAtTime(double timestamp, TangoCoordinateFramePair framePair)

with framepair

new TangoCoordinateFramePair(TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, TangoPoseData.COORDINATE_FRAME_DEVICE)

问题在于姿势是设备帧与服务帧的开始。并且深度图像从深度相机帧获得其点。我怎样才能匹配它们?

有一种方法可以通过以下方式将深度相机点转换为设备帧:

  1. depth2IMU =深度相机帧与IMU帧
  2. device2IMU =设备帧与IMU帧
  3. device2IMU ^ -1 =反转设备帧与IMU帧
  4. camera2Device = device2IMU ^ -1 * depth2IMU
  5. 现在我可以用point2Device将点云的每个点相乘。但这是对设备框架的转变。

    有没有办法将设备姿势转换为相机姿势?

1 个答案:

答案 0 :(得分:2)

你放在一起的等式是正确的!但它还没有完成。

格式

为了正式化终端,让我们使用a_T_b作为转换矩阵,其中a表示基本帧,b表示目标帧。相对于a_T_b框架,ab框架。

计算矩阵

根据您的问题,我们知道的矩阵是:

start_service_T_deviceimu_T_deviceimu_T_depth

我们想要获得的矩阵是:

start_service_T_depth

我们可以使用"矩阵链"得到结果:

start_service_T_depth = start_service_T_device * 
                        inverse(imu_T_device) * 
                        imu_T_depth;

现在,让我们说我们在深度框架中有一个点P_depth。要为此点应用姿势并将其转换为start_service帧,我们可以使用:

P_ss = start_service_T_depth * P_depth;

将其放入OpenGL框架

在大多数情况下,您可能希望将其转换为一些易于图形库渲染的坐标框架。以我们的OpenGL为例,我们可以将这一点转换为OpenGL世界坐标系,如下所示:

请注意,start_service_T_opengl_world是一个可以手动计算的常量矩阵。 Here是矩阵的链接,引自Project Tango c ++示例。

P_gl = opengl_world_T_start_service * P_ss;

我们可以扩展我们刚刚编写的所有内容并将其放在一个等式中:

P_gl = opengl_world_T_start_service * 
       start_service_T_device * 
       inverse(imu_T_device) * 
       imu_T_depth * 
       P_depth;

来自Project Tango的示例代码

此外,在项目探戈示例中,点云示例对这些转换有很好的解释,这里是链接(c++javaunity)。