Étape 9: Code Source pour la fabrication d’irobot créer suit une ligne au sol
/*--------------------------------------------------------------------------
Programme : irobot_linefollower
Description : Ce programme simple rend l’iRobot Créer suit une ligne s’il est connecté à l’ordinateur, copiez le code suivant s’exécute sur le matériel : iRobot Create avec câble série usb, vous devrez peut-être modifier sensor_turn_value pour s’adapter à votre iRobot créer des logiciels : Linux ubuntu 14.04 avec ROS indigo installé Turtlebot workspace configuration (si ROS suivants indigo installer guide ci-dessous ce sera le programme d’installation il.) Il y a 2 processus requis qui doivent être en cours d’exécution pour cela au travail et qui est - $ roscore / / ! un roscore/master - $ roslaunch turtlebot_bringup minimal.launch / / ! Turtlebots minimal.launch références de programme:-ROS indigo installer guide
Jour : mis 5 décembre 2014 le : Auteur : Anders Vestergaard, Jonas Vestergaard Johansen Benjamin Rudkjær Rønnov Pedersen, Emil Blixt Hansen Christian Præstegaard Madsen, Benjamin Rindom Gøthler alias de groupe : robotique P1-B304 Université AAU---* /
#include / / ! implémentations de la logique des fonctions comme cout fonctions #include / / ! Inclure les pièces publiques plus courantes du système ROS #include / / ! Inclure le nœud afin d’être en mesure de contrôler le Turtlebot (lecture iRobot Create) #include / / ! Inclure le nœud afin d’être capable de lire les capteurs sur le Turtlebot (lire l’iRobot Create)
//! Définir la vitesse de flotteur variables = 0,20 ; //! Contrôles, les Turtlebots la vitesse en mètres/seconde flottent tour = 0,00 ; //! variable destinée à contenir la vitesse de virage quand le tourne Turtlebot float turn_left_value = 1.0 ; //! Contrôle de tourner vitesse de virage à gauche float turn_right_value = -1,0 ; //! Contrôle de tourner vitesse de virage à droite int cliff_left_sensor_value = 0 ; //! variable destinée à contenir la falaise gauche capteur valeur int cliff_right_sensor_value = 0 ; //! variable destinée à contenir la falaise droite capteur valeur int sensor_turn_value = 750 ; //! Contrôler la valeur de la sonde pour le Turtlebot faire un tour à la ligne
//! Cette fonction est appelée chaque fois données elle a publié à la « / mobile_base/capteurs/core » rubrique Sub cliffSensorCallback (const create_node::TurtlebotSensorState::ConstPtr & msg) {cliff_left_sensor_value = msg -> cliff_left_signal; / / ! Stocker la valeur de cliff_left_signal de rubrique à cliff_left_sensor_value variable cliff_right_sensor_value = msg -> cliff_right_signal ; //! Stocker la valeur de cliff_right_signal de rubrique à cliff_right_sensor_value variable //std::cout << cliff_left_sensor_value << "« << cliff_right_sensor_value << « \n » ; //! Debug : Écrire des valeurs de capteur à la borne. } //! Sub cliffSensorCallback fin
//! La fonction principale du programme int main (int argc, char ** argv) {/ / ! Lors de l’initialisation des variables argc et argv comme le ros::init() besoin de ceux de préforme d’arguments ROS
Ros::init (argc, argv, « robot_driver ») ; //! L’initialisation de ROS, cela permet à ROS nommer remappong par le biais de la ligne de commande, le dernier arugemnt("robot_driver") est le nom de notre noeud.
//! Les poignées de nœud, nous allons utiliser pour communiquer avec les nœuds ros::NodeHandle nh ; //! NodeHandler pour l’éditeur ros::NodeHandle n ; //! NodeHandler pour les abonnés
/**! Dire le maître que nous allons publier un message du type « geometry_msgs::Twist » à la rubrique « / cmd_vel_mux/entrée/teleop », le second argument « 1 » est la taille de notre file d’attente de publication. ce qui signifie que nous seront tampon uniquement un message si elle est publiée à rapidement. */ //! SUPPRIMER ce que nous publierons à la rubrique « / cmd_vel_mux/entrée/teleop » d’émettre des commandes ros::Publisher cmd_vel_pub = nh.advertise (« / cmd_vel_mux/entrée/teleop », 1) ;
/**! Dire le maître que nous voulons pour vous abonner à la rubrique « / mobile_base/capteurs/core ». À chaque fois qu’il est publié un message à la rubrique ROS appelle la fonction cliffSensorCallback() le deuxième argument est la taille de mémoire tampon, qui stocke les messages dans le cas où nous ne sommes pas en mesure de traiter l’information assez rapidement. Si nous avons atteint 1000 enregistre les messages, il commencera à supprimer les messages. */ //! SUPPRIMER ce nous serons vous abonner à la rubrique « / mobile_base/capteurs/core » pour obtenir le capteur valueues. void ros::Subscriber = n.subscribe (« / mobile_base/capteurs/core », 1, cliffSensorCallback) ;
geometry_msgs::Twist base_cmd ; //! Initialisation de la geometry_msgs::Twist en fonction de base_cmd
base_cmd.Linear.x = base_cmd.linear.y = base_cmd.angular.z = 0 ; //! PEUT-ÊTRE PASSER CELA ! Assurez-vous que tous les vecteurs est définie sur 0
while (true) {/ / ! Une boucle qui toujours s’exécuter. Ros::spinOnce() ; //! Lorsque le ros::spinOnce() est appelé il obtenir tous les nouveaux messages dans la fonction cliffSensorCallback
std::cout << "falaise gauche:" << cliff_left_sensor_value << "falaise droite:" << cliff_right_sensor_value << "tourner à gauche valeur:" << turn_left_value << "tourner la bonne valeur:" << turn_right_value << "tourner:" << tourner << « \n » ; //! Debug : Écrire des valeurs de capteur et tourner les valeurs au terminal usleep(10000) ; //! Suspension exercutions pour 10000 microsecondes
//! le lecteur de commandes base_cmd.linear.x = vitesse ; //! Définit la vitesse du lecteur de la Turtlebot à la vitesse variable base_cmd.angular.z = tourner ; //! Définit la vitesse de virage de le Turtlebot à la variable de la tour
if(cliff_left_sensor_value > sensor_turn_value) {/ / ! Vérifier si quitté falaise capteur valeur est supérieure à l’ensemble de le sensor_turn_value ci-dessus, si vrai puis tourner = turn_left_value ; //! Définissant la variable de tour sur la turn_left_value de faire un virage à gauche, jusqu'à ce que nous sommes de nouveau sur la ligne. }
d’autre if(cliff_right_sensor_value > sensor_turn_value) {/ / ! Si ce qui précède est false, vérifiez si la valeur de capteur de falaise droite est plus grande que la sensor_turn_value définie ci-dessus, si elle est vraie alors deviennent-ils = turn_right_value ; //! Définissant la variable de tour sur la turn_right_value de faire un virage à droite, jusqu'à ce que nous sommes de nouveau sur la ligne. } else {/ /! si les deux ci-dessus l’if est false alors tourner = 0; / / ! Définissant la variable de la tour à 0 car nous sommes sur la ligne à nouveau. }
cmd_vel_pub.Publish(base_cmd) ; //! Envoyer la commande de disque à la rubrique définie ci-dessus "/ cmd_vel_mux/entrée/teleop"} / / ! FIN de boucle while
return 0 ; //! Mettre fin au programme} / / ! int main fin