2017-10-17 3 views
1

ROS fournit un message d'odométrie, qui me dit ce qui suit en référence à un plan xy.Comment déterminer si un robot ROS va vers l'avant ou vers l'arrière?

  • La composante x de la vitesse du robot en (m/sec).
  • La composante y de la vitesse du robot en (m/sec).
  • orientation angulaire représentée par un quaternion (z et des composants w en radians)

ROS fournit l'supplémentaire suivante C++ bibliothèques

J'ai une instruction si-géante inélégante qui utilise le quadrant que le robot fait face avec la direction des composantes x et y. Je préférerais apprendre à tirer parti des quaternions.

Répondre

0

Je ne vois pas la nécessité de travailler avec des quaternions ici. Le problème semble beaucoup plus simple. De nav_msgs/Odometry: "La torsion de ce message doit être spécifiée dans le cadre de coordonnées donné par le child_frame_id". Ainsi, la torsion exprime la vitesse (linéaire et angulaire), par rapport à child_frame_id. Dans la plupart des configurations de robot, child_frame_id sera un cadre de coordonnées fixé au robot, par exemple "base_link". Ainsi, la vitesse de la torsion est donnée par rapport à un cadre fixe au robot - vous pouvez simplement vérifier si le vecteur twist.linear pointe vers le plan positif la moitié, quelque chose comme:

if (odom_msg.twist.linear.x >= 0.0 && odom_msg.twist.linear.y >= 0.0) 
    // robot going forward 
+0

Quand je publie un cmd_vel message demandant une vitesse linéaire ax de 0,2 m/s et une vitesse angulaire az de 0,2 radians/s le robot se déplace dans un cercle. Les trames d'odométrie ont un frame_id de odom et un child_frame_id de base_link. Lorsque le robot fait face à 0 degré, les vitesses x et y sont (2,0,0,0). A 45 deg (0,15, 0,15), à 90 deg (0,0, 2,0), 135 deg (-0,15, 0,15), à 180 (-0,20, 0,0). Si je reçois des vitesses x/y de (-2.0, 0) avec un angle de 180, il avance. Si l'angle est 0, il va en arrière. Les signes des vitesses x et y ne sont pas suffisants. J'ai besoin de savoir dans quelle direction il se trouve. –