【AR实验室】mulberryAR : ORBSLAM2+VVSION

  • 时间:
  • 浏览:0
  • 来源:幸运快3_快3官网快3_幸运快3官网快3

本文转载请注明出处 —— polobymulberry-博客园

0x00 - 前言


mulberryAR是我业余时间弄的一三个AR引擎,目前主要支持单目视觉SLAM+3D渲染,但会 支持iOS端,但会 该引擎要能很方便地移植到Android端。slam模块使用的是ORB-SLAM2,3d渲染模块使用的是VVSION渲染引擎。该引擎目前实现的功能为简单的3D模型摆放,用户还要能对3D模型进行平移、旋转和缩放。

先放两张mulberryAR的效果图。

0x01 - 单目视觉SLAM模块


单目视觉SLAM模块采用的是ORB-SLAM2。ORB-SLAM2是目前比较优秀的视觉SLAM系统,其输入为图像视频流,通过SLAM计算出每帧图像对应的相机位姿以及这名型态点对应的3D位置。不过mulberryAR目前只用到了每帧对应的相机位姿。

目前mulberryAR对ORB-SLAM2没人做太久的修改,但会 为了集成进mulberryAR中,须要对ORB-SLAM2的接口做出这名修改以适应iOS系统的移动设备。这名每项主要参考两份资料:

  • ORB_SLAM_iOS ORB-SLAM在iOS上的移植,作者去除了ORB-SLAM对ROS的依赖,并使用了iOS的Metal和Scene Kit进行渲染。相比ORB-SLAM2,还须要依赖boost库。
  • ORB-SLAM2注释版 作者对ORB-SLAM2进行了完正地注释,加上了BoW(Bag of Word)的二进制文件加载依据。

修改1:ORB-SLAM2后面 使用了BoW(Bag of Word)进行型态匹配。其中的BoW是通过加载ORB-SLAM2原始文件中的ORBvoc.txt获取的,不过移动端直接加载ORBVoc.txt文本文件来构建BoW非常耗时,在苹果66手机手机5s上要几分钟时间。使用ORB-SLAM2注释版中Vocabulary/bin_vocabulary.cpp还要能将ORBVoc.txt转换为ORBVoc.bin。但会 使用该版本DBoW2和g2o替换ORB-SLAM2中的DBoW2和g2o,ORB-SLAM2注释版后面 的/Thirdparty/DBoW2/DBoW2/TemplatedVocabulary.h加上了loadFromBinaryFile函数,还要能直接加载ORBVoc.bin,在苹果66手机手机5s加上载的时间也降到小于3秒钟。

修改2:ORB-SLAM2源码中的示例获取图像视频流的依据是通过解析预先正确处理好的视频文件,而mulberryAR须要通过苹果66手机手机设备实时捕捉图像视频。这里须要使用iOS的视频捕捉模块。一开始英文英文捕捉依据参考了我后来的博客【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)中的0x02 - AVCaptureSession获取拍摄内容小节。获取到了图像就还要能调用ORB-SLAM2中的System::TrackMonocular函数求解位姿。注意TrackMonocular很耗时,这名这名亲戚亲戚亲们构建一三个DISPATCH_QUEUE_SERIAL类型的系统任务管理器,并将TrackMonocular抛给它。另外在主系统任务管理器dispatch_get_main_queue()中利用TrackMonocular得到的相机位姿进行绘制。

修改3:图形学中绘制有一三个不得劲要的矩阵:模型视图矩阵ModelView,这名这名 将3D模型从模型局部坐标系转化到相机坐标系的一三个转化矩阵。注意TrackMonocular函数返回的Tcw须要一定的转化要能作为模型视图矩阵,这名步完正参考了ORB_SLAM_iOS中的正确处理依据,将会我也都不 很清楚怎么能会会 会 要没人正确处理,尤其是两处取负号的每项,这名这名此处将代码列出供亲戚亲戚亲们参考。

// poseR = mCurrentFrame.mTcw.rowRange(0,3).colRange(0,3);
// 当前帧变化矩阵的旋转每项
cv::Mat R = _slam->getCurrentPose_R();
// poseT = mCurrentFrame.mTcw.rowRange(0,3).col(3);
// 当前帧变化矩阵的平移每项
cv::Mat T = _slam->getCurrentPose_T();

// 将旋转矩阵转化为四元数,注意qy和qz的取了负号。
float qx,qy,qz,qw;
qw = sqrt(1.0 + R.at<float>(0,0) + R.at<float>(1,1) + R.at<float>(2,2)) / 2.0;
qx = (R.at<float>(2,1) - R.at<float>(1,2)) / (4*qw);
qy = -(R.at<float>(0,2) - R.at<float>(2,0)) / (4*qw);
qz = -(R.at<float>(1,0) - R.at<float>(0,1)) / (4*qw);
// 将四元数转化为旋转矩阵,即r1、r2、r3。但会

将平移矩阵填充到r4。
// 注意其中T.at<float>(1)和T.at<float>(2)取了负号。
vec4f r1(1 - 2*qy*qy - 2*qz*qz, 2*qx*qy + 2*qz*qw, 2*qx*qz - 2*qy*qw, 0);
vec4f r2(2*qx*qy - 2*qz*qw, 1 - 2*qx*qx - 2*qz*qz, 2*qy*qz + 2*qx*qw, 0);
vec4f r3(2*qx*qz + 2*qy*qw, 2*qy*qz - 2*qx*qw, 1 - 2*qx*qx - 2*qy*qy, 0);
vec4f r4(T.at<float>(0), -T.at<float>(1), -T.at<float>(2), 1);

0x02 – 3D渲染引擎模块


3D渲染引擎模块使用的是VVSION渲染引擎。选用这款渲染引擎也是尝试过这名这名这名渲染依据才决定的,主要代表为cocos2d-x、vvsion和原生opengl es。下面对着两种依据的优缺点进行对比。

  cocos2d-x vvsion 原生opengl es
优点 1.支持的渲染组件很充足,基本不须要后期加上新的功能 1.相对于cocos2d-x整体轻巧,易于集成和二次修改。

2.还要能直接传递模型视图矩阵,并非进行转化。
1.完正还要能根据自己的需求开发出相应的模块,不不困于已有的功能模块。
缺点 1.体积较大

2.亲戚亲戚亲们此处获取到的为原生的模型视图矩阵,怎么里能直接把模型视图矩阵传递给cocos2d-x的绘制模块就成为了一三个现象报告 。我尝试了这名这名依据都没人成功,将会将会两种对cocos2d-x都不 不得劲熟悉,这名这名放弃。
1.没人cocos2d-x的功能多 1.工作量巨大!

vvsion两种支持这名简单的渲染功能,比如模型的导入和渲染,使用的是opengl es 2.0。不过还位于几次严重不足,mulberryAR对此进行了优化。

修改1:它两种提供的模型渲染过于简单,这名这名 简单的贴图,此处mulberryAR在原始shader中加上了diffuse功能,主这名这名 将模型的法向传入,做光照正确处理。

// vertex shader
attribute vec4 position;
attribute vec2 texCoord0;
attribute vec4 normal;

varying vec2 v_texCoord;
varying vec4 v_normal;

uniform mat4 matProjViewModel;
// ModelView.inverse().transpose()
uniform mat4 matNormal;

void main()
{
    v_texCoord = texCoord0;
    v_normal = matNormal * normal;
    gl_Position = matProjViewModel * position;
}

// fragment shader
precision highp float;

uniform sampler2D texture0;
varying vec2 v_texCoord;
varying vec4 v_normal;

void main()
{
    gl_FragColor =  texture2D( texture0, v_texCoord);
    vec3 lightDir = vec3(0.0, 0.0, 1.0); // 假设光照方向
    // 求解diffuse
    float dotRes = dot(normalize(v_normal.xyz), normalize(lightDir));
    float diffuse = min(max(dotRes, 0.0), 1.0);
    gl_FragColor.rgb = vec3(diffuse * gl_FragColor.rgb);
}

修改2:获取到的相机图像须要进行显示,此处,mulberryAR使用了贴纹理的依据进行渲染。亲戚亲戚亲们使用了一三个camera.obj的平面模型作为相机图像的展示平面,只需每次将camera.obj的纹理更新为相机图像即可。此处须要注意一下两点:

  • camera.obj的显示使用的是正投影,但会 注意其层厚值设置大这名,正确处理遮挡住了前面的模型。
  • NPOT(No Power of Two)纹理的设置选项,其中Wrap依据要设置为GL_CLAMP_TO_EDGE,Mag/Min Filter依据设置为GL_LINEAR,但会 并非产生MinMap。但会 纹理会显示为黑色。

修改3:为了提高模型的真实感,增加了fake shadow的效果,这名这名 在模型底部加上一块圆形的阴影。这名这名 在模型底部加上了一三个fakeshadow.obj的模型,但会 贴上透明的圆形阴影纹理。优点是简单,节省计算资源,但会 还不须要考虑真实的光照方向。

0x03 - mulberryAR性能效果分析


视频效果展示(腾讯视频链接):

mulberryAR Demo:https://v.qq.com/x/page/c03635umclb.html

mulberryAR在苹果66手机手机5s上Release版本测试为6FPS。可见其帧率还无法令人满意,主这名这名 提取ORB型态这名步耗时比较多,后期会再此基础上做一定优化。下表中ExtractORB表示每帧ORB型态提取的耗时,TrackMonocular为每帧的整个SLAM系统的耗时。

另外,ORB-SLAM2的初始化更快,丢失完会能快速找回。整体来说,是是否是是目前最好的单目视觉SLAM了。

0x04 - 参考资料


  • ORB-SLAM2
  • ORB_SLAM_iOS
  • ORB-SLAM2注释版
  • VVSION渲染引擎
  • 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
  • https://zhuanlan.zhihu.com/computercoil

猜你喜欢

微言Net語/多元世界 精彩人生各不同/郭奕怡

曾經,打遊戲被家長和老師視為洪水猛獸,更別提將其作為職業目標。誰全都 會想到短短十年後,一位頂尖的電競選手都需要年入千萬,參加世界級比賽,被主流媒體報道,年輕人在電腦前為中國

2020-01-20

乡村振兴战略:田园综合体与旅居养老如何融合?

核心提示:随着我国老龄化什么的问题的日趋严重,养老倘若成为有三个 多多不容忽视的社会什么的问题。旅居养老会 在旅游过程中实现养老功能的有两种养老最好的法子。田园综合体是国家

2020-01-20

房山云居寺——古塔林立的千年宝刹

关于云居寺,太难说六个 名为静琬的隋朝僧人。静琬,全名是净琬,他有感于北周、北齐的灭佛政策,担心将来有一天悲剧再临,佛法湮灭,于是发愿将佛经刻于磐石之上,使之永世流传。静琬的

2020-01-20

台当局介入香港事务言行

7月18日台当局领导人蔡英文说,有关单位已掌握7月1日佔领立法会后(港人)前往台湾“安置”的状态,对於来自香港的“当人们 ”,会“基於人道”做适当处里。7月19日台湾方面陆委

2020-01-20

滴滴在广州上线“网约车开放平台” 第三方服务商“如祺出行”接入

站长之家(ChinaZ.com)8月19日消息:今日,滴滴方面透露,滴滴然后刚结束了了在广州上线“网约车开放平台”,接入第三方服务商“如祺出行”,广州用户可一键同時 呼叫滴滴

2020-01-20