当前位置:文档之家› 定位系统的设计与实现知识分享

定位系统的设计与实现知识分享

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

上位机开发环境为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<nodenumber;i++){while(SendTimingDelay != 0){receivedate=0;Appsendmessage(addr[i],payload[i], 10);Delay(200);NTRXReceivecommand();if(receivedate==1)break;SendTimingDelay--;}SendTimingDelay =3;}……………………………………}1.2.2 从锚节点程序设计下面简要介绍下从锚节点的程序设计。

图1-6为从锚节点的流程图。

图1-6从锚节点的流程图其中,系统初始化和主锚节点一样。

进入死循环,监测来自主锚节点的命令;如果收到信息,首先进行命令格式检测,如果正确,再判断是什么命令。

假如为定位命令,则对目标节点发出测距请求。

将得到的结果封包发送给主锚节点;1.2.3 目标节点程序设计下面简要介绍下从锚节点的程序设计。

图1-7为目标节点的流程图。

图1-7 目标节点的流程图其中,系统初始化和主锚节点一样。

进入死循环,监测来自锚节点的测距命令;如果收到信息。

首先进行命令格式检测,如果正确,就继续和锚节点通信,开始测距任务,并由锚节点收集测距信息。

1.3 上位机软件设计定位系统上位机监控软件中,主要包括以下几个功能:串口通信、数据处理、定位计算等三个主要模块。

串口通信是上位机监测与控制硬件节点的唯一通道。

所有的指令发出以及信息获取都是通过串口来实现的;数据处理主要负责将串口收集到的原始数据加以处理,最大程度还原真实的距离信息,以便定位算法能够算出准确的目的节点坐标;定位算法主要负责将处理过的数据转换为参考坐标系的坐标。

这里的参考坐标系是建立在人工测定的几个锚节点的相对位置的基础上的,下面分别介绍这三个模块.1.3.1 串口通信模块串口通信是连接硬件节点和上位机软件的唯一枢纽,用户的定位指令以及硬件上传的测距信息都是通过串口传输到上位机软件中来的。

为了方便程序的书写,这里将串口封装称为一个类class CSerialPort;该类能够完成对串口的初始化,打开,读写,事件等待等功能。

MFC的一大特色是消息响应机制,在本类中,为了完成通信,作者定义以下消息:#define WM_COMM_BREAK_DETECTED WM_USER+1#define WM_COMM_CTS_DETECTED WM_USER+2#define WM_COMM_DSR_DETECTED WM_USER+3#define WM_COMM_ERR_DETECTED WM_USER+4#define WM_COMM_RING_DETECTED WM_USER+5#define WM_COMM_RLSD_DETECTED WM_USER+6#define WM_COMM_RXCHAR WM_USER+7#define WM_COMM_RXFLAG_DETECTED WM_USER+8#define WM_COMM_TXEMPTY_DETECTED WM_USER+9然后在类ESAP中使用 afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);获取串口送上来的消息。

因为串口是一个一个字符的形式将消息上传上来,故这里响应的是其WPARAM ch,当程序遇到”\r\n”,并且之前接受的数据长度大于10的时候,认为有新的数据包过来,否则丢弃掉。

数据包格式如表1-1,其中第一行为包格式,第二行为样例包。

各个数据以空格符号分开,以\r\n结尾。

表1-1 主锚节点上传数据包格式Serial Number Anchor Address Tag Address Distance RSSI1 71 11 2.36 50得到完整数据包后将数据包封装成结构体Result_Node,以节点的形式加入处理缓存队列,方便以后数据处理操作,其中结构体定义如下:struct Result_Node{int serial_number;char dest_addr[3];char src_addr[3];float distance;char rssi[3];};为达到对节点的控制的目的,只需在主程序中调用afx_msg LONG OnCommadToSend(WPARAM wparam, LPARAM cmd);为作者设计的一个指令包,包格式如表1-2:其中第一行为包格式,第二行为样例包。

相关主题