4 votes

Comment calculer dynamiquement la trajectoire d'un nœud (USV) pour deux UAV connectés qui effectuent des relevés selon un schéma orthogonal de tondeuse à gazon dans une simulation ?

J'écris une simulation script qui fait intervenir 2-UUV et 1-USV. Les deux véhicules sous-marins font des relevés dans un modèle de mouvement orthogonal de tondeuse à gazon. Je voudrais rester dans la portée des deux véhicules, donc ils ont commencé au même point d'origine. Je veux savoir comment définir USV modèle de mouvement de telle sorte qu'il soit toujours dans la portée de communication des deux UUV pendant la plupart du temps.

  1. Fondamentalement, comment puis-je fournir manuellement un modèle dynamique de planification de la trajectoire et de mouvement à l'équipe d'évaluation de la sécurité ? USV afin que je puisse communiquer à la fois UUV la plupart du temps ? Est-ce même possible ? Quelqu'un pourrait-il me donner un exemple de base ou m'indiquer la voie à suivre ?

Voici ma simulation script :

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. Comment puis-je utiliser platform = DiscreteEventSimulator avec le modèle de mouvement ? Si je veux faire des heures de simulation en moins de temps ?

Référence :

  1. "Planification de la trajectoire pour la navigation sous-marine coopérative à distance uniquement à l'aide d'une seule balise", M.Chitre

2voto

notthetup Points 1088

Le simulateur Unet prend en charge plusieurs niveaux de modèles de mouvement en fonction de la complexité requise pour la simulation.

El NodeInfo dans chaque nœud simulé met en œuvre un modèle dynamique de base. Le modèle est activé à l'aide de la fonction mobility qui peut être défini dans un script de simulation ou directement sur le fichier NodeInfo agent. Lorsque mobility est activé, l'agent met automatiquement à jour location en fonction de paramètres de mouvement tels que speed y heading en utilisant le modèle dynamique simple. Cela peut être pratique pour simuler le mouvement d'un nœud, par exemple, un AUV qui s'éloigne d'un modem sous-marin.

Nous pouvons facilement le faire en mettant à jour manuellement les paramètres de l'un des nœuds d'une simulation. Utilisez l'option 2-node-network exemple de l'IDE Unet. La vue "Map" de l'IDE est très pratique pour visualiser le mouvement des nœuds. Connectez-vous au WebShell du nœud A et définissez l'attribut mobility , heading et speed paramètres. Au fur et à mesure que la simulation se poursuit, l'emplacement du nœud A continuera d'être mis à jour sur la base des paramètres suivants speed y heading .

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

node

Pour un cas d'utilisation plus avancé, les scripts de simulation Unet permettent de définir une série de Setpoints de paramètres de mouvement sur un nœud. Ceci est fait en utilisant la fonction motionModel sur la node Objet dans la simulation script. Le site Le manuel Unet en donne quelques exemples au chapitre 30. .

Réglage de motionModel à un List de Maps avec diverses propriétés de mouvement pour chacun des points de consigne, les propriétés seront automatiquement réglées sur les NodeInfo pour le nœud simulé spécifique à/dans le temps/durée approprié. Ceci entraîne à son tour le modèle dynamique dans NodeInfo donnant l'emplacement interpolé entre les points de consigne. Par exemple, un nœud se déplaçant dans un carré peut être simulé en utilisant cette simulation script en utilisant 4 Setpoints. Notez que le mouvement s'arrête automatiquement après le dernier Setpoint.

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],
]

list

La méthode de l'utilité MotionModel.lawnmower contribue à générer cette List pour un ensemble de points de consigne Map de propriétés pour un modèle de mouvement de tondeuse à gazon.

Enfin, si un contrôle du mouvement encore plus fin est nécessaire, on peut définir la propriété motionModel du nœud simulé vers un fichier Groovy Fermeture . Le site Closure est appelé par le simulateur avec l'horodatage de la simulation en cours et doit retourner un point de consigne unique sous la forme d'un fichier Groovy Carte . Par exemple, une logique similaire à celle d'un motif carré peut être mise en œuvre avec ceci Closure affecté à motionModel .

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
}

closure

Une logique plus complexe peut également être mise en œuvre à l'intérieur de tels Closures y compris la communication avec d'autres agents et même d'autres nœuds.

Enfin, le Closure peut également permettre de remplacer le modèle dynamique intégré dans l'environnement de l'utilisateur. NodeInfo en renvoyant simplement un point de consigne avec un location qui permettra de mettre à jour l'emplacement du nœud directement à partir de la propriété Closure au lieu de passer par le modèle dynamique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X