三边定位算法在OMNet++上的简单实现

2019/12/3高级网络课实验报告,才疏学浅。

一、实验原理:

本次实验目标为使用OMNet++仿真出三边定位算法在移动定位的应用场景,考虑本人学习有限,而在OMNet++中实现无线通信的工作较为复杂,本次实验采用以有线通信代替无线通信的方式进行简单模拟,搭建一个典型的三边定位网络拓扑图,实现基于到达时间TOA(Time of Arrival)的三边定位算法。

典型的TOA三边定位应用场景如下:

在该场景下,移动终端接收来自三个不同方向的不同基站的信号,通过到达时间计算与基站距离,再通过信号中包含的基站位置,通过三边定位算法估测自身位置。

Trilateration(三边测量)是一种常用的定位算法:

  1. 已知三点位置 (x1, y1), (x2, y2), (x3, y3)
  2. 已知未知点 (x0, y0) 到三点距离 d1, d2, d3

以 d1, d2, d3 为半径作三个圆,根据毕达哥拉斯定理,得出交点即未知点的位置计算公式:

( x1 - x0 )2 + ( y1 - y0 )2 = d12

( x2 - x0 )2 + ( y2 - y0 )2 = d22

( x3 - x0 )2 + ( y3 - y0 )2 = d32

   三边定位的算法原理图如下:

可以看出,在获取到临近三个基站的位置坐标与其相对于终端自身的距离后,即可通过三边定位算法估测自身位置坐标,本次实验搭建的网络拓扑图如下:

其中t1、t2作为终端节点,分别接收来自附近三个基站节点的消息,其中包含了基站名称、基站位置、发送时间,消息发送速率;终端节点处理并存储节点中的位置参考信息,对于来自同一个基站节点的信息采取覆盖存储,直到收到三个不同节点的参考信息,将三个参考数据输入三边定位算法接口,计算自身位置并向服务器节点发送报告信息,随后清空参考信息再次等待定位,实验实现了上述仿真定位方法,最终得到了不错的定位效果。

二、平台基本操作

  本实验使用OMNeT++ 5.5.1作为仿真平台,主要学习内容为:《OMNet++网络仿真》、B站“通信系统综合实验“系列视频,若干CSDN博客。

  1. OMNeT++ 5.5.1安装
  1. 官网下载Windows安装包。

  1. 启动mingwenv.cmd控制台,依次输入./configure、make,创建仿真库。

  1. 输入omnetpp,启动客户端。

  1. 客户端基本操作:打开仿真视图

  1. 客户端基本操作:新建工程

  1. 客户端基本操作:新建文件

5、客户端基本操作:运行仿真程序

 

三、关键代码

实验工程目录如下:

3.1 网络描述文件lbs.ned

   节点和网络定义如下图:

以实验目标出发,所有节点以简单模块实现,只定义必要接口,由于信道模块chanel中不包含信道长度一值,不提供读取节点距离的接口,故在网络内部自定义专属信道,添加距离参数,统一合适的速度,由距离计算时延,而距离直接根据节点坐标计算,这样做的优点为简单粗暴,缺点也很明显:信道不复用、添加和移动节点都需要再次计算。

3.2  基站向终端发送的位置参考消息定义lbsMsg.msg

       仅包含定位所需参数:源基站名、基站坐标、发送时间、传送速度(默认为1)。

3.3  终端像服务器发送的定位结果报告消息定义reportMsg.msg

       仅包含基站名称和定位结果。

3.4  终端解析的位置参考信息结构定义lsbRef.cpp

       存储位置参考消息的来源坐标、发送和到达时间、发送速率,在构造函数中调用内置函数,通过TOA方法计算此消息来源的相对距离,对外提供getter接口。

3.5  基站节点功能定义baseStation.cpp

初始化函数initialize()确定一个随机值作为发送时间,调用generateNewMessage()函数,产生定位参考消息lbsMsg,其中包含了节点名称、发送时间,并从ned文件确定的DisplayString中解析出本节点坐标,根据定时值发送。

3.6  终端节点功能定义terminal.cpp

handleMessage接收来自基站节点的消息,解析为lbsMsg类型,输出此定位参考消息的源节点名称和位置、时间信息,调用processMessage()处理。

后者将lbsMsg中的位置参考信息处理并存储在一个lbsRef对象中,由map键值对references保存该对象,references将消息来源节点名称作为key,对应的lbsRef对象作为value,保证了存储中的参考信息来自不同基站,同一基站的值将被覆盖。

当references中的参考信息到达3时,调用lbsFun函数,通过三边定位算法推测自身的位置,随后清空references,将结果输出,并向服务器节点发送位置报告消息reportMsg。

LbsFun函数调用Decawave公司的开源代码实现三边定位,代码参考于:https://blog.csdn.net/qq_40671789/article/details/97003271

由于定位算法实现不是本次网络实验的重点,在此不做介绍。

3.7  服务器节点功能定义server.cpp

对来自终端节点的reportMsg做解析并输出,功能比较单一。

四、实验结果分析

由上图可以看出,仿真程序成功地达到了实验目标,对于终端节点t1,定位算法输出结果为:195.214,155.531,而t1的真实坐标为:190,160;对于终端节点t2,定位算法输出结果为:640,185,而t2的真实坐标为640,185;由于消息发送无损耗、时延等干扰,三边定位算法准确性较高。

实验总结:本实验在OMNet++仿真平台上,通过用有线通信代替无线通信的方式,复现了三边定位算法的应用场景,但由于本人学习水平不够,项目实现的层次太低,具有很大的局限性,有待于对OMNet++平台和mixim等仿真框架的进一步学习。

发布了27 篇原创文章 · 获赞 0 · 访问量 969

猜你喜欢

转载自blog.csdn.net/qq_38093301/article/details/103377179