4

我正在编写一个涉及 2-UUV 和 1-USV 的模拟脚本。两者都在正交割草机运动模型中进行测量。我想留在两辆车的范围内,所以他们从同一个起点开始。我想知道如何定义USV运动模型,使其在UUV大多数情况下始终处于两者的通信范围内。

  1. 基本上我怎样才能手动提供动态路径规划/运动模型,USV以便我可以在UUV大部分时间与两者进行沟通?甚至可能吗?有人可以提供一个基本的例子或指出我正确的方向吗?

这是我的模拟脚本:

import org.arl.fjage.RealTimePlatform
import org.arl.unet.sim.MotionModel

///////////////////////////////////////////////////////////////////////////////
// display documentation

println '''
Bedford Basin AUV node network
------------------------------

Node USV-1: tcp://localhost:1101, http://localhost:8081/
Node UUV-1: tcp://localhost:1102, http://localhost:8082/
Node UUV-2: tcp://localhost:1103, http://localhost:8083/

------------------------------
------------------------------
'''

///////////////////////////////////////////////////////////////////////////////
// simulator configuration

platform = RealTimePlatform   // use real-time mode
// origin = [44.696178,-63.632992] // Bedford basin GPS co-ordinates 
origin = [44.434153,-63.251702]

simulate{
  def n1 = node 'USV', location: [0.m, -100.m,  1.8.m], heading: 45.deg, mobility: true, web: 8081, api: 1101, stack: "$home/etc/setup"
    n1.motionModel = MotionModel.lawnmower(speed: 0.5.mps, leg: 200.m, spacing: 50.m, legs: 17) 
                      
  def n2 = node 'UUV-1', location: [0.m,  0.m,  30.m], heading: 90.deg, mobility: true, web: 8082, api: 1102, stack: "$home/etc/setup"
    // n2.motionModel = MotionModel.lawnmower(speed: 3.3554.mps, leg: 6000.m, spacing: 40.m, legs: 150)
    n2.motionModel = MotionModel.lawnmower(speed: 0.3.mps, leg: 1000.m, spacing: 50.m, legs: 20)
  def n3 = node 'UUV-2', location: [0.m,  0.m,  30.m], heading: 180.deg, mobility: true, web: 8083, api: 1103, stack: "$home/etc/setup"
    //  n3.motionModel = MotionModel.lawnmower(speed: 3.3554.mps, leg: 6000.m, spacing: -40.m, heading:90.deg, legs: 150)
     n3.motionModel = MotionModel.lawnmower(speed: 0.3.mps, leg: 1000.m, spacing: -50.m, heading:90.deg, legs: 20)
}
  1. 如何使用platform = DiscreteEventSimulator运动模型?如果我想在更短的时间内模拟几个小时的模拟?

参考:

  1. “使用单个信标进行协作水下仅范围导航的路径规划”,M.Chitre
4

1 回答 1

2

Unet 模拟器支持多级运动模型,具体取决于模拟所需的复杂性。

每个模拟节点中的NodeInfo代理实现了一个基本的动态模型。mobility使用可以在模拟脚本中或直接在NodeInfo代理上设置的标志打开模型。启用后mobility,代理会location根据运动参数(例如speedheading 使用简单动力学模型)自动更新。这可以很方便地模拟节点的运动,例如,从水下调制解调器游走的 AUV。

我们可以通过手动更新模拟中一个节点的参数来轻松做到这一点。使用2-node-networkUnet IDE 中的示例。IDE 的“地图”视图可以方便地可视化节点的运动。连接到节点 A 的 WebShell 并设置mobilityheading、 和speed参数。随着模拟的继续,节点 A 的位置将继续根据speed和更新heading

// On Node A's shell, set heading to 45deg and speed to 10m/s
node.mobility = true
node.heading = 45
node.speed = 10

节点

对于更高级的用例,Unet 模拟脚本允许在节点上设置一系列运动参数的设定点。这是使用模拟脚本中对象motionModel上的参数完成的。nodeUnet 手册在第 30 章中有几个这样的例子

将每个设置点的各种运动属性设置motionModel为 a Listof将在适当的时间/持续时间Maps自动将属性设置到特定模拟节点的代理上。NodeInfo这反过来又驱动动力学模型NodeInfo给出设定点之间的插值位置。例如,可以使用此模拟脚本使用 4 个设定点来模拟在正方形中移动的节点。请注意,运动会在最后一个设定点之后自动停止。

def n = node 'B', location: [ 1.km, 0.km, -15.m], web: 8082, api: 1102, stack: "$home/etc/setup", mobility: true
n.motionModel = [
  [time:     0.minutes, heading:  0.deg, speed:   1.mps],
  [time:     1.minutes, heading:  -90.deg, speed: 1.mps],
  [time:     2.minutes, heading:  180.deg, speed: 1.mps],
  [time:     3.minutes, heading:  90.deg, speed:  1.mps],
]

列表

该实用方法MotionModel.lawnmower有助于为割草机运动模式的List一组属性设定点生成此值。Map

最后,如果需要更细粒度的运动控制,可以将motionModel模拟节点的属性设置为 Groovy Closure。由模拟器使用当前模拟时间戳调用,并期望以 Groovy MapClosure的形式返回单个设置点。例如,可以通过将其分配给来实现与正方形图案类似的逻辑。ClosuremotionModel

def n = node 'B', location: [ 1.km, 0.km, -15.m], web: 8082, api: 1102, stack: "$home/etc/setup", mobility: true
startTime = -1
n.motionModel = { ts -> 
  def setpoint = [speed: 10.mps, duration: 1.minutes]
  if (startTime < 0) startTime = ts
  if (ts <= startTime+1.minutes){
    setpoint["heading"] = 0.deg
  } else if (ts <= startTime+2.minutes){
    setpoint["heading"] = -90.deg
  } else if (ts <= startTime+3.minutes){
    setpoint["heading"] = 180.deg
  } else if (ts <= startTime+4.minutes){
    setpoint["heading"] = 90.deg
  } else {
    setpoint = [speed:0.mps]
  }
  return setpoint
}

关闭

更复杂的逻辑也可以在内部实现,Closures包括与其他代理甚至其他节点的通信。

最后,基于方法还可以允许人们通过简单地返回具有属性的设置点Closure来覆盖代理中的内置动态模型,该属性将允许直接从动态模型更新节点的位置,而不是通过动态模型。NodeInfolocationClosure

于 2021-04-26T07:55:38.677 回答