VPS 全球视觉定位工作原理
VPS 是什么
Visual Positioning System(视觉定位系统,VPS)是 Google 构建的一套全球定位基础设施,Geospatial API 是它在移动端 ARCore 上的接口。
GPS 在室外的精度是 10~50 米——对开车导航够用,但对"让 AR 内容精确贴在某栋建筑的某个窗台"远远不够。VPS 的目标就是用摄像头画面反向确定"这是哪个位置",精度达到亚米级。
VPS 底层:Google 街景 + 3D 点云
街景作为地图基础
Google 从 2007 年开始在全球拍摄街景,目前已经覆盖了超过 100 个国家/地区。拍摄车(以及后来的徒步者)会:
- 用鱼眼/全景相机在每个位置拍摄多张高清照片
- 用激光雷达采集该位置的深度数据
- 用 GPS 和 IMU 记录拍摄位置和相机姿态
构建全球 3D 点云
所有拍摄的街景照片经过处理后:
- 提取特征点(FAST + BRIEF,和 ARCore SLAM 用的是同一套算法)
- 跨照片匹配特征点,把不同视角看到的同一个物理点三角化到 3D 空间
- 所有照片的特征点合并成一个全球 3D 点云——Trillions(万亿级)个点,覆盖几乎所有街道路面和建筑物立面
- 每个点附带:3D 位置、描述子、可信度
深度学习筛选"稳定"特征点
不是所有特征点都值得存入全球点云——人的头发、随风摆动的树叶、临时停的车、临时广告牌这些"不稳定"的特征点对定位没用。Google 用深度学习模型从照片中筛选出那些长期存在、不会大幅变化的特征点(比如窗户、砖墙纹理、路牌、建筑边角),只把这些存入全球点云。
实时定位流程
当用户的手机调用 Geospatial API 时,VPS 的工作流程:
1. 手机发送当前摄像头画面(可能 + GPS 粗定位)给 Google 云端
2. 云端用深度学习从画面中提取特征点(和 ARCore SLAM 一样的算法)
3. GPS 粗定位告诉云端"大概在城市的某个区域"
4. 云端把手机特征点和该区域的全球点云做匹配(Bag of Words + RANSAC 等算法)
5. 匹配成功后,计算机的精确位置和朝向(PnP 算法)
6. 返回精确的经纬度(WGS84)+ 海拔 + 朝向 + 可信度
PnP 求解姿态
匹配出手机画面中的 N 个特征点和全球点云中的对应点后,用 Perspective-n-Point (PnP) 算法求解手机的 6DoF 姿态(3 位置 + 3 朝向)。PnP 是经典的相机姿态估计方法,从至少 4 对 2D-3D 匹配点就能解出。
定位精度与失败原因
典型精度
| 条件 | 精度 |
|---|---|
| 开阔区域、丰富街景覆盖 | 亚米级(< 1 米) |
| 城市街道、两侧有建筑 | 2~5 米 |
| 乡村/郊区、街景稀疏 | 5~20 米 |
| GPS 有信号但 VPS 失败 | 降级到 GPS(10~50 米) |
VPS 定位失败的常见原因
| 原因 | 说明 | 解决方案 |
|---|---|---|
| 没有街景数据 | 该区域 Google 没拍过街景 | 只在街景覆盖区域用 Geospatial |
| 视角太偏 | 手机举得太高或太低,画面中没有可识别的建筑/路面 | 引导用户让画面包含更多街景元素 |
| 遮挡严重 | 建筑物被施工围挡、大型车辆挡住,特征点被覆盖 | 引导用户走几步找更好的视角 |
| 街景过时 | 建筑刚拆了/新建了,但 Google 街景还是旧的 | VPS 无法感知变化,可能定位错误 |
| 动态物体太多 | 画面中全是移动的车辆和行人 | 等一下或换个位置 |
| 网络差 | VPS 需要上传画面到云端匹配 | 提示用户改善网络,或降级到本地 SLAM |
如何处理定位失败
val geospatialPose = arSession.session.earthCameraPose
if (geospatialPose.accuracy > 5.0) {
// 定位精度差(> 5 米),提示用户
showAccuracyWarning()
} else if (geospatialPose.orientationAccuracy > Math.toRadians(20.0)) {
// 朝向精度差(> 20 度)
showOrientationWarning()
}
if (!geospatialPose.isValid) {
// VPS 定位失败,降级到 GPS 或普通 SLAM
fallbackToGpsOrSlam()
}
隐私与数据上传
Geospatial API 需要把用户手机的摄像头画面发送到 Google 云端。开发者需要知道:
- 数据用途:仅用于 VPS 定位计算,用于改进系统(匿名化)
- 隐私声明:必须在应用的隐私政策中明确说明摄像头数据会上传到 Google
- 家长同意:面向儿童的应用需要额外合规处理
VPS 与 GPS / SLAM 的配合
Geospatial API 并不是为了取代 GPS 或本地 SLAM——它和它们是互补关系:
| 定位方式 | 最佳场景 | 精度 |
|---|---|---|
| GPS | 室外粗定位 | 10~50 米 |
| VPS | 室外精定位 | 亚米级 ~ 5 米 |
| SLAM(本地) | 室内或局部区域 | 厘米级 |
| VPS + SLAM | 室内外过渡区域 | 自动组合 |
推荐策略:GPS 给"在哪座城市",VPS 给"在哪栋楼前",SLAM 给"在房间的哪个角"。