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

注:以下图片经过压缩处理

ARCore

ARCore

非全屏-SLAM

注:以下图片经过压缩处理

非全屏模式

非全屏模式

全屏-SLAM

注:以下图片经过压缩处理

全屏模式

全屏模式

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