You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARCore中getRotationQuaternion是否返回现实世界坐标系下的旋转四元数?

关于ARCore位姿与COLMAP先验输入的问题解答

1. getRotationQuaternion() 的坐标系说明

ARCore的getRotationQuaternion()返回的是现实世界坐标系下的旋转四元数,但需明确ARCore世界坐标系的规则:

  • 采用右手坐标系,Y轴垂直向上(与重力方向相反),单位为米,尺度完全匹配真实物理空间;
  • 坐标系原点为ARCore首次成功完成环境追踪时,设备所在的初始位置;
  • 该四元数描述的是设备本地坐标系到ARCore世界坐标系的旋转映射关系。

若你需要的是GPS级别的全局坐标系,还需结合ARCore地理定位API,但仅用于场景内真实尺度位姿的话,这个四元数完全满足需求。

2. 获取完整的真实尺度位姿

要给COLMAP提供完整的先验位姿,除旋转四元数外,还需获取平移向量:

  • 通过Pose对象(从frame.getCamera().getPose()获取)的getTranslation()方法,可得到现实世界坐标系下的米级平移向量;
  • 可将四元数转换为旋转矩阵,再结合平移向量组成4x4位姿矩阵,更便于COLMAP导入。

3. 与COLMAP坐标系的适配转换

COLMAP的相机位姿定义与ARCore存在差异,必须做坐标系转换才能正确导入:

  • COLMAP相机坐标系规则:Z轴向前(相机朝向),X轴向右,Y轴向下;
  • ARCore设备坐标系规则:X轴向右,Y轴向上,Z轴向前(设备朝向);
  • 转换方式:
    1. 平移向量:将ARCore平移的Y分量取反,即 colmap_trans = [trans_x, -trans_y, trans_z];
    2. 旋转四元数:将ARCore的四元数与绕X轴旋转180度的四元数(格式为(0, 1, 0, 0),对应w,x,y,z顺序)相乘,得到COLMAP兼容的旋转四元数。

示例伪代码:

// 获取ARCore设备位姿
Pose devicePose = frame.getCamera().getPose();
float[] arRotationQ = devicePose.getRotationQuaternion(); // w,x,y,z顺序
float[] arTranslation = devicePose.getTranslation();

// 转换平移向量
float[] colmapTranslation = {arTranslation[0], -arTranslation[1], arTranslation[2]};

// 转换旋转四元数:绕X轴180度的四元数为 q1 = (0, 1, 0, 0)
// 四元数相乘规则:q_result = q1 * arRotationQ
float[] colmapRotationQ = multiplyQuaternions(new float[]{0,1,0,0}, arRotationQ);

4. COLMAP导入注意事项

  • 需将位姿保存为COLMAP支持的格式(参考images.txt的结构),每一行对应一张图像的位姿;
  • 确保ARCore追踪状态稳定,避免因漂移导致位姿精度下降,建议在静态、纹理丰富的场景下采集;
  • ARCore的位姿尺度是真实的,导入后COLMAP的稀疏重建会继承该尺度,解决COLMAP默认无绝对度量的问题。

内容的提问来源于stack exchange,提问作者Kiran George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:35:21