欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信小程序iBeacon測(cè)距及穩(wěn)定程序的實(shí)現(xiàn)解析

 更新時(shí)間:2019年07月31日 11:10:30   作者:雅X共賞  
這篇文章主要介紹了微信小程序iBeacon測(cè)距及穩(wěn)定程序的實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

iBeacon是蘋果公司推出的一項(xiàng)低耗能藍(lán)牙技術(shù),由藍(lán)牙設(shè)備發(fā)射包含指定信息的信號(hào),再由移動(dòng)設(shè)備接收信號(hào),從而實(shí)現(xiàn)近場(chǎng)通信。微信小程序2017年開始支持iBeacon,搖一搖附近就是基于iBeacon實(shí)現(xiàn)的,此外iBeacon還可以實(shí)現(xiàn)距離測(cè)量,本文將介紹如何基于微信小程序?qū)崿F(xiàn)iBeacon測(cè)距。

iBeacon測(cè)距原理

藍(lán)牙信標(biāo)發(fā)射的信號(hào)強(qiáng)度(rssi)與收發(fā)設(shè)備之間的距離,某種程度上呈正相關(guān),因此通過合理的運(yùn)算轉(zhuǎn)化,可以通過rssi的值反推出與接收設(shè)備間的距離。

藍(lán)牙信標(biāo)的rssi值是一個(gè)參考值,沒有固定標(biāo)準(zhǔn)。想要計(jì)算出藍(lán)牙信標(biāo)的距離,還必須知道這個(gè)信標(biāo)設(shè)備的txPower值。txPower是指當(dāng)距離藍(lán)牙信標(biāo)1m時(shí)的rssi值,不同的藍(lán)牙設(shè)備或相同設(shè)備不同的工況甚至不同的場(chǎng)地環(huán)境,都會(huì)影響txPower值,因此這個(gè)值雖然可以測(cè)量,但一定程度上是個(gè)經(jīng)驗(yàn)值,無法測(cè)準(zhǔn)。

rssi測(cè)距公式

知道rssi和txPower后就可以計(jì)算距離了,有兩種計(jì)算公式:

一、

這個(gè)公式里的三個(gè)變量A、B、C都是經(jīng)驗(yàn)值,需要根據(jù)手機(jī)系統(tǒng)或硬件型號(hào)精確調(diào)校,通常會(huì)將所有設(shè)備的校準(zhǔn)結(jié)果保存成一個(gè)設(shè)備信息表,移動(dòng)終端先檢測(cè)本機(jī)型號(hào),然后匹配設(shè)備信息調(diào)取相應(yīng)的計(jì)算配置,再進(jìn)行計(jì)算。很明顯這個(gè)公式是比較依賴硬件調(diào)校的,沒有數(shù)據(jù)儲(chǔ)備的前提下這個(gè)公式會(huì)很難用。

轉(zhuǎn)換成js代碼:

const calculateAccuracy = function (txPower, rssi) {
 return (0.89976) * Math.pow(rssi / txPower, 7.7095) + 0.111
}

未精校情況下的測(cè)距表現(xiàn):

先說這個(gè)圖怎么看。

  • 縱軸代表測(cè)量距離,橫軸代表時(shí)間,每隔一秒取樣一次,圖中是近10次取樣的數(shù)值曲線。
  • 綠線是設(shè)備接收到的rssi值,反應(yīng)硬件真實(shí)接收到的數(shù)據(jù)情況;
  • 紅線是套用公式計(jì)算得出的瞬時(shí)距離;
  • 黃線是微信小程序自帶的瞬時(shí)測(cè)距結(jié)果。

藍(lán)牙信標(biāo)與手機(jī)的實(shí)際距離1m,測(cè)試設(shè)備為紅米Note7。

從上圖可見,rssi值相對(duì)穩(wěn)定,說明硬件沒有太大問題。紅線和黃線的波動(dòng)都很大,說明準(zhǔn)確度不咋地。二者的波動(dòng)趨勢(shì)幾乎一致,所以有理由懷疑微信小程序內(nèi)部也是用的這個(gè)測(cè)距公式。從結(jié)果來看,這個(gè)公式的準(zhǔn)確度比較差,可能是因?yàn)闆]有精校的原因。

二、

這個(gè)公式里的A就是rssi,tx是txPower,n是經(jīng)驗(yàn)值,n的取值跟物理環(huán)境有關(guān)。

const calculateAccuracy = function (txPower, rssi) {
 return Math.pow(10, Math.abs(rssi - txPower) / (10 * 4))
}

公式二的測(cè)距表現(xiàn):

人比人得死,貨比貨得扔啊。

圖中黃線還是波動(dòng)的那么瘋狂,但紅線卻異常穩(wěn)定,而且呈現(xiàn)出跟綠線一致的波動(dòng)幅度,說明測(cè)距精度靠譜。這個(gè)公式只有一個(gè)參數(shù),生產(chǎn)環(huán)境中的調(diào)校相對(duì)簡(jiǎn)單,這里我們選擇公式二作為測(cè)距公式。

iBeacon測(cè)距穩(wěn)定程序

藍(lán)牙信號(hào)本身就有波動(dòng)性,加上現(xiàn)實(shí)環(huán)境中的很多因素也會(huì)影響到信號(hào)強(qiáng)度,比如物體遮擋、設(shè)備方向變化、硬件自身的穩(wěn)定性等,所以接收設(shè)備檢測(cè)到的rssi值通常是“跳動(dòng)”的,直接使用測(cè)距公式算出的結(jié)果,往往不可用。必須實(shí)現(xiàn)一個(gè)穩(wěn)定程序,讓計(jì)算結(jié)果呈現(xiàn)出連續(xù)性和穩(wěn)定性。

數(shù)據(jù)濾波

穩(wěn)定程序主要做的事就是對(duì)波段數(shù)據(jù)“削峰填谷”,也可以稱作數(shù)據(jù)濾波。最簡(jiǎn)單的濾波處理,就是收集一段時(shí)間的值求平均,只要硬件不出問題,固定距離的藍(lán)牙信標(biāo)rssi值總是會(huì)在一個(gè)相對(duì)穩(wěn)定的區(qū)間內(nèi)變化,采樣時(shí)間越長(zhǎng),采樣的平均值就會(huì)越接近真實(shí)值,因此在靜態(tài)測(cè)距場(chǎng)景中,求平均是最佳方式。

//求數(shù)組平均值
const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
return arrayAverage([...])

具體實(shí)現(xiàn)是,當(dāng)程序源源不斷的接收到信標(biāo)的rssi時(shí),先用公式計(jì)算出瞬時(shí)測(cè)距結(jié)果,然后將結(jié)果存進(jìn)一個(gè)數(shù)組,然后計(jì)算這個(gè)數(shù)組的平均值。靜態(tài)測(cè)距時(shí),測(cè)量結(jié)果還是非常準(zhǔn)的,2m以內(nèi)的距離誤差可以低至0.1m。

實(shí)際應(yīng)用中往往都是動(dòng)態(tài)測(cè)距,所以采樣數(shù)據(jù)的長(zhǎng)度要加以限制,比如按后進(jìn)先出的順序,取最近10組數(shù)據(jù)。具體采樣隊(duì)列設(shè)為多長(zhǎng),要根據(jù)項(xiàng)目實(shí)際需求而定。采樣隊(duì)列的長(zhǎng)度越長(zhǎng),測(cè)距結(jié)果越平滑,但對(duì)移動(dòng)端的動(dòng)態(tài)捕捉越遲鈍;反之采樣隊(duì)列越短,結(jié)果越銳利,對(duì)移動(dòng)端的動(dòng)態(tài)捕捉越靈敏。

有時(shí)因?yàn)橐恍┡既灰蛩?,采樣?duì)列中會(huì)出現(xiàn)個(gè)別大幅偏離真實(shí)值的“燥音”數(shù)據(jù),即使求平均也難以有效抹除影響,為消除這種影響,可以在求平均前先用高斯模糊算法對(duì)“偏大值”和“偏小值”做平滑處理,最大限度的降低數(shù)據(jù)噪音的干擾。

高斯模糊算法的關(guān)鍵是根據(jù)平均差求權(quán)重,一維高斯模糊的權(quán)重計(jì)算公式:

轉(zhuǎn)換成js代碼:

//求一維隊(duì)列某點(diǎn)的高斯模糊權(quán)重 @param(隊(duì)列長(zhǎng)度,目標(biāo)位置, 平均差)
const getOneGuassionArray = function (size, kerR, sigma) {
 if (size % 2 > 0) {
  size -= 1
 }
 if (!size) {
  return []
 }
 if (kerR > size-1){
  return []
 }
 let sum = 0;
 let arr = new Array(size);

 for (let i = 0; i < size; i++) {
  arr[i] = Math.exp(-((i - kerR) * (i - kerR)) / (2 * sigma * sigma));
  sum += arr[i];
 }

 return arr.map(e => e / sum);
}

關(guān)于“偏大值”和“偏小值”的概念將在下文介紹,這里只要知道我們的模糊目標(biāo)是那些“極端數(shù)據(jù)”就行了。

時(shí)間加權(quán)

基于采樣隊(duì)列求平均的處理方式,不可避免的會(huì)讓結(jié)果產(chǎn)生滯后性,這時(shí)可以引入時(shí)間加權(quán)的補(bǔ)償算法。

所謂時(shí)間加權(quán),是指在求平均值的時(shí)候,給距離當(dāng)前時(shí)間較近的值更高的計(jì)算權(quán)重,反之給距離當(dāng)前時(shí)間較遠(yuǎn)的值較低的計(jì)算權(quán)重,實(shí)現(xiàn)起來也非常簡(jiǎn)單。

以最簡(jiǎn)單的權(quán)重分配為例,將采樣隊(duì)列一分為二,按時(shí)間遠(yuǎn)近定位為“當(dāng)前組”和“過去組”,比如說我想讓當(dāng)前組的權(quán)重是過去組的2倍,那么只要將當(dāng)前組數(shù)據(jù)全部復(fù)制一份加入隊(duì)列,然后再計(jì)算新隊(duì)列的平均值。

//時(shí)間加權(quán)處理
queue = queue.slice(0, parseInt(queue.length / 2)).concat(queue)
//求平均
return arrayAverage(queue)

動(dòng)態(tài)跟進(jìn)

經(jīng)過時(shí)間加權(quán)處理后,數(shù)據(jù)的滯后性會(huì)得到一定的抑制,但如果遇到比較“陡峭”的距離變化,這種處理仍然會(huì)給出一個(gè)相對(duì)“平滑”的反饋,為了讓穩(wěn)定程序能更好的感知?jiǎng)討B(tài)變化,并且做出跟進(jìn)反應(yīng),還需要人為的設(shè)置一些特殊條件。

首先,如何判斷移動(dòng)設(shè)備正在遠(yuǎn)離或靠近?

這里有一個(gè)簡(jiǎn)單的思路,可以先找出采樣隊(duì)列中的最大值和最小值,然后以一定的閾值找出偏大值和偏小值。比如隊(duì)列中的最大值是3,最小值是1,閾值設(shè)置為0.1m,那么大于2.9m的數(shù)據(jù)都算偏大值,小于1.1m的數(shù)據(jù)都算偏小值。偏大值和偏小值的隊(duì)列長(zhǎng)度最長(zhǎng)不超過總隊(duì)列的二分之一。

然后,如果偏大值集中在隊(duì)列的前三分之一部分,那么我們可以認(rèn)為移動(dòng)設(shè)備正在果斷遠(yuǎn)離;反之偏小值集中在隊(duì)列的前三分之一部分,則可以認(rèn)為移動(dòng)設(shè)備正在靠近。

//maxCount為偏大值的序號(hào)數(shù)組
//minCount為偏小值的序號(hào)數(shù)組
//queueLength為隊(duì)列長(zhǎng)度

if (arrayAverage(maxCount) < parseInt(queueLength / 3)) {
  console.log(`正在遠(yuǎn)離`)
} else if (arrayAverage(minCount) < parseInt(queueLength / 3)) {
  console.log(`正在靠近`)
}

基于這種遠(yuǎn)離和靠近的趨勢(shì)判斷,我們可以人為的讓數(shù)據(jù)向運(yùn)動(dòng)方向做更激進(jìn)的傾斜。怎么做呢?跳過時(shí)間加權(quán)邏輯,如果判斷為正在遠(yuǎn)離,那么就將隊(duì)列中的偏小值過濾掉,反之則將偏大值過濾掉,只計(jì)算剩下的數(shù)據(jù);這種處理會(huì)得到一個(gè)明顯過激的結(jié)果,但考慮到現(xiàn)實(shí)世界中的運(yùn)動(dòng)往往具有慣性,這種激進(jìn)處理,可能會(huì)更貼合真實(shí)的運(yùn)動(dòng)情況,而且讓數(shù)據(jù)的響應(yīng)更“靈敏”。

效果檢驗(yàn)

做到目前為止效果怎么樣呢,直接看圖吧。

下圖中,綠線依然是rssi值,紅線是根據(jù)rssi直接算出來的瞬時(shí)測(cè)距結(jié)果,黃線是加入穩(wěn)定程序后的測(cè)距結(jié)果。

第一張圖是相對(duì)靜止的條件,可以看到黃線相對(duì)紅線明顯更加平穩(wěn),說明穩(wěn)定程序還是起作用的。

第二張圖是模擬快速遠(yuǎn)離的場(chǎng)景,可以看到黃線在保證平穩(wěn)的前提下緊跟紅線,沒有被甩掉,主要體現(xiàn)的是穩(wěn)定程序的動(dòng)態(tài)跟進(jìn)效果。

第三張圖是掄胳膊甩手機(jī)+遮擋信號(hào)模擬出的場(chǎng)景,貌似穩(wěn)定程序也架不住了,有點(diǎn)飄忽。

以上是關(guān)于穩(wěn)定程序的簡(jiǎn)要實(shí)現(xiàn)思路,生產(chǎn)環(huán)境中肯定會(huì)面臨更加復(fù)雜的情況,免不了還要做大量調(diào)試,這里只是拋磚引玉。

總結(jié)

藍(lán)牙測(cè)距簡(jiǎn)單來說就是一個(gè)公式的應(yīng)用,本身比較簡(jiǎn)單,基于測(cè)距可以實(shí)現(xiàn)很多近場(chǎng)應(yīng)用,比如近場(chǎng)簽到、近場(chǎng)推送等等,更進(jìn)一步甚至可以實(shí)現(xiàn)對(duì)移動(dòng)設(shè)備的定位,有了定位信息,很多室內(nèi)定位、室內(nèi)導(dǎo)航相關(guān)的應(yīng)用就都可以實(shí)現(xiàn)了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持

    BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持

    這篇文章主要介紹了BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持 ,凡是涉及到用戶編輯信息然后保存的頁面,都涉及到一個(gè)數(shù)據(jù)是否符合要求的檢查,需要客服端和服務(wù)器端的校驗(yàn)的問題,本文介紹非常詳細(xì),具有參考價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 教你如何使用THREEJS實(shí)現(xiàn)一個(gè)可調(diào)節(jié)檔位、可搖頭的電風(fēng)扇

    教你如何使用THREEJS實(shí)現(xiàn)一個(gè)可調(diào)節(jié)檔位、可搖頭的電風(fēng)扇

    夏天到了,用Three.js實(shí)現(xiàn)一個(gè)可以搖頭和調(diào)節(jié)檔位的電風(fēng)扇,主要使用到Blender處理3D模型,用Vite+Typescript搭建項(xiàng)目框架,這篇文章主要介紹了使用THREEJS實(shí)現(xiàn)一個(gè)可調(diào)節(jié)檔位、可搖頭的電風(fēng)扇,需要的朋友可以參考下
    2023-06-06
  • 原生JS控制多個(gè)滾動(dòng)條同步跟隨滾動(dòng)效果

    原生JS控制多個(gè)滾動(dòng)條同步跟隨滾動(dòng)效果

    本文要探討的是,當(dāng)這兩個(gè)容器元素的內(nèi)容都超出了容器高度,即都出現(xiàn)了滾動(dòng)框的時(shí)候,如何在其中一個(gè)容器元素滾動(dòng)時(shí),讓另外一個(gè)元素也隨之滾動(dòng)
    2017-12-12
  • js本地圖片預(yù)覽實(shí)現(xiàn)代碼

    js本地圖片預(yù)覽實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了js本地圖片預(yù)覽實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 字符串的replace方法應(yīng)用淺析

    字符串的replace方法應(yīng)用淺析

    按照W3C的說明,String對(duì)象的replace方法調(diào)用方式是stringObject.replace(regexp/substr,replacement)。
    2011-12-12
  • 微信小程序canvas2d生成圖形驗(yàn)證碼的方法

    微信小程序canvas2d生成圖形驗(yàn)證碼的方法

    這篇文章主要為大家詳細(xì)介紹了微信小程序canvas2d生成圖形驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • js實(shí)現(xiàn)自定義進(jìn)度條效果

    js實(shí)現(xiàn)自定義進(jìn)度條效果

    本文主要介紹了js實(shí)現(xiàn)自定義進(jìn)度條效果的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 使用原生JS實(shí)現(xiàn)滾輪翻頁效果的示例代碼

    使用原生JS實(shí)現(xiàn)滾輪翻頁效果的示例代碼

    這篇文章主要介紹了使用原生JS實(shí)現(xiàn)滾輪翻頁效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Javascript的this用法

    Javascript的this用法

    本文主要介紹了Javascript的this用法,具有很好的參考價(jià)值,有需要了解的朋友可以看看
    2017-01-01
  • 靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟

    靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟

    這篇文章主要介紹了靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟,適當(dāng)使用這些方法可以使調(diào)試更容易,更快速,更直觀,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04

最新評(píng)論