Tâche 1: Navigation autonome sur le terrain¶
Description Générale¶
Les robots agricoles doivent être capables de se déplacer à travers les cultures et les terres agricoles, ce qui implique de se déplacer de manière autonome à travers des rangées de plants de tomates sur un terrain accidenté. Cette tâche consiste à atteindre la fin d’une rangée, à faire un tour et à revenir dans les rangées adjacentes jusqu’à ce que l’emplacement de l’objectif soit atteint. Les équipes doivent développer un logiciel pour guider le robot sur un chemin prédéfini dans les rangs de culture, depuis sa position de départ jusqu’à l’emplacement cible.
Lignes directrices sur les tâches¶
Lancer la tâche¶
Dans un nouveau terminal, exécutez le fichier de lancement suivant pour faire apparaître le robot dans Gazebo et RViz:
Vous devriez voir l’affichage ci-dessous dans Gazebo et RViz respectivement. À droite, il y a le robot et à gauche se trouve le cercle vert qui représente l’emplacement du but.
Explorer Plusieurs Itinéraires¶
- Nous avons préparé trois itinéraires prédéfinis que vous pouvez utiliser lors du développement de votre solution, chaque itinéraire ayant un emplacement d’objectif différent.
La route par défaut est route1
, mais vous pouvez sélectionner les deuxième et troisième options de route (route2
et route3
) en passant l’argument dans la commande de ros2 launch
comme suit:
## route2
ros2 launch parc_robot_bringup task1_launch.py route:=route2
## route3
ros2 launch parc_robot_bringup task1_launch.py route:=route3
Nous vous recommandons de jouer avec au moins ces trois itinéraires pour vous assurer que votre solution est robuste aux différents emplacements de départ.
Obtenir la position de l’objectif GPS¶
Pour obtenir l’emplacement de l’objectif GPS pour cette tâche, quelle que soit l’option d’itinéraire, vous utilisez les paramètres ROS dans un nœud. Voici un exemple de la façon d’obtenir l’emplacement de l’objectif en tant que paramètre ROS:
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class GoalLocation(Node):
def __init__(self):
super().__init__("goal_location")
# Déclarer les paramètres de latitude et de longitude de l'objectif
self.declare_parameter("goal_latitude", rclpy.Parameter.Type.DOUBLE)
self.declare_parameter("goal_longitude", rclpy.Parameter.Type.DOUBLE)
# Obtenir l'emplacement de l'objectif à partir du fichier yaml de coordonnées mondiales
goal_lat = self.get_parameter("goal_latitude")
goal_long = self.get_parameter("goal_longitude")
# Imprimer l'emplacement de l'objectif
self.get_logger().info(
"goal location: %f %f"
% (
goal_lat.value,
goal_long.value,
)
)
def main(args=None):
rclpy.init(args=args)
goal_location = GoalLocation()
rclpy.spin(goal_location)
goal_location.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
.yaml
fournis, qui varient en fonction de l’itinéraire choisi, et ces fichiers sont transmis comme arguments lorsque le nœud est exécuté comme suit:
ros2 run <nom_du_paquet> <nom_de_l'exécutable> --ros-args --params-file <nom_de_fichier>
Par exemple, en choisissant route1
pour la tâche de navigation, l’exemple de commande suivant sera exécuté:
ros2 run <votre-nom-de-paquet> task1_solution --ros-args --params-file ~/ros2_ws/src/parc_robot_bringup/config/route1_world_coordinates.yaml
Note
Un chemin de fichier absolu a été utilisé pour localiser le fichier de paramètres. Un chemin de fichier relatif peut également être utilisé si la commande est appelée dans le répertoire de config
où se trouvent les fichiers de coordonnées.
Cependant, il est recommandé de spécifier le chemin absolu du fichier pour éviter les erreurs de chemin.
De même, les coordonnées GPS des piquets sur les terres agricoles peuvent être obtenues comme paramètre si vous en avez besoin pour la localisation.
Pour obtenir les coordonnées du piquet A, par exemple, les paramètres goal_latitude
et goal_longitude
de l’extrait de code précédent sont remplacés respectivement par peg_a_latitude
et peg_a_longitude
.
A titre de référence, en considérant la route1
, les coordonnées mondiales correspondantes sont disponibles dans le fichier route1_world_coordinates.yaml.
Warning
Veuillez NE PAS utiliser les coordonnées cartésiennes de l’emplacement du but et des piquets fournis par Gazebo ou le fichier mondial de quelque manière que ce soit. Vous serez pénalisé si vous le faites.
Conversion du GPS en cartésien¶
Notre module, gps2cartesian, fournit un moyen pratique de convertir des emplacements GPS en coordonnées cartésiennes x-y. En utilisant l’origine mondiale du Gazebo comme origine de référence GPS (0, 0) en coordonnées cartésiennes, la fonction gps_to_cartesian() calcule les coordonnées cartésiennes de toute position GPS souhaitée transmise en paramètre à la fonction. Voici un exemple d’utilisation du module pour obtenir la coordonnée cartésienne du robot par rapport à l’origine de référence:
#!/usr/bin/env python3
## Installez le module geographiclib 2.0 pour que ce code fonctionne.
## Pour installer geographiclib 2.0, copiez la ligne ci-dessous sur votre terminal.
## pip install geographiclib
## L'une des tâches de compétition PARC doit être en cours d'exécution pour que ce code fonctionne.
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import NavSatFix
from parc_robot_bringup.gps2cartesian import gps_to_cartesian
class GPSGoal(Node):
def __init__(self):
super().__init__("gps_goal")
# Abonnez-vous une fois au sujet GPS
self.gps_sub = self.create_subscription(
NavSatFix, "/gps/fix", self.gps_callback, 1
)
def gps_callback(self, gps):
# Récupérer les coordonnées cartésiennes à partir des coordonnées GPS
x, y = gps_to_cartesian(gps.latitude, gps.longitude)
# Imprimer les coordonnées cartésiennes
self.get_logger().info(
"La traduction de l'origine (0,0) à l'emplacement GPS fourni est: %.3f %.3f"
% (x, y)
)
def main(args=None):
rclpy.init(args=args)
gps_goal = GPSGoal()
rclpy.spin(gps_goal)
gps_goal.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
Préparer votre Solution¶
-
Votre solution doit être préparée sous forme de packages ROS à enregistrer dans votre dossier de solution. Créez un fichier exécutable de nœud dans votre package ROS qui exécute TOUT le code dont vous avez besoin dans votre solution. Nommez ce fichier de nœud:
task1_solution.py
. -
Par conséquent, votre solution à la tâche 1 doit être exécutée en appelant les commandes suivantes:
Dans un terminal:
Ou
Ou
Note
Veuillez attendre que les modèles du monde et du robot aient fini d’apparaître. Ce processus peut prendre plus de temps que d’habitude, surtout lors de la première exécution du programme.
Dans un autre terminal:
ros2 run <le-nom-de-votre-colis> task1_solution --ros-args --params-file <chemin-absolu-vers-la-route-coordonnées-mondiales-fichier-yaml>
Règles de Tâche¶
-
Le délai pour terminer la tâche est de 8 minutes (480 secondes).
-
La tâche est terminée UNIQUEMENT lorsqu’UNE partie du robot se trouve à l’intérieur du cercle vert (marqueur d’emplacement de l’objectif) après avoir suivi le chemin prédéfini comme indiqué ci-dessus.
Note
Assurez-vous de NE PAS fournir de solution avec des positions codées en dur vers lesquelles le robot doit se déplacer, car lors de l’évaluation, la position initiale du robot serait randomisée.
Évaluation des Tâches¶
La notation de cette tâche serait basée sur les critères suivants:
S/N | Critère/Métrique | Descriptif |
---|---|---|
1 | Chemin prédéfini | Chaque route lancée a un chemin prédéfini qui doit être suivi comme expliqué dans Description de la route. |
2 | Évitement des plantes et des piquets | Le robot doit éviter tout contact avec les plants de tomates et/ou les piquets. (Moins de contact, c’est mieux) |
3 | Distance finale parcourue jusqu’au but | Distance de déplacement la plus courte du robot (mesurée à partir du centre du robot) à travers les rangées de cultures jusqu’à l’objectif, calculée à la limite de temps [8 minutes] (Plus petit est préférable) |
4 | Délai de réalisation | Délai entre le lancement de la solution et l’achèvement de la tâche (Plus petit est préférable) |