=====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 [[http://wiki.ros.org/navigation| 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''
* [[http://wiki.ros.org/navigation/Tutorials/RobotSetup| 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'' et ''tf''; ou bien lancer un simulateur tel que Gazebo (3D), ou Stage(2D): ''rosrun stage_ros stageros `rospack find send_object`/world/willow-erratic.world ''
* [[ROSLaserFilter|Filtrer]] les LaserScan si certaines valeurs sont aberrantes.
* Vérifier que l'[[ROSOdometry|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:
''
\\
\\
\\
\\
\\
\\
\\
\\
''
Un autre exemple de script de lancement est donné sur le [[http://wiki.ros.org/navigation/Tutorials/RobotSetup|wiki ROS]].
----
====Navigation2D avec Rviz====
Prérequis:
* lancer les services nécessaires à la navigation comme dans [[ROS#Lancement Navigation2D]]
[[http://wiki.ros.org/navigation/Tutorials/Using%20rviz%20with%20the%20Navigation%20Stack|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 [[http://wiki.ros.org/navigation/Tutorials/Using%20rviz%20with%20the%20Navigation%20Stack|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 [[http://wiki.ros.org/navigation/Tutorials/SendingSimpleGoals|SendingSimpleGoals]]
----
====Navigation2D avec client Python====
Prérequis:
* lancer les différents services, configurer la position initiale du robot avec Rviz, comme dans [[ROS#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'' vers ''move_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 [[ROSSlam|SLAM]] (Self Localization and Mapping).
----
====Exemples ====
* le package LISSI [[send_object]].\\
* navigation 2D avec le robot [[http://gt-ros-pkg.googlecode.com/svn/trunk/hrl/pr2_laser_follow_behavior/nodes/look_at_point_behavior.py|PR2]]