Note: Dans ce tutoriel on considère que vous êtes familier du langage de balisage xml.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

utiliser un urdf avec le robot state publisher

Description: Ce tutoriel donne un exemple complet d'un modèle de robot avec un URDF utilisant robot_state_publisher. D'abord nous créons un modèle URDF avec toutes les pièces nécessaires. Ensuite nous ecrivons un node qui publie l'état des articulations et les transformations. Enfin, on exécute le total ensemble.

Keywords: robot_state_publisher urdf

Tutorial Level: INTERMEDIATE

Créer un fichier URDF

Ici il y a un fichier URDF pour un modèle à 7-link (liaisons) ressemblant aproximativement à R2-D2. Sauvegardez le lien suivant sur votre ordinateur: model.xml

Certaines des principales caractéristiques

Error: No code_block found

Publier l'état

Maintenant nous avons besoin d'une méthode pour spécifier dans quel état est le robot. Pour cela, nous devons spécifier les trois articulations et l'odométrie globale. Créez un package contenant le code source ci-dessous (tout au long de cet exemple, nous appellerons le package "r2d2" et le node "state_publisher"):

   1 #include <string>
   2 #include <ros/ros.h>
   3 #include <sensor_msgs/JointState.h>
   4 #include <tf/transform_broadcaster.h>
   5 
   6 int main(int argc, char** argv) {
   7     ros::init(argc, argv, "state_publisher");
   8     ros::NodeHandle n;
   9     ros::Publisher joint_pub = n.advertise<sensor_msgs::JointState>("joint_states", 1);
  10     tf::TransformBroadcaster broadcaster;
  11     ros::Rate loop_rate(30);
  12 
  13     const double degree = M_PI/180;
  14 
  15     // robot state
  16     double tilt = 0, tinc = degree, swivel=0, angle=0, height=0, hinc=0.005;
  17 
  18     // message declarations
  19     geometry_msgs::TransformStamped odom_trans;
  20     sensor_msgs::JointState joint_state;
  21     odom_trans.header.frame_id = "odom";
  22     odom_trans.child_frame_id = "axis";
  23 
  24     while (ros::ok()) {
  25         //update joint_state
  26         joint_state.header.stamp = ros::Time::now();
  27         joint_state.name.resize(3);
  28         joint_state.position.resize(3);
  29         joint_state.name[0] ="swivel";
  30         joint_state.position[0] = swivel;
  31         joint_state.name[1] ="tilt";
  32         joint_state.position[1] = tilt;
  33         joint_state.name[2] ="periscope";
  34         joint_state.position[2] = height;
  35 
  36 
  37         // update transform
  38         // (moving in a circle with radius=2)
  39         odom_trans.header.stamp = ros::Time::now();
  40         odom_trans.transform.translation.x = cos(angle)*2;
  41         odom_trans.transform.translation.y = sin(angle)*2;
  42         odom_trans.transform.translation.z = .7;
  43         odom_trans.transform.rotation = tf::createQuaternionMsgFromYaw(angle+M_PI/2);
  44 
  45         //send the joint state and transform
  46         joint_pub.publish(joint_state);
  47         broadcaster.sendTransform(odom_trans);
  48 
  49         // Create new robot state
  50         tilt += tinc;
  51         if (tilt<-.5 || tilt>0) tinc *= -1;
  52         height += hinc;
  53         if (height>.2 || height<0) hinc *= -1;
  54         swivel += degree;
  55         angle += degree/4;
  56 
  57         // This will adjust as needed per iteration
  58         loop_rate.sleep();
  59     }
  60 
  61 
  62     return 0;
  63 }

Fichier Launch

Ce fichier launch considère que le nom du package est "r2d2" et celui du node "state_publisher".

   1 <launch>
   2         <param name="robot_description" command="cat $(find r2d2)/model.xml" />
   3         <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
   4         <node name="state_publisher" pkg="r2d2" type="state_publisher" />
   5 </launch>

Affichage du résultat

Exécuter rviz, choisissez odom comme repère d'origine fixe (fixed frame sous Global Options). Alors choisir "Add Display" et ajouter un affichage de modèle de robot (Robot Model Display) et un affichage de TF (TF Display) voir http://www.ros.org/wiki/rviz/UserGuide. Run rviz, choosing odom as your fixed frame (under Global Options). Then choose "Add Display" and add a Robot Model Display and a TF Display (see http://www.ros.org/wiki/rviz/UserGuide).

Wiki: fr/urdf/Tutorials/Using urdf with robot_state_publisher (last edited 2014-01-16 15:02:52 by PascalRey)