Ros Indigo installera på Ubuntu (9 / 9 steg)
Steg 9: Källkoden för att göra irobot skapa följa en linje på golvet
/*--------------------------------------------------------------------------
Program: irobot_linefollower
Beskrivning: Detta enkla program gör iRobot skapa följa en linje om den är ansluten till datorn här koden körs på hårdvara: iRobot skapa med USB-seriell kabel kan du behöva ändra sensor_turn_value för att passa din iRobot skapa programvara: Linux ubuntu 14.04 med ROS indigo installerat Turtlebot arbetsyta setup (om följande ROS indigo installera guiden nedan Det kommer att vara setup där.) Det finns 2 krävs process som måste köra för detta arbete och det är - $ roscore / /! en roscore/master - $ roslaunch turtlebot_bringup minimal.launch / /! Turtlebots minimal.launch program referenser:-ROS indigo installera guide
: Ändrad 5 december 2014: författare: Anders Vestergaard, Jonas Vestergaard Johansen Benjamin Rudkjær Rønnov Pedersen, Emil Blixt Hansen Christian Præstegaard Madsen, Benjamin Rindom Gøthler AKA grupp: Robotics P1-B304 på AAU universitet---* /
#include / /! implementeringar logiken i funktionerna som cout funktioner #include / /! Inkluderar de vanligaste offentliga bitarna av ROS systemet #include / /! Inkludera noden för att kunna styra Turtlebot (Läs iRobot skapa) #include / /! Inkludera noden för att kunna läsa sensorer på Turtlebot (Läs iRobot skapa)
//! Definiera variabler float hastighet = 0,20; //! Kontroller i Turtlebots fart i meter/sekund flyta tur = 0.00; //! variabel att hålla tur hastigheten när de Turtlebot vänder sig flyta turn_left_value = 1,0; //! Kontroll vända hastighet för vänstersväng float turn_right_value =-1.0; //! Kontroll vända hastighet för högersväng int cliff_left_sensor_value = 0; //! variabel att hålla vänster cliff sensor värdet int cliff_right_sensor_value = 0; //! variabel för att hålla rätt klippa sensor värdet int sensor_turn_value = 750; //! Kontrollera sensorn värdet för Turtlebot att göra en sväng tillbaka till raden
//! Denna funktion kommer få kallas varje gång data publicerade till "/ mobile_base/sensorer/core" ämne void cliffSensorCallback (const create_node::TurtlebotSensorState::ConstPtr & msg) {cliff_left_sensor_value = msg -> cliff_left_signal; / /! Lagra värdet cliff_left_signal från ämne till cliff_left_sensor_value variabel cliff_right_sensor_value = msg -> cliff_right_signal; //! Lagra värdet cliff_right_signal från ämne till cliff_right_sensor_value variabel //std::cout << cliff_left_sensor_value << "" << cliff_right_sensor_value << "\n"; //! Felsökning: Skriva sensor värden till terminal. } //! void cliffSensorCallback slut
//! Den huvudsakliga funktionen för programmet int main (int argc, char ** argv) {/ /! Initiera variabler argc och argv som ros::init() behöver dem att prestera några ROS argument
Ros::init (argc, argv, "robot_driver"); //! Initierar ROS, detta gör ROS att ge namnet remappong från kommandoraden, den sista arugemnt("robot_driver") är namnet på vår nod.
//! Nod handtagen vi kommer att använda för kommunikation med noder ros::NodeHandle nh; //! NodeHandler för publisher ros::NodeHandle n; //! NodeHandler för abonnenten
/**! Berätta master vi kommer att publicera ett meddelande av typ "geometry_msgs::Twist" till ämnet "/ cmd_vel_mux/input/teleop", det andra argumentet "1" är storleken på våra publicerande kö. vilket betyder att vi endast kommer att buffra ett meddelande om den publiceras på snabbt. */ //! Ta bort detta vi kommer att publicera till "/ cmd_vel_mux/input/teleop" ämnet att utfärda kommandon ros::Publisher cmd_vel_pub = nh.advertise ("/ cmd_vel_mux/input/teleop", 1);
/**! Berätta den master att vi vill prenumerera på ämnet "/ mobile_base/sensorer/core". När allt det publiceras ett meddelande till ämnet ROS kommer att anropa funktionen cliffSensorCallback() det andra argumentet är storleken på bufferten, som lagrar meddelanden i fall vi inte kan bearbeta information tillräckligt snabbt. om vi träffar 1000 butiker meddelanden börjar det ta bort meddelanden. */ //! Ta bort detta kommer vi att prenumerera "/ mobile_base/sensorer/core" ämnet att få sensor valueues. Ros::Subscriber sub = n.subscribe ("/ mobile_base/sensorer/core", 1, cliffSensorCallback);
geometry_msgs::twist base_cmd; //! Initilizing geometry_msgs::Twist som base_cmd funktion
base_cmd.Linear.x = base_cmd.linear.y = base_cmd.angular.z = 0; //! KANSKE FLYTTA DETTA! Se till att alla vektorer är satt till 0
While(true) {/ /! En loop som allways kör. Ros::spinOnce(); //! När ros::spinOnce() kallas det får några nya meddelanden i funktionen cliffSensorCallback
std::Cout << "vänster cliff:" << cliff_left_sensor_value << "rätt klippa:" << cliff_right_sensor_value << "sväng vänster värde:" << turn_left_value << "sväng höger värde:" << turn_right_value << "vända:" << vända << "\n"; //! Felsökning: Skriva sensor värden och vända värden till terminal usleep(10000); //! Avbryta exercutions för 10000 mikrosekunder
//! enheten kommandon base_cmd.linear.x = hastighet; //! Anger hastigheten för Turtlebot till variabel hastighet base_cmd.angular.z = slå; //! Anger Turtlebot tur hastighet till variabel turn
IF(cliff_left_sensor_value > sensor_turn_value) {/ /! Kontrollera om lämnade cliff sensor värde är större än den sensor_turn_value som ovan, om sant sedan stänger = turn_left_value; //! Ange variabeln tur till turn_left_value att göra en vänstersväng, tills vi är på linjen igen. }
annat if(cliff_right_sensor_value > sensor_turn_value) {/ /! Om ovanstående är false, kontrollera om rätt klippa sensor värde är större än sensor_turn_value som ovan, om den stämmer sedan stänger = turn_right_value; //! Ange variabeln tur till turn_right_value att göra en högersväng, tills vi är på linjen igen. } annat {/ /! om båda de ovanstående om är false sedan stänger = 0; / /! Ange variabeln tur 0 eftersom vi är på linjen igen. }
cmd_vel_pub.publish(base_cmd); //! Skicka kommandot bilresa till det ämne som definieras ovan "/ cmd_vel_mux/input/teleop"} / /! medan loop slutet
Return 0; //! Avsluta programmet} / /! int main slut