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轴向前(设备朝向);
- 转换方式:
- 平移向量:将ARCore平移的Y分量取反,即
colmap_trans = [trans_x, -trans_y, trans_z]; - 旋转四元数:将ARCore的四元数与绕X轴旋转180度的四元数(格式为
(0, 1, 0, 0),对应w,x,y,z顺序)相乘,得到COLMAP兼容的旋转四元数。
- 平移向量:将ARCore平移的Y分量取反,即
示例伪代码:
// 获取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
相关产品推荐
相关产品推荐

