1.引言
处理器、存储和无线通信技术的不断进步为网络化传感器开辟了新的发展空间,网络化传感器不仅仅是一个简单的传感器,它由处理器、存储器、无线收发机、电池和一组传感器构成,具有传感、计算和通信等多种功能。而且伴随着制造工艺的不断革新,网络化传感器的体积变得越来越小,因此人们形象的称它为“智能尘埃”。由这种“智能尘埃”组成的无线传感网络被广泛的应用到各方面,例如环境监测、**侦察等。定位问题是传感器网络设计与应用中的一个重要问题。传感器节点的位置信息在传感器网络的协议设计、网络管理、节点间协作、目标跟踪等方面都具有重要的理论和实际意义。
2. 基于测距的定位
2.1 软硬件环境及可行性分析
我们使用的节点是CrossBow公司的MPR400CB,节点上所使用的处理器是ATmega128L。ATmega128L处理器的约为主频7.4MHz,CPU时钟周期是136ns,另外ATmega128L处理器使用的是精简指令集和流水线技术,大部分指令的执行周期都只占用一个CPU时钟周期,中断的响应周期占4个CPU时钟周期。如果测10cm的距离,声速假设是340m/s,那么则ΔT应该大约为0.294ms;假设每条指令的执行时间都是136ns,那么在ΔT这段时间内节点可以大约执行2161条指令,所以说处理器在处理速度上是足够了。另外处理器中计数器晶振的频率*快可以达到每毫秒7373次,所以计时器也具有足够的**度用来计时。所以,声波法测距中,计时的环节上不存在问题。
我们所用的传感器板是CrossBow公司的MTS310CA。MTS310CA传感器板上同时集成了蜂鸣器和麦克风。蜂鸣器是一个简单的4KHz压电共鸣器。它的驱动和频率控制电路是内部集成的。对它的操作只需控制开关就行了。MTS310CA传感器板提供了麦克风,有两个主要用途,一个用途是用来做声音的测距,另一个用途是用来录音和测量声音。其中麦克风自带了滤波器和声音***,可以用来对MTS310CA传感器板上蜂鸣器发出的4kHz的声音进行监听。
节点上运行的操作系统为TinyOS。TinyOS是一种源代码开放的操作系统,是美国加州大学伯克利分校为低功率的嵌入式网络传感器而设计的基于事件驱动的嵌入式操作系统,它以*少的硬件配置支持网络化传感器所需的并发密集操作,是一种微线程、事件触发的操作系统。它保持了网络化传感器所特有的诸多特性,高效的管理硬件系统,同时支持并发密集操作,从某种意义上达到高效的模块化和运行的健壮性。
2.2 算法实现
为了用声波测距且将距离的*小分辨率提高到至少10厘米,我们必须对TinyOS提供的定时器TimerC进行改造。考虑到TinyOS本身的一些其他重要组件,如节点间无线通信模块GenericComm.nc、模数转换器ADCC等都用到了系统提供的TimerC组件。所以我们如果要改造TimerC,那么在改造的同时还要保证原来的功能不变。另外一种方法是利用处理的另外一个硬件资源,也就是Timer/Counter1,自己编写一个专用的Timer。比较两种方法,前一种在原来的基础上稍加改进节省硬件资源;后一种方法的话比较简单,但专门用了处理器的一个定时计数器只实现一个Timer,从硬件角度看浪费较大,不过它可以达到很高的计时速度,可以用来进行高频率的采样。
这种方法的基本思想为:Beacon节点以固定的时间间隔先通过无线发射装置向Listener节点发射一条准备测距的消息,其中包含一个时间戳,没法一次准备测距的消息时Beacon节点将时间戳加1。这里Beacon节点是用两个定时器,**个定时器用来控制向Listener发送准备测距的消息的时间间隔,**个定时器用来控制蜂鸣器的发声时间。这里两节点通过Beacon使用的SendMsg接口的SendMsg.sendDone(TOS_MsgPtr sent, result_t success)事件和Listener使用的ReceiveMsg接口的event TOS_MsgPtr ReceiveMsg.receive(TOS_MsgPtrm)事件达到两节点间的同步。也就是说,对于Beacon来说,当SendMsg的发送完成时即产生SendMsg.sendDone事件,Beacon将蜂鸣器打开一段时间;对Listener来说当ReceiveMsg产生ReceiveMsg.receive事件时,Listener节点开始计时。
2.3 结果分析
程序在传感器节点上运行,在基站接收到的数据(如图1)是两节点距离20厘米时的测量结果,其中发回基站标出的数值乘以10厘米就是两节点间的实际距离。
图1中横线的数据表示节点测量到的距离,比例因子是10厘米。从数据流可以看出,测量的结果不稳定,有漂流而且较大。但其中有正确的结果02也就是20厘米,同样,将两节点的距离放置30厘米、40厘米、50厘米、60厘米、70厘米和80厘米,得到的数据有类似的特点。仔细对声波测距的误差分布图分析后,发现其误差的分布以一种比较随意的分布,不能用我们常用的例如正态分布等分布来对其进行拟合。然而,我们使用一种比较简单的*小值滤波得到了比较好的效果。因为对接收到的数据流仔细观察,虽然在同一距离中测量值偏差的分布没有任何规律,但是从某一宽度的时间窗口,也就是同一距离时连续测到的一组数据(例如连续的10个测量值),内中必有和真实距离相符的正确的测量值,而且在这一组数据中值*小。
由上面分析得到数据的特点我们决定采用*小值滤波法来改进测量,也就是在一组连续的数据(试验中发现10个连续的数据长度是在可以保证数据的正确率大于98%的情况下的*短距离)中找出这些数据中值*小的那个值来代表着一段时间内测距结果。这样两节点的一次测距,通过10对他们的10次连续测距并采用*小滤波得到。不过这种方法的缺点也是比较明显的,也就是增加了节点之间的测距所需要的时间,如果原来是每一秒钟测一次距离,那么用这种算法如果滤波的长度取10的话,变成每10秒钟测一次距离,也就是10秒定一次位。这使测量的实时性降低,为了提高实时性,可以缩短Beacon每次发射准备测距信号的时间间隔,如每100毫秒进行一次,这样就使得同样的算法情况下定位测距的时间缩短到1秒钟一次。
将算法改进,对两节点的一次测距值,通过连续的10测距并采用*小滤波得到。将改进的程序烧上载到传感器节点,将两节点的距离分别放置为10厘米、20厘米、30厘米……200厘米,观察基站接收到的数据。接收到的数据也就是测量值比较稳定且与两节点之间实际的距离*大误差在正负10厘米之内。
在这里我们使用*小值滤波的原因是,我们对时间的读数总不可能比声音到达的时间快,所以这里用*小的值估计应该是*接近真实值的。
3. 结论
由于在传感器网络中,时间同步是一个需要解决的核心科学问题,同时也是一个难题,而在节点的测距和定位过程中,我们又需要**的时间同步。采用对特定的声音频率(4kHz蜂鸣器发出的声音)产生中断来判断声音是否到达从而进行测距的方法,我们得出以下几点结论:
l 外界环境对于测距的影响较大,尤其是外界噪声和蜂鸣器发出的声音的回声;
l当测距较远时,如果是在室内回音对于测距结果影响很大,即使采用*小值滤波法也不会得到稳定的值。为了消除回音的影响,应该将蜂鸣器的发声时间间隔取小,两次发声之间的时间间隔取大,从而消除室内回音影响,在采用上述方法消除回音的影响之后,在长距离的测量中得到稳定而正确的数据;
l 对于距离的分辨率,可以通过改变Listener计时器触发的时间间隔来控制,也就是 callTimer.start2(TIMER_REPEAT,10),将**个参数的数值变小可以提高,但不能变得太小,太小的话会使其负载增大,反而使测量结果不准确。另外由于麦克风不够灵敏的原因将其值设置得太小对测量结果影响不大。实验表明10厘米的分辨率是一个比较好的取值,而且国外大部分采用声音测距的误差也是10厘米,由于硬件本身的因素,误差无法进一步减小;
l 该方法的定位时间比较长,不如信号强度定位好,适用于节点间相对位置较为稳定或者变化速度不是很快的网络拓扑结构中的定位。
本文作者**点:通过简单而有效的时间戳来达到近似的时间同步并对测量数据进行*小滤波来实现测距和定位。