Stap 9: Broncode voor het maken van irobot maken volgen een lijn op de vloer
/*--------------------------------------------------------------------------
Programma: irobot_linefollower
Beschrijving: Dit eenvoudige programma maakt de iRobot maken volgen een lijn als deze is aangesloten op de computer deze code wordt uitgevoerd op Hardware: iRobot Create met USB-seriële kabel u wijzigen sensor_turn_value moet wellicht aangepast aan uw iRobot maken Software: Linux ubuntu 14.04 met ROS indigo geïnstalleerd Turtlebot werkruimte setup (als volgende ROS indigo installatiehandleiding hieronder het zal worden ingesteld er.) Er zijn 2 vereist proces dat moet worden uitgevoerd voor dit werk en dat is - $ roscore / /! een roscore/master - $ roslaunch turtlebot_bringup minimal.launch / /! Turtlebots minimal.launch program verwijzingen:-ROS indigo installeren gids
: Wijzigingsdatum 5 december 2014: Auteur: Anders Vestergaard, Jonas Vestergaard Johansen Benjamin Rudkjær Rønnov Pedersen, Emil Blixt Hansen Christian Præstegaard Madsen, Benjamin Rindom Gøthler AKA groep: Robotica P1-B304 aan de Universiteit van de AAU---* /
#include / /! implementaties de logica van de functies zoals cout functies #include / /! Omvatten de meest voorkomende openbare stukken van de ROS systeem #include / /! Opnemen van het knooppunt om te kunnen bepalen van de Turtlebot (Lees iRobot Create) #include / /! Opnemen van het knooppunt om te kunnen lezen van de sensoren op de Turtlebot (Lees iRobot Create)
//! Definiëren van de variabelen float snelheid = 0.20; //! Besturingselementen de Turtlebots snelheid in meter per seconde zweven beurt = 0,00; //! variabele voor de draai-snelheid wanneer de Turtlebot bochten vlotter turn_left_value = 1,0; //! Controle draai snelheid voor linksaf float turn_right_value = -1,0; //! Controle draai snelheid voor rechtsaf int cliff_left_sensor_value = 0; //! variabele te houden van de linker cliff sensor waarde int cliff_right_sensor_value = 0; //! variabele voor de juiste cliff sensor waarde int sensor_turn_value = 750; //! Bepalen van de waarde van de sensor voor de Turtlebot om een beurt terug naar de lijn
//! Deze functie zal krijgen aangeroepen telkens wanneer gegevens het gepubliceerd naar de "/ mobile_base/sensoren/core" onderwerp nietig cliffSensorCallback (const create_node::TurtlebotSensorState::ConstPtr & msg) {cliff_left_sensor_value = msg -> cliff_left_signal; / /! Opslaan van de waarde van de cliff_left_signal tussen onderwerp en cliff_left_sensor_value variabele cliff_right_sensor_value = msg -> cliff_right_signal; //! Opslaan van de waarde van de cliff_right_signal tussen onderwerp en variabele //std::cout cliff_right_sensor_value << cliff_left_sensor_value << "" << cliff_right_sensor_value << "\n"; //! Foutopsporing: Schrijven sensor-waardes naar de terminal. } //! VOID cliffSensorCallback einde
//! De belangrijkste functie van de belangrijkste programma-int (int argc, char ** argv) {/ /! Initialiseren van de variabelen argc en argv als de ros::init() die aan het uitvoeren van ROS argumenten nodig
Ros::init (argc argv, "robot_driver"); //! Initialiseren ROS, hierdoor ROS te remappong via de opdrachtregel noemen, de laatste arugemnt("robot_driver") is de naam van onze knooppunt.
//! De handgrepen van de node we gebruiken gaan om te communiceren met de knooppunten ros::NodeHandle nh; //! NodeHandler voor Uitgever ros::NodeHandle n; //! NodeHandler voor abonnee
/**! Vertellen de meester dat we gaan om een bericht van het type "geometry_msgs::Twist" te publiceren naar het onderwerp "/ cmd_vel_mux/invoer/teleop", het tweede argument "1" is de grootte van onze uitgeverij wachtrij. Wat betekent dat we zullen slechts één bericht buffer als het wordt gepubliceerd op snel. */ //! Verwijder deze We naar het onderwerp van het "/ cmd_vel_mux/invoer/teleop publiceren zullen" te geven opdrachten ros::Publisher cmd_vel_pub = nh.advertise ("/ cmd_vel_mux/invoer/teleop", 1);
/**! Vertellen de meester dat we willen abonneren op onderwerp "/ mobile_base/sensoren/core". Als ooit er verschijnt een bericht naar het onderwerp ROS noem de cliffSensorCallback() functie het tweede argument is de buffergrootte, waarin berichten worden opgeslagen voor het geval dat we niet in staat om informatie te verwerken snel genoeg zijn. Als we 1000 winkels berichten raken zal beginnen om berichten te verwijderen. */ //! DELETE THIS We zullen worden Abonneer je op de "/ mobile_base/sensoren/core" onderwerp om sensor valueues. Ros::Subscriber sub = n.subscribe ("/ mobile_base/sensoren/core", 1, cliffSensorCallback);
geometry_msgs::twist base_cmd; //! Initilizing de geometry_msgs::Twist als functie van de base_cmd
base_cmd.linear.x = base_cmd.linear.y = base_cmd.angular.z = 0; //! MISSCHIEN ZET DIT! Zorg ervoor dat alle vectoren is ingesteld op 0
while (true) {/ /! Een lus allways uitvoert. Ros::spinOnce(); //! Wanneer de ros::spinOnce() heet het geen nieuwe berichten in de cliffSensorCallback functie krijgen
Std::Cout << "linker klif:" << cliff_left_sensor_value << "juiste klif:" << cliff_right_sensor_value << "Draai links waarde:" << turn_left_value << "zetten van de juiste waarde:" << turn_right_value << "draaien:" << zet << "\n"; //! Foutopsporing: Schrijven van de sensor-waardes en zet waarden naar terminal usleep(10000); //! Opschorten van exercutions voor 10000 microseconden
//! het station opdrachten base_cmd.linear.x = snelheid; //! Wordt de snelheid van het station van de Turtlebot ingesteld op de variabele snelheid base_cmd.angular.z = beurt; //! Wordt de snelheid van de beurt van de Turtlebot ingesteld op de variabele turn
if(cliff_left_sensor_value > sensor_turn_value) {/ /! Controleer als cliff sensor waarde groter is dan de sensor_turn_value set hierboven, als ware zet dan = turn_left_value; //! Het instellen van de variabele beurt op de turn_left_value om een linker beurt, totdat we weer op de lijn zijn. }
anders if(cliff_right_sensor_value > sensor_turn_value) {/ /! Als het bovenstaande onwaar is, Controleer of de juiste cliff sensor waarde is groter dan de sensor_turn_value zoals hierboven, als dit het geval dan zet = turn_right_value; //! Het instellen van de beurt variabele op de turn_right_value te maken van een bocht naar rechts, totdat we weer op de regel zijn. } else {/ /! als zowel de boven als het onwaar is dan zet = 0; / /! De beurt variabele instelt op 0, zoals we weer op de regel zijn. }
cmd_vel_pub.publish(base_cmd); //! Stuur de station-opdracht naar het onderwerp gedefinieerd bovenstaande "/ cmd_vel_mux/invoer/teleop"} / /! while lus einde
keren 0; //! Het programma wordt beëindigd} / /! int main beëindigen