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
cette étape est délicate. Normalement, elle sera effectuée par votre responsable.
Les étapes:
sudo apt-get install ros-hydro-navigation
Prérequis:
$ source ~/catkin_ws/devel/setup.bash
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
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.
Prérequis:
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:
$rosrun rviz rviz
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.
Cf le wiki SendingSimpleGoals
Prérequis:
Pour assigner un objectif au robot, il existe deux solutions:
/move_base_simple/goal
.
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.
move_pub = rospy.Publisher('/move_base_simple/goal', PoseStamped)
ps = PoseStamped()
ps.header.frame_id = “map”
ps.pose.position= Point(7., 14., 0.)
ps.pose.orientation = Quaternion(0., 0., -0.7, 0.6)
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
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).