|
@@ -14,13 +14,14 @@ const STATUS_PIC = {
|
|
|
'3': 'fail'
|
|
|
};
|
|
|
|
|
|
+// 选择6档
|
|
|
const TXPOWER = 0
|
|
|
|
|
|
// 距离经验值(调试所得)
|
|
|
const N = 14
|
|
|
|
|
|
|
|
|
-let AveLength = 10
|
|
|
+let AveLength = 12
|
|
|
|
|
|
Component({
|
|
|
/**
|
|
@@ -43,7 +44,8 @@ Component({
|
|
|
api_base_url: API_BASE_URL,
|
|
|
// 是否是扫码播放
|
|
|
isScanPlay: false,
|
|
|
- cdn_url:CDN_URL
|
|
|
+ cdn_url:CDN_URL,
|
|
|
+ classfiy:{}
|
|
|
},
|
|
|
|
|
|
/**
|
|
@@ -67,30 +69,102 @@ Component({
|
|
|
|
|
|
this.openBluetooth(()=>{
|
|
|
startBeaconDiscovery({uuids: ['FDA50693-A4E2-4FB1-AFCF-C6EB07647825']}).then((res)=>{
|
|
|
+
|
|
|
wx.onBeaconUpdate(data=>{
|
|
|
- if (aveArr.length == AveLength) {
|
|
|
- aveArr[0] = data.beacons
|
|
|
- }
|
|
|
- else{
|
|
|
- aveArr.push(data.beacons)
|
|
|
+
|
|
|
+ //打印最新收集到的信号
|
|
|
+ console.log('beacon',data.beacons)
|
|
|
+ // 需要收集十组数据,索引号最大的组是最旧的
|
|
|
+ if (aveArr.length > AveLength) {
|
|
|
+ // aveArr[0] = data.beacons
|
|
|
+ //当超过十组时,应该将索引号大的组淘汰掉
|
|
|
+ aveArr.pop()
|
|
|
}
|
|
|
+
|
|
|
+ aveArr.unshift(data.beacons) //在队列前面插入
|
|
|
+
|
|
|
+ // console.log('aveArr',aveArr);
|
|
|
let all = []
|
|
|
aveArr.forEach(item => {
|
|
|
- all = all.concat(item)
|
|
|
+ // console.log(aveArr.length,item)
|
|
|
+ all = all.concat(item)
|
|
|
});
|
|
|
-
|
|
|
+ // classfiy = {10003:[{},{},···],10002:[{},{},···],10001:[{},{},···]}
|
|
|
+ // console.log('all',all)
|
|
|
let classfiy = BeaconUtils.classification(all,'major')
|
|
|
+ let accuaryList = {} // 存放处理后的accuary
|
|
|
+ // let dataArr = [] //记录各信标的信号收集数目
|
|
|
Object.keys(classfiy).forEach(key=>{
|
|
|
- //每个major的AveLength个元素数组
|
|
|
+ //每个major的AveLength个元素数组,元素为rssi
|
|
|
let arr = classfiy[key].map(item=>{
|
|
|
- return item.accuracy
|
|
|
+ return item.rssi
|
|
|
})
|
|
|
- //每个major的平均值
|
|
|
+ //每个major的rssi平均值
|
|
|
+ // console.log(key,'rssi',arr)
|
|
|
let ave = BeaconUtils.arrayAverage(arr)
|
|
|
+ // console.log('ave',ave)
|
|
|
+ //计算平均差
|
|
|
+ let meanDeviation = BeaconUtils.getMeanDeviation(arr,ave);
|
|
|
+ // console.log('meanDeviation',meanDeviation)
|
|
|
+ //计算各rssi的高斯模糊权重
|
|
|
+ let guassionArr = [];
|
|
|
+ for(let i = 0; i < arr.length; ++i){
|
|
|
+ // console.log('guassionArr ele',BeaconUtils.getOneGuassionArray(arr.length,i,meanDeviation))
|
|
|
+ // 返回的可能是空数组
|
|
|
+ guassionArr.push(BeaconUtils.getOneGuassionArray(arr.length,i,meanDeviation));
|
|
|
+ }
|
|
|
+ // console.log('guassionArr',guassionArr)
|
|
|
+ //计算高斯模糊后的rssi值
|
|
|
+ let rssiArr = []; //模糊后的rssi数组
|
|
|
+ for(let i = 0; i < arr.length; ++i){
|
|
|
+ let sum = 0;
|
|
|
+ for(let j = 0; j <arr.length; ++j){
|
|
|
+ sum += guassionArr[i][j] * arr[j]
|
|
|
+ }
|
|
|
+ rssiArr.push(sum);
|
|
|
+ // console.log('sum',sum)
|
|
|
+ }
|
|
|
+ // console.log('rssiArr',rssiArr);
|
|
|
+ //时间加权后求rssi平均值
|
|
|
+ let aveOnTime = BeaconUtils.arrayAverage(rssiArr.slice(Math.floor(0,rssiArr.length / 2)).concat(rssiArr));
|
|
|
+ // console.log('aveOnTime',aveOnTime)
|
|
|
+ //测距
|
|
|
+
|
|
|
classfiy[key].forEach(item=>{
|
|
|
- item.accuracy = ave
|
|
|
+ item.accuracy = BeaconUtils.calculateAccuracy(TXPOWER,aveOnTime,N)
|
|
|
+ if(!accuaryList[key]){
|
|
|
+ //如果还没有对应的“信标号”
|
|
|
+ accuaryList[key] = [item.accuracy]
|
|
|
+ }
|
|
|
+ accuaryList[key].push(item.accuracy)
|
|
|
+ // console.log('item',item)
|
|
|
})
|
|
|
+
|
|
|
+ // dataArr.push(classfiy[key].length)
|
|
|
+
|
|
|
})
|
|
|
+ console.log(classfiy['10001'])
|
|
|
+ console.log(classfiy['10002'])
|
|
|
+ console.log(classfiy['10003'])
|
|
|
+
|
|
|
+ // 计算方差
|
|
|
+ //计算平均数
|
|
|
+ // let x = BeaconUtils.arrayAverage(dataArr)
|
|
|
+ // let variance = BeaconUtils.getVariance(dataArr,x)
|
|
|
+ //打印收集到各种信号数目的方差
|
|
|
+ // console.log('txPower=',TXPOWER," 方差:",BeaconUtils.repeat('--',Math.floor(variance)))
|
|
|
+
|
|
|
+ // 定位
|
|
|
+ // 将三个信标构成直角三角形,其中10002号信标为直角,10001号为基点
|
|
|
+ // 根据挡位设定相邻顶点信标的距离,5档,设边长为10m
|
|
|
+ let sideLength = 5
|
|
|
+ let distance1,distance2,distance3 //分别对应游客到信标10001,1002,10003的距离
|
|
|
+ distance1 = BeaconUtils.arrayAverage(accuaryList['10001'])
|
|
|
+ distance2 = BeaconUtils.arrayAverage(accuaryList['10002'])
|
|
|
+ distance3 = BeaconUtils.arrayAverage(accuaryList['10003'])
|
|
|
+ let px = (Math.pow(2.8,2) - Math.pow(distance2,2) + Math.pow(distance1,2)) / (2.8 * 2)
|
|
|
+ let py = (Math.pow(5.6,2) - Math.pow(distance3,2) + Math.pow(distance2,2)) / (5.6 * 2)
|
|
|
+ // console.log('px',px,' py',py)
|
|
|
|
|
|
this.setData({
|
|
|
classfiy,
|