定位算法:
1、RSSI转距离的拟合公式
Zigbee信号强度RSSI与距离之间的转换关系:
公式1 : RSSI(d) = - (10nlgd+A) 求出d转换成公式2
公式2 : d=10^((ABS(RSSI)-A)/(10*n))
A=45---49 需根据多次测试得出
n=3.25----4.5 需根据多次测试得出
其中A为1米处的信号强度。由于信号强度与距离的的关系系数A,n直接影响测量的精度,因此需要多次测量不同距离的信号强度,以确定A,n的值,确保测量的精度.
再细讲一下。多次测量1米处的信号强度值的平均值为A。
然后多设定几个距离 d 代入A 求n。 看看n取几个比较准确。
2、极大似然估计法(Maximum likelihood estimation)
先每个zigbee节点发送自己的坐标位置到data,然后根据rssi值计算出d
根据d和坐标位置(x,y)得到矩阵:
A = [
{2(x(1)-x(n)),2(y(1)-y(n))},
{2(x(1)-x(n)),2(y(1)-y(n))},
...
{2(x(n-1)-x(n)),2(y(n-1)-y(n))}
]
b = [
x(1)^2-x(n)^2+y(1)^2-y(n)^2+d(n)^2-d(1)^2
...
x(n-1)^2-x(n)^2+y(n-1)^2-y(n)^2+d(n)^2-d(n-1)^2
]
X = [
x
y
]
AX =b;
最终的小车的坐标:X = (A^T * A)^(-1) * A^T * b;
3、协调器怎样区分不同的zigbee节点的数据?
网络ID,
/*发送的数据包*/
typedef struct ZB_BUF{
float x;//储存zigbee节点x坐标
float y;//储存zigbee节点y坐标
uint16 myNWK[4];//储存本节点的网络地址
}ZB;
uint16 nwk;
nwk = NLME_GetShortAddr();//获取本节点的网络地址
To_string(ZB.myNWK,(uint8 *)&nwk,2);//转化为二进制转换为16进制
Hal_UARTWrite(0,ZB.myNWK,2);//串口发送到协调器
MAC地址是全球唯一的。
4、osal操作系统轮询原理
Osal轮询查询任务是否是有事件发生,一旦有事件发生,跳出循环,
do{
If(taskEvents[idx])
{break;};
}while(++idx <taskCnt)(idx为任务id)不为0,
记下发生的事件,找到对应的任务处理函数进行处理。
Events = taskEvents[idx];
taskEvents[idx] = 0;
Events = (taskArr[idx])(idx,events);
taskEvents[idx] |= events;
利用函数设置一个事件时,发生了什么?例:
osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT))
{...
taskEvents[GenericApp_TaskID] = SEND_DATA_EVENT;
...}
其实质是将SEND_DATA_EVENT事件放到事件循环表中。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/bobsweetie/article/details/47126585