为了准确评估一个ad-hoc网络的协议,为移动主机的运动使用一个真实的模型是很重要的。信号强度,无线电干扰和信道占用等都取决于节点之间的距离。移动模型的选择可以显着影响模拟结果。(例如,数据分组传送比率,端到端延迟,平均跳数)
有两种将移动纳入仿真模拟的方法:使用轨迹。轨迹包含移动主机的一组动作记录,像现实生活中观察到的那样。使用合成模型。合成模型使用数学模型来描述移动主机的行为。
有代表移动节点彼此独立运动的移动模型(实体模型)还有一些表示移动节点彼此依赖(组模型)的移动模型。一些最常用的实体模型是:RandomWalk Mobility Model, Random Waypoint Mobility Model, Random DirectionMobilityModel, Gauss-Markov Mobility Model, City Section Mobility Model。组模型包括:Column Mobility Model,Nomadic Community Mobility Model, Pursue Mobility Model, Reference Point Group Mobility Model。
INET框架包含以下跟踪文件的组件:
l BonnMotion:BonnMotion场景生成工具的原生文件格式。
l NS2:由Ns2中使用的CMU场景生成器生成的路径文件。
l ANSim:ANSim(Ad-Hoc Network Simulation)工具的ANSim XML跟踪文件。
将新实体移动模型整合到INET框架中很容易,但群组移动性尚未得到支持。因此INET附带的所有模型都是实体模型的实现:
DeterministicMotions:固定节点位置以及节点沿着线。圆或者矩形移动。
RandomWaypoint:包括目的地和速度变化时的随机暂停时间。
Gauss-Markov:使用一个调整参数来改变移动模式中的随机程度。
MassMobility:描述了惯性和动量的质点。
ChiangMobility:使用概率转换矩阵来改变节点的运动状态。
在INET中,移动节点必须包含一个实现IMobility标记接口的模块。该模块存储节点当前的坐标,并负责定期更新位置,并在位置发生变化时发出mobilityStateChanged信号。
节点的显示字符串的p [0]和p[1]字段也被更新,所以如果观察仿真动画页面,节点实际上也是在移动的。节点的当前位置可以从显示字符串获得。
无线电仿真(radio)具有一个ChannelControl模块,用于在通信距离内的节点之间建立通信通道,并在超出范围时断开连接。ChannelControl模块使用mobilityStateChanged信号来确定连接状态何时需要更新。
拓展新的移动模式有两种方法。简单但是比较有局限性的方法是使用TurtleMobility作为移动组件,并编写类似的turtle图形的脚本。第二种方法是去拓展C++简单模块。在这种情况下,移动模块的C ++类应该来自IMmobility,其NED类型应该实现IMmobility接口。
抽象类MobilityBase类是定义所有移动模块的基础类。这个类允许定义节点不能离开的立方体区域。这个立方区域由:constraintAreaX,constraintAreaY,constraintAreaZ,constraintAreaWidth,constraintAreaHeight和constraintAreaDepth这些参数构成。当模块被初始化时,它通过调用initializePosition()方法来设置节点的初始位置。如果initFromDisplayString参数设置为true,则此方法的默认实现将设置显示字符串的位置。否则,由 nitialX,initialY和initialZ参数定义初始位置。如果这两种参数都没有定义,则再指定区域内随机给定一个位置。
该模块负责定期更新位置。为了达到此目的,它必须定时给自己发送消息。这些消息在handleSelfMessage方法中处理。在派生类中,handleSelfMessage应计算新位置并更新显示字符串,并通过调用positionUpdated方法来发布新位置。当节点到达约束区域的边界时,移动性组件必须阻止节点退出。 它可以调用handleIfOutside方法,该方法提供以下策略:
l reflect of the wall
l reappear at theopposite edge (torus area)
l placed at a randomlychosen position of the area
l stop the simulationwith an error
当节点在连续轨迹上移动并周期性地更新其位置时,可以使用抽象的MovingMobilityBase类对移动性进行建模。子类只需要实现move方法,负责更新节点的当前位置和速度。
抽象move方法在每个updateInterval步骤中自动调用。当客户端请求当前位置或速度时,或者当移动方法通过设置nextChange字段在未来时间请求更新时,也会调用该方法。当运动状态在不是updateInterval倍数的特定时间更改时,可以使用此选项。该方法可以将字段设置为真以指示节点到达其最终位置并且不需要更多位置更新。
移动节点的路径通常由恒定速度的线性运动组成。节点以某种速度移动一段时间,然后以另一种速度移动另一段时间,依此类推。如果一个移动模型符合这个描述,那么从LineSegmentsMobilityBase派生实现的C ++类可能是合适的。
模块首先通过调用setTargetPosition方法来选择目标位置和目标时间。如果目标位置与当前位置不同,它将开始向目标移动,并在配置的updateInterval间隔中更新位置。当目标位置到达时,它会选择一个新的目标。
StationaryMobility:这个移动模型什么也不做,可以用于静止固定位置的模型。
StaticGridMobility:将所有节点放置在矩形网格中。
LinearMobility:这是一个具有速度,角度和加速度参数的线性移动模型。角度仅在移动节点撞击墙壁时发生变化:然后以相同角度反射墙壁。Z轴是一个确定值,只在x-y二维平面内移动。
CircleMobility:以恒定速度绕着平行于X-Y平面的圆移动节点。节点从约束区域的边界反弹。这个圆通过cx,cy和r三个参数给出;初始位置有startAngle参数给出。节点的位置在updateInterval步骤中刷新。
RectangleMobility:在约束区域周围移动节点。 配置:速度,startPos,updateInterval。
TractorMobility:将Tractor移动到具有一定行数的字段中。下图说明了rowCount参数为2时Tractor的移动情况。轨迹遵循1中的段;2;3;4;5;6;7;8;1;2;3::订单。 该区域由x1,y1,x2,y2参数配置。
此部分我为涉及,暂不做翻译。
BonnMotionMobility使用BonnMotion的本机文件格式。
该文件是纯文本文件,每行描述一个主机的运动。 一行由一个或多个实数的(t,x,y)三元组组成,如下所示:
t1 x1 y1 t2 x2 y2 t3 x3 y3 t4 x4 y4 ...
其含义是给定节点在tk时达到(xk; yk)。 没有单独的分割符号,所以x和y坐标将在一直重复给出。
Ns2Mobility节点根据NS2中使用的路径文件进行移动。路径文件的格式如下:
# ’#’starts a comment, ends at the end of line
$node_(
$node_(
$node_(
$ns at$time "$node_(
towards
Ns2MotionMobility模块有一下参数:
l traceFile: Ns2路径文件
l nodeId:跟踪文件中的节点标识符; -1用父模块的索引代替。
l scrollX,scrollY:用户指定的坐标转换
ANSimMobility读取ANSim工具的路径文件。
节点正沿着符合此DTD的XML跟踪文件描述的线性段移动:
此模块的参数:
l ansimTrace:路径文件
l nodeId:跟踪文件中的节点标识符; -1用父模块的索引代替。
ANSimMobility模块仅处理position_change元素,并忽略start_time属性。 它立即开始下一部分的移动。
TurtleMobility模块可以通过包含XML格式的移动命令脚本文件进行参数化。TurtleMobility模块有一下参数:
l updateInterval更新主机位置的时间间隔。
l constraintAreaX, constraintAreaY, constraintAreaWidth, constraintAreaHeight:节点不能离开的约束区域。
l turtleScript描述移动的路径文件。
XML文件的内容应符合以下DTD文件(可在源代码树中作为TurtleMobility.dtd找到):
该文件包含movement元素,每个描述一个轨迹。Movement的id属性可以用来在ini文件中指定移动轨迹:
**.mobility.turtleScript= xmldoc("turtle.xml", "movements//movement[@id=’1’]")
节点的运动由均匀的线性段组成。 运动状态由以下变量描述:
l Position:(x; y)节点当前位置的坐标。
l speed, angle:节点速度的大小和方向。
l targetPos:当前的目标位置。如果给定的速度和角度不被使用。
l targetTime:当前线性运动的结束时间。
l borderPolicy:下面当中的一个
-reflect反弹,向相反方向移动。
-wrap出现在对立的另一边。
-placerandom随机出现在该区域的一个位置。
-error当node触碰边界时报错。
movement元素可以包含以下命令:
repeat(n) 重复其内容n次,或者如果省略则不重复。
set(x,y,speed,angle,borderPolicy) 修改节点的状态
forward(d,t) 以当前速度将节点移动t时间或移动到d距离。如果t和d同时给出则忽略速度(也就是在t时间内移动d距离)。
turn(angle) 通过angel增加节点的角度。
moveto(x,y,t) 在给定的时间内移动到点(x; y)。如果未指定t,则以当前速度进行。
moveby(x,y,t) 在给定的时间内通过偏移量(x; y)移动。 如果未指定t,则以当前速度进行。
wait(t) 等待指定的时间。
给出属性值即可不要添加单位,已经假定距离以米为单位,时间间隔以秒为单位,速度以米/秒为单位。属性可以包含每次执行命令时评估的表达式。约束区域的限制可以引用为$ MINX,$ MAXX,$ MINY和$ MAXY。使用随机数分布则在评估时会生成一个新的随机数,因此该脚本既可以描述随机场景又可以描述确定性场景。
为了说明模块的用法,以下展示了一些基础移动模型如何用路径脚本实现:
l RectangleMobility:
l Random Waypoint:
l MassMobility: