2024-02-01-在安卓应用中接入ORB-SLAM
EQ-R
简介
EQ-Renderer是EQ基于sceneform(filament)扩展的一个用于安卓端的三维AR渲染器。
主要功能
它包含sceneform_v1.16.0中九成接口(剔除了如sfb资源加载等已弃用的内容),扩展了视频背景视图、解决了sceneform模型加载的内存泄漏问题、集成了AREngine和ORB-SLAM3、添加了场景坐标与地理坐标系(CGCS-2000)的转换方法。
注:由于精力有限,文档和示例都不完善。sceneform相关请直接参考谷歌官方文档,扩展部分接口说明请移步git联系。
相关链接
Git仓库
码云
EQ-R相关文档
接入ORB-SLAM
在之前的文档(在安卓端接入ORB-SLAM实现AR)中,简单地记录了接入ORB-SLAM3所学习的内容。
问答
问:
之前已经使用ARCore等方式已经实现了“AR桌面”应用,为什么还要去接入三方SLAM呢?
答:
“给一台任意(单目、多目、RGBD)的安卓设备,都能实现AR”这是我想做这件事的初衷,也是我想学习SLAM的目的。当然,最关键的是,不是所有手机都支持ARCore或AREngine,更别说不是手机的安卓设备了。
比如,在学习AOSP(Android Open Source Project) 的过程中。我修改了相关内容进行刷机,一个叫“EQ-Phone”的“手机”就产生了。而这台设备显然用不了ARCore/AREngine。

EQ-Slam模块
简介
EQ-Slam(即EQ的slam模块),当前是为了实现EQ-Renderer和ORB-SLAM3的对接,考虑到后续可能会接入其它SLAM,因此这里另起一个module。
功能
eq-slam模块主要实现了底层对ORB-SLAM3的调用、相机位姿计算(转为EQ-R采用的坐标系),并开出了相关Java接口。
关键类
- SlamCore :SLAM实例
- SlamSettings : SLAM配置
- TrackingState : 跟踪状态
- CalibrationUtils :相机标定工具
链接
AAR下载链接:
https://repo.eqgis.cn/com/eqgis/eq-slam
在线依赖
maven {
allowInsecureProtocol = true
url "http://repo.eqgis.cn"
}
implementation 'com.eqgis:eq-slam:1.0.2'
//需要引入opencv
implementation 'org.opencv:opencv-v8a:4.5.5'
EQ-R中使用
这里以之前做的AR桌面应用程序为例。
AR桌面应用程序请参考之前的文档:使用EQ-Renderer实现AR桌面
修改前
ARSceneLayout基于ARCore\AREngine实现,创建ARSceneLayout对象即可构建一个空白的AR场景。
视图初始化:
layout = new ARSceneLayout(this);//使用AR视图
layout.addSceneUpdateListener(this::onUpdate);
跟踪状态判断:
//当初次检测到追踪状态时,重置相机姿态(可重置窗口显示位置)
TrackingState trackingState = ((ARSceneLayout) layout).getTrackingState();
if (trackingState == TrackingState.TRACKING){
resetCameraPose();
}
修改后
现在替换为使用eq-slam,在引入“eq-slam”和“opencv”后,修改如下代码即可。
视图初始化:
EqSlamSceneLayout eqSlamSceneLayout = new EqSlamSceneLayout(this);//使用EqSLAM视图
eqSlamSceneLayout.setDrawPoints(false);//不绘制特征点
layout = eqSlamSceneLayout;
//layout = new ARSceneLayout(this);//使用ARCore视图
layout.addSceneUpdateListener(this::onUpdate);
跟踪状态判断:
if (layout instanceof ARSceneLayout){
//当初次检测到追踪状态时,重置相机姿态(可重置窗口显示位置)
TrackingState trackingState = ((ARSceneLayout)layout).getTrackingState();
if (trackingState == TrackingState.TRACKING){
resetCameraPose();
}
}else if (layout instanceof EqSlamSceneLayout){
com.eqgis.slam.core.TrackingState state = ((EqSlamSceneLayout) layout).getTrackingState();
if (state == com.eqgis.slam.core.TrackingState.TRACKING){
resetCameraPose();
}
}
运行效果对比
实测时,采用ORB-SLAM创建的AR场景与使用ARCore创建的场景相比,在显示上效果无明显差别。
这里为做区分,在SLAM创建的场景中绘制了实时检测的特征点。
ARCore
注:以下图片经过压缩处理

非全屏-SLAM
注:以下图片经过压缩处理

全屏-SLAM
注:以下图片经过压缩处理


浙公网安备 33010602011771号