Table des matières
Navigation2D
La navigation est l'une fonction les plus importantes pour le robot. Elle permet d'éviter les obstacles locaux, et de planifier des chemins globaux dans l'environnement.
Dans ROS, il existe une stack navigation (“stack”=ensemble de packages) qui automatise et coordonne ces différentes étapes. Sa configuration est une étape délicate.
En cas de problème, lisez les pages RosDebug et RosDebugNav2d
Installation et configuration de la navigation
cette étape est délicate. Normalement, elle sera effectuée par votre responsable.
Les étapes:
- vérifier que la navigation est installée sur votre machine. Sinon:
sudo apt-get install ros-hydro-navigation
- configurer la navigation.
Lancement Navigation2D
Prérequis:
- avoir crée un environnement de travail catkin et un package
- charger les variables d'environnement
$ source ~/catkin_ws/devel/setup.bash
- avoir un robot réel qui fournit les topics
cmd_vel
pour commander les actionneurs,laser
ettf
; ou bien lancer un simulateur tel que Gazebo (3D), ou Stage(2D):rosrun stage_ros stageros `rospack find send_object`/world/willow-erratic.world
- Filtrer les LaserScan si certaines valeurs sont aberrantes.
- Vérifier que l'Odométrie fonctionne.
Pour lancer la navigation, on vous fournira en général un script de lancement qu'il faudra exécuter:
$roslaunch mon_script.launch
En général, ce script lance un serveur de carte (map server), une localisation du robot (par exemple ici amcl
), et plusieurs autres services (local costmap, global costmap,…). Un exemple:
<launch>
<!– Run the map server –>
<node name=“map_server” pkg=“map_server” type=“map_server” args=“$(find send_object)/world/willow-small.pgm .2”>
<param name=“frame_id” value=“/map” />
</node>
<!— Run AMCL –>
<include file=“$(find send_object)/move_base_config/amcl_node.xml”/>
<node pkg=“move_base” type=“move_base” respawn=“false” name=“move_base” output=“screen”>
Un autre exemple de script de lancement est donné sur le wiki ROS.
Navigation2D avec Rviz
Prérequis:
- lancer les services nécessaires à la navigation comme dans Lancement Navigation2D
Rviz est une interface graphique pour visualiser les données relatives au robot (position estimée du robot, carte du monde, trajectoire du robot, …), mais aussi pour piloter directement le robot en lui assignant un “goal”. Les étapes:
- lancer Rviz.
$rosrun rviz rviz
- configurer Rviz comme dans la video wiki ROS.
- n'oubliez pas de sauvegarder votre configuration.
- configurer la position initiale du robot en cliquant sur
Position Estimate
et en cliquant sur la carte.
Il faut vérifier que les distances du capteur laser sont bien superposées aux obstacles sur la carte
On peut alors assigner un objectif au robot: il suffit de cliquer sur Navigation Goal
, puis de cliquer sur la carte là où on souhaite envoyer le robot.
Navigation2D avec client C++
Cf le wiki SendingSimpleGoals
Navigation2D avec client Python
Prérequis:
- lancer les différents services, configurer la position initiale du robot avec Rviz, comme dans Navigation2D avec Rviz
Pour assigner un objectif au robot, il existe deux solutions:
- envoyer une position (de type PositionStamped) à atteindre en publiant directement vers le topic
/move_base_simple/goal
. - envoyer un objectif (“goal”) en utilisant un client serveur actionlib qui communiquera avec le SimpleActionServer
La première solution est la plus simple. Elle est offerte par le node move_base
qui est lancé dans le script de lancement qu'on a vu plus haut.
- Dans un script Python, on va créer un publisher:
move_pub = rospy.Publisher('/move_base_simple/goal', PoseStamped)
- Puis on crée un objet de type PoseStamped qui indique la position et l'orientation à atteindre pour le robot:
ps = PoseStamped()
ps.header.frame_id = “map”
ps.pose.position= Point(7., 14., 0.)
ps.pose.orientation = Quaternion(0., 0., -0.7, 0.6)
- Il ne reste plus qu'à publier effectivement la position
ps
versmove_pub
:move_pub.publish(ps)
Ce qui se passe en fait est que le node joue le rôle d'intermédiaire avec le serveur actionlib
. Il crée un objet de type MoveBaseGoal
à partir de notre objet PositionStamped
.
Ceci nous permet de suivre le statut de notre tâche (ACTIVE, ABORTED, SUCCEDED). Par exemple, taper en ligne de commande:
$rostopic echo /move_base/status
La seconde solution est plus complexe: il faut créer directement un client SimpleActionClient
et lui envoyer un goal.
actionclient
SLAM
Même si on ne dispose pas d'une carte de l'environnement, il est possible d'en créer une à la volée à l'aide du SLAM (Self Localization and Mapping).
Exemples
- le package LISSI send_object.
- navigation 2D avec le robot PR2