利用陀螺儀模擬簡易的SLAM功能(僅旋轉)
陀螺儀簡易模擬SLAM功能(旋轉後虛擬物體位置不變):
SLAM: simultaneous localization and mapping ,即時定位和地圖構建。也就是一個裝置到了一個陌生的環境中,能知道:我在那,周圍的環境是怎樣的,我該怎麼走,路上有什麼障礙等資訊。SLAM在生活中有很多用處,在AR或者MR中我們利用SLAM來對周圍的空間進行掃描和三維空間重建,然後在重建的位置放置虛擬物體,來達到和現實互動或者固定虛擬物體在現實中的某個位置等等的功能。實現真正的SLAM功能需要涉及許多數學知識,以及對RGB影象和深度影象的處理等,而這次介紹的是簡易的,利用手機上的RGB攝像頭和陀螺儀來模擬簡易的
實現效果:
我們不借助識別圖或者其他識別資訊,直接在螢幕中間看到一個模型,手機移開時,模型會消失,當手機再移回來的時候模型又出現在這個位置。
實現原理:
場景中有兩個Camera,一個是ARCamera,用來調手機攝行頭拍攝真實的畫面;另一個Camera用來渲染虛擬物體,然後用陀螺儀來控制第二個攝像機的旋轉,就可以模擬一個簡易的SLAM效果。
由於感測器等裝置誤差,波動等一系列因素影響,如果直接食用而不濾波處理,效果比較不穩定,所以我們需要引入第三方外掛GyroDroid。
步驟:
1.匯入vuforia和GyDroid,然後將MainCamera
2.將MainCamera的ClearFlag屬性改為DepthOnly。
3.將模型拖到場景中
4.新建一個Layer,我這裡名字叫SlamObjs。
5.將模型的layer設定為SlamObjs.
6.將ARCamera下的Camera的ClearFlag改為DepthOnly,CullingMask的屬性改為Default(或者去掉SlamObj),這樣ARCamera就不會渲染模型了。
我們呼叫ARCamera只是為了呼叫外部攝像頭,或者可以自己寫程式碼呼叫外部攝像頭。
7.給ARCamera新增LicenseKey,啟動ARCamera。
8.
指令碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testSlam : MonoBehaviour
{
// Use this for initialization
void Start ()
{
//如果用了GyroDroid
SensorHelper.ActivateRotation();//啟用感測器
//如果沒用GyroDroid
//Input.gyro.enabled = true; //開啟陀螺儀
//Input.gyro.updateInterval = 0.05f;//設定陀螺儀的更新時間,即隔 0.05秒更新一次資料
}
// Update is called once per frame
void Update ()
{
transform.rotation = SensorHelper.rotation;
//讓物體旋轉和手機陀螺儀的旋轉一致
//或者 沒有GyroDroid 平滑旋轉
//transform.rotation = Quaternion.Slerp(transform.rotation, Input.gyro.attitude, 0.1f);
}
}
這只是簡易的模擬SLAM功能,僅僅是旋轉攝像頭,物體保持在一個固定的地方不動,這個功能比較簡單,但是要實現真正的SLAM非常困難,還需要進一步的學習和探索。
本文內容部分參考Think加速想象力出版的《AR與VR開發實戰》教程。