EQ-R
简介
EQ-Renderer是EQ基于sceneform(filament)扩展的一个用于安卓端的三维AR渲染器。
主要功能
它包含sceneform_v1.16.0中九成接口(剔除了如sfb资源加载等已弃用的内容),扩展了视频背景视图、解决了sceneform模型加载的内存泄漏问题、集成了AREngine和ORB-SLAM3、添加了场景坐标与地理坐标系(CGCS-2000)的转换方法。
注:由于精力有限,文档和示例都不完善。sceneform相关请直接参考谷歌官方文档,扩展部分接口说明请移步git联系。
相关链接
Git仓库
码云
EQ-R相关文档
配置环境
使用在线依赖
若使用离线依赖的方式,则跳过本节内容。
Maven配置
EQ-Renderer的maven仓库地址为:repo.eqgis.cn
根据AndroidSudio的版本,配置相应的AGP,这里我使用的gradle版本如下:
- Android Gradle Plugin Version :8.1.0
- Gradle Version:8.0
在工程目录下修改settings.gradle文件,示例如下:
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
maven {
allowInsecureProtocol = true
url "http://repo.eqgis.cn"
}
maven {url "https://developer.huawei.com/repo" }
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
allowInsecureProtocol = true
url "http://repo.eqgis.cn"
}
maven {url "https://developer.huawei.com/repo" }
}
}
rootProject.name = "EQ-Renderer Sample"
include ':app'
注意:后面若要引入AREngine,则这里需要配置华为的maven仓库。
不同版本的Gradle配置在配置Maven仓库时,有一定差异。 Gradle 7.0版本后,需参考Android官方对于Gradle版本与Gradle插件的配套关系,把Gradle插件版本也升级到7.0及以上。
其它版本的gradle配置,请参考之前写的文档:视频地图开发文档#不同版本的Gradle
引入相关依赖
eq-renderer:三维渲染器,基于filament eq-slam:slam算法库,当前版本(v1.0.2)使用的ORB-SLAM3,暂时仅支持arm-v8a。 opencv:图像处理 arcore:谷歌的AR服务 arengine:华为的AR服务
在模块的build.gradle文件中添加在线依赖,示例如下:
dependencies {
//...
//使用在线依赖
implementation 'com.eqgis:eq-renderer:1.0.2'
implementation 'com.eqgis:eq-slam:1.0.2'
//引入opencv
implementation 'org.opencv:opencv-v8a:4.5.5'
//使用ARCore 和 AREngine (按需添加)
implementation 'com.google.ar:core:1.39.0'
//使用AREngine则额外添加下面依赖
//华为仓库 maven {url "https://developer.huawei.com/repo/" }
implementation 'com.huawei.hms:arenginesdk:3.7.0.3'
}
使用离线依赖
若已使用在线依赖的方式,则跳过本节内容。
下载AAR
EQ渲染器: eq-renderer
SLAM算法库: eq-slam
OpenCV(arm-v8a版本): opencv-v8a
将相关库下载到本地,放入模块的/libs目录下,如图:
然后再在build.gradle文件中引入
dependencies {
//...
//使用离线依赖
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
}
引入ARCore
PS:若没有用到ARCore,可不添加这个依赖
ARCore仍采用在线依赖的方式
//使用ARCore 和 AREngine (按需添加)
implementation 'com.google.ar:core:1.39.0'
引入AREngine
PS:若没有用到AREngine,可不添加这个依赖
AREngine仍采用在线依赖的方式,注意:使用AREngine,需要配置华为的maven仓库。参考上面的Maven配置。
//使用AREngine则额外添加下面依赖
//华为仓库settings.gradle中添加“ maven {url "https://developer.huawei.com/repo/" } ”
implementation 'com.huawei.hms:arenginesdk:3.7.0.3'
接入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下载链接: repo.eqgis.cn/com/eqgis/e…
在线依赖
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
注:以下图片经过压缩处理