2023-07-26-B50R 场景二次位置定位和跳转

场景定位与跳转的实现记录

设备

XVisio B50R

参考示例

Apriltag Demo开发

AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id。

CSLAM地图功能开发

SLAM(Simultaneous Localization and Mapping),同步定位与地图构建,最早在机器人领域提出,它指的是:机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的环境特征定位自身位置和姿态,再根据自身位置构建周围环境的增量式地图,从而达到同时定位和地图构建的目的。

CSLAM是包含回环检测和地图优化的SLAM模式,建议在要求高精度定位的使用场景中使用CSLAM模式。

关键角色

为了更好地描述场景构建与体验流程,现假定有以下几个角色。

数据采集者:使用程序去扫描场景,得到地图数据。
场景构建者:在unity中添加美术资源,构建场景内容。
最终用户:穿戴MR眼镜,行走浏览场景。


实现场景扫描

目的

CSLAM示例是在同一个应用中演示扫描场景和识别场景。此处将扫描场景拆分,便于"数据采集者"去扫描场景.

需求关键点

由于"数据采集者"启动MR眼镜程序时的朝向未知,而场景构建者需要根据采集的地图数据去构建场景。

若假定Tag为坐标系原点。

那么数据采集者扫描场景时需识别一下Tag,并记录其位姿(位置与姿态,即6Dof数据)。

场景构建者构建场景时直接将Tag位置作为原点参考。

使用步骤

"数据采集者"按照如下步骤采集地图数据。

  • 加载场景,坐标系(节点)在空中放置
图片1
  • 识别Tag,将坐标系(节点)放置在Tag位置
图片2
  • 输入场景名称后,扫描四周记录场景
图片3
  • 保存场景,查看扫描结果
图片5
  • 重启应用,识别场景,检验场景原点与Tag位置是否偏差过大,若偏差过大,则重新采集
图片4

实现场景定位与跳转

问题解决记录

说明:“MR眼镜相机6dof” 都为0的点 在以下的表述中为“SLAM数据原点”。

问题转化思路与解决记录如下:

  1. 在程序启动后,识别到场景数据正常,但在场景跳转后加载新的地图文件,但是“SLAM数据原点并未改变”。(数据采集时,Tag是在不同位置)

    上述问题反映了XVisio设备在多个场景中,仍采用一个SLAM数据原点。而这在SDK文档中也有佐证,SDK 文档中的“场景跳转示例”中表述在切换场景时,要将XR的几个对象设置为不可销毁。

    问题转化为:验证将XR对象销毁是否就可以解决

  2. 尝试销毁XR对象,后续场景无内容显示(黑屏)。只有按照SDK文档中在切换场景时不销毁XR对象,才能实现场景跳转。但是这会导致切换场景后,即使读取新的地图数据,SLAM数据原点也不会改变。

    问题转化为:SLAM数据原点不变,切换场景时校正目标场景的原点

  3. 当SLAM数据原点不变时,可通过在场景中构建一个连接点(连接点:将跳转的目标场景的场景原点在当前场景的相对位置),在场景跳转后进行位置纠正。

至此,实现场景定位与跳转,但仍有以下问题。

  • 不确定当初次加载地图数据后,后续加载地图数据是否是真的加载了。

若加载,则是预期结果。

若未加载,那么场景切换后,仍旧是采用原场景的SLAM,并不能通过重新识别场景去削弱SLAM惯性累积误差的影响。

注:在穿戴MR设备的用户距离启动位置越来越远的过程中,根据视觉解算的6DOF数据误差越来越大。

想要通过重新识别场景的方式去改善体验。方式为:当距离过远时,切换场景重新识别。

总结

  • “将目标场景分成多个场景扫描输出多个文件”和“将目标场景当做一个场景扫描输出单个文件”两者都可实现小场景的定位与切换。(将目标场景分成多个小场景,便于按需加载资源)

场景构建

"场景构建者"参考如下示例添加资源构建场景。

注:代码已封装完成,直接使用预制件或是挂载脚本。

  • 将所有场景内容置于SceneNode节点下即可保证MR设备在识别场景后在预定位置显示内容。
图片6
  • 在指定位置构建一个“传送门”,实现场景跳转。(仅以传送门为例,其它触发条件也可以)
图片7

场景浏览

“最终用户”启动程序进行行走浏览。

场景202截图如下:

图片8

场景201截图如下:

图片9

调试日志截图如下:

图片10

posted @ 2024-05-30 17:31  EQ-雪梨蛋花汤  阅读(38)  评论(0)    收藏  举报