定位系统的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定位系统的设计与实现

本文实现的定位系统针对室外环境及办公室环境的实现的定位应用,通过对场景中人员、物品进行定位,方便用户对目标的实时监测和管理。

上位机开发环境为MFC (Microsoft Foundation Classes),它是一个微软公司提

供的类库,以C++类的形式封装了Windows API ,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows 句柄封装类和很多Windows 的内建控件和组件的封装类。它的详细介绍在这里就不赘述了。下面对本定位系统的具体实现过程进行比较详细的描述。

1.1 定位系统结构

定位系统拓扑结构图如图1-1所示。其实际场景应用可以参考图1-2。

Anchor

图1-1 定位系统拓扑结构图

ANCHOR

串口代理

传输测距结果

图1-2 实际应用场景图

本拓扑中有三种功能不同类型的节点:主锚节点、从锚节点、目的节点。其

中主锚节点和从锚节点是一类已知自身位置坐标信息的固定节点,它们的任务是获取包含距离信息以及信号强度值的数据包。目的节点是可以自由移动的节点,可以在一定范围内自由移动,定位系统的最终目的就是获取该类节点位置的坐标信息;从锚节点负责发起测距请求,将测距信息发往目的节点,得到从锚节点与目的节点的距离信息以及信号强度信息,并将该信息发往主锚节点。主锚节点在整个系统中起着至关重要的作用,首先它要响应上位机发出的命令,确定要定位的目标,并发出指令,命令从锚节点对目标节点进行测距;其次主锚节点不仅要获取自身与目标节点的距离信息以及信号强度信息,还需要协调控制三个从锚节点,接受从锚节点发回的测距信息;最后主锚节点负责并将这些信息送还给上位机软件处理。目的节点实时监测是否有定位请求并配合锚节点测出响应的距离信息以及信号强度信息;

本定位系统主要包括四大块:硬件节点、硬件节点软件、上位机监测软件以及显示模块。每一部分设计都有其特殊性,硬件节点为系统提供了定位所需的硬件平台,是信息采集的基础,第三章已经详细介绍其性能,这里不再赘述。硬件节点软件主要完成了节点间的链路建立和数据采集与传输。上位机软件首先通过有线方式(使用串口)接收由定位硬件节点采集到的相关信息,然后对所采集的定位信息进行处理,最后选用合适的定位算法,计算出目标节点在该参考系的坐标。显示模块负责动态显示节点定位效果,免去人工思考数字坐标所代表的具体意义,是定位软件人性化设计的一个体现。图1-3为系统整体程序流程图;

图1-3系统整体程序流程图

下面分别详细介绍余下的三个模块。

1.2 硬件节点软件

本定位系统的基本思想是主锚节点收集所有的从锚节点到目标节点以及自身到目标节点的距离信息以及信号强度(RSSI),由主锚节点将信息传送到上位机监测软件,上位机软件调用相应的定位算法,计算出目标节点的坐标位置并实现必要的显示。因此,首先需要在硬件平台上实现节点间的通信,本文采用星形拓扑结构,这种网络拓扑组建简单,并且便于数据采集。主锚节点担当中心节点的角色,以轮询的方式发送测距命令,这样实际在同一时间段内只有一对节点在工作。避免了因冲突造成的处理时延单方向增加,导致定位结果不准确。可参考图1-1。因为本系统采用的nanoPAN5032模块自身并没有组网功能。所以需要作者自己重新编写代码以实现组网功能。通信流程如图1-4:

图 1-4 通信流程图

其具体实现过程如下:

(1)主锚节点接受定位命令。主锚节点要获取节点的位置信息,就要循环给所有从锚节点发送测距请求信号,通信方式为轮询方式。保证所有的从锚节点都可收到该测距请求。反复获取所有锚节点与目标节点的距离以及信号强度信息;

(2)从锚节点收到测距请求。从锚节点向目标节点发送测距请求,目标节点如果在该区域内,收到该请求就与该锚节点发生点到点的通信,经过一个SDS-TWR 测距过程以后,从锚节点将获取到的相应的距离信息以及信号强度信息发送给主锚节点;

(3)主锚节点一旦受到测距信息,就将这些信息传到上位机监测软件中,由检测软件的缓存暂时保存这些数据,以便以后的定位计算;

1.2.1 主锚节点程序设计

主锚节点除了要完成从锚节点的主体功能外,还负责整个通信的协调工作以及将数据传送给上位机,给定位软件提供所需的定位信息。下面简要介绍下主锚节点的程序设计。图1-5所示为主锚节点的软件流程图。

图1-5 主锚节点的流程图

其中,系统初始化主要是系统的一些硬件管脚、串口、时钟等进行初始化配置。然后进入死循环,监测上位机命令。监测命令主要通过读取串口信息来实现,如果收到信息,首先进行命令格式检测,如果正确,再判断是什么命令。假如为定位命令,则自身发出测距请求然后命令其余三个锚节点依次对目标节点发出测距请求,这种拓扑结构不仅很容易搭建,而且也避免由于处理冲突导致处理时延增大,导致测距结果变大;

int main(void)

{ …………………………………….

RCC_Configuration(); /* Configure the system clocks */

NVIC_Configuration(); /* NVIC Configuration */

GPIO_Configuration(); /* Configure the GPIOs */

USART_Configuration(); /* Configure the USART1 */ SysTick_Config(); /* Configure the systick */

nano_main(NULL,NULL);

…………………………

}

其中nano_main()部分代码如下:

int nano_main(int ac, char *av[])

{

…………………………

while(1)

{

……………………….

while(SendTimingDelay > 0)//限定最大发送测距请求次数

{

receivedate=0; //是否收到数据的状态

PollApplication();

Delay(200);

NTRXUpdate();

if(receivedate==1)

break;

SendTimingDelay--;

}

SendTimingDelay =3;

for(;i

{

while(SendTimingDelay != 0)

{

receivedate=0;

Appsendmessage(addr[i],payload[i], 10);

Delay(200);

NTRXReceivecommand();

相关文档
最新文档