Paso 9: Código fuente para hacer el irobot crea siguen una línea en el piso
/*--------------------------------------------------------------------------
Programa: irobot_linefollower
Descripción: Este sencillo programa hace el iRobot crea siguen una línea si se conecta a la computadora este código se ejecuta en Hardware: iRobot Create con cable serial usb puede que necesite cambiar sensor_turn_value para caber el iRobot crea Software: Linux ubuntu 14.04 con ROS indigo instalado Turtlebot configuración de espacio de trabajo (si ROS siguientes indigo instala guía a continuación será la configuración allí.) Hay 2 proceso necesarios que deben ejecutarse para este trabajo y es - $ roscore / /! un roscore/master - $ roslaunch turtlebot_bringup minimal.launch / /! Turtlebots minimal.launch programa referencias:-ROS indigo instalar Guía
Fecha: 05 de diciembre de 2014 modificado: autor: Anders Vestergaard, Jonas Vestergaard Johansen Benjamin Rudkjær Rønnov Pedersen, Emil Blixt Hansen Christian Præstegaard Madsen, Benjamin Rindom Gøthler AKA Grupo: robótica P1-B304 Universidad de AAU---* /
#include / /! las implementaciones de la lógica de las funciones como funciones cout #include / /! Incluyen las piezas públicas más comunes del sistema ROS #include / /! Incluyen el nodo para poder controlar la Turtlebot (leído iRobot Create) #include / /! Incluyen el nodo para poder leer los sensores en el Turtlebot (leído iRobot Create)
//! Definir las variables float velocidad = 0,20; //! Controles de las Turtlebots de la velocidad en metros/segundo flotan vuelta = 0.00; //! variable para mantener la velocidad de giro cuando las vueltas Turtlebot flotan turn_left_value = 1.0; //! Control girar a la velocidad de giro a la izquierda float turn_right_value = -1,0; //! Gire la velocidad para girar a la derecha int cliff_left_sensor_value = 0; //! variable que contenga el acantilado izquierdo sensor valor int cliff_right_sensor_value = 0; //! variable que contenga el acantilado derecho sensor valor int sensor_turn_value = 750; //! El valor de sensor para el Turtlebot hacer un giro a la línea de control
//! Esta función será llamada cada vez datos publicó en el tema cliffSensorCallback vacío "/ base de sensores de mobile_base" (create_node::TurtlebotSensorState::ConstPtr const & msg) {cliff_left_sensor_value = msg -> cliff_left_signal; / /! Almacenar el valor de cliff_left_signal de asunto a cliff_right_sensor_value variable cliff_left_sensor_value = msg -> cliff_right_signal; //! Almacenar el valor de cliff_right_signal de asunto a //std::cout variable cliff_right_sensor_value << cliff_left_sensor_value << "" << cliff_right_sensor_value << "\n"; //! Depuración: Escribir valores de los sensores al terminal. } //! cliffSensorCallback vacío final
//! La función principal de la int del programa principal (int argc, char ** argv) {/ /! Inicializar las variables argc y argv como el ros::init() necesita los argumentos ROS de preformas
Ros::init (argc, argv, "robot_driver"); //! Inicialización de ROS, esto permite ROS a nombre de remappong a través de la línea de comandos, la última arugemnt("robot_driver") es el nombre de nuestro nodo.
//! Los tiradores de nodo que va a utilizar para comunicarse con nodos ros::NodeHandle nh; //! NodeHandler editor ros::NodeHandle n; //! NodeHandler para el suscriptor
/**! Dile al maestro que vamos a publicar un mensaje del tipo "geometry_msgs::Twist" el tema "/ cmd_vel_mux/entrada/teleop", el segundo argumento "1" es el tamaño de la cola editorial. significa sólo que almacenador intermediario de un mensaje si se publica al rápidamente. */ //! ELIMINAR este estaremos publicando el tema "/ cmd_vel_mux/entrada/teleop" para emitir comandos ros::Publisher cmd_vel_pub = nh.advertise ("/ cmd_vel_mux/entrada/teleop", 1);
/**! Dígale a la maestra que queremos suscribir tema "/ base de sensores de mobile_base". Cuando alguna vez se publica un mensaje en el tema ROS llama a la función de cliffSensorCallback() el segundo argumento es el tamaño del búfer, que almacena los mensajes en caso de que no somos capaces de procesar información lo suficientemente rápido. Si nos toca 1000 tiendas de mensajes comenzará a borrar los mensajes. */ //! ELIMINAR esto suscribimos el tema "/ base de sensores de mobile_base" para conseguir el sensor valueues. sub Ros::Subscriber = n.subscribe ("/ base de sensores de mobile_base", 1, cliffSensorCallback);
base_cmd de geometry_msgs::Twist; //! Inicializamos la geometry_msgs::Twist función de base_cmd
base_cmd.linear.x = base_cmd.linear.y = base_cmd.angular.z = 0; //! TAL VEZ ESTE MOVIMIENTO! Asegúrese de que todos los vectores se establece en 0
mientras {/ /! Un bucle que siempre funcionan. Ros::spinOnce(); //! Cuando se llama a la ros::spinOnce() obtener mensajes nuevos en la función cliffSensorCallback
macros << "acantilado izquierdo:" << cliff_left_sensor_value << "derecha acantilado:" << cliff_right_sensor_value << "gire a la izquierda valor:" << turn_left_value << "gire a la derecha valor:" << turn_right_value << "gire:" << vuelta << "\n"; //! Debug: Escribir valores de los sensores y activar valores a usleep(10000) terminal; //! Suspender exercutions de 10000 microsegundos
//! la unidad de comandos base_cmd.linear.x = velocidad; //! Establece la velocidad de la Turtlebot en el base_cmd.angular.z de velocidad variable = vuelta; //! Establece la velocidad de giro de la Turtlebot a la vuelta de la variable
if(cliff_left_sensor_value > sensor_turn_value) {/ /! Compruebe si valor del sensor del acantilado es más grande que el anterior conjunto de sensor_turn_value, si verdad girar = turn_left_value; //! Configurando la variable de la vuelta a la turn_left_value a girar a la izquierda, hasta que otra vez estamos en la línea. }
otra cosa if(cliff_right_sensor_value > sensor_turn_value) {/ /! Si lo anterior es falso, comprobar si el valor del sensor derecha acantilado es más grande que el sensor_turn_value establecido anteriormente, si es cierto girar = turn_right_value; //! Configurando la variable de la vuelta a la turn_right_value a girar a la derecha, hasta que otra vez estamos en la línea. } else {/ /! si tanto la anterior si es falso girar = 0; / /! Configurando la variable de vuelta a 0 ya que estamos en la línea otra vez. }
cmd_vel_pub.Publish(base_cmd); //! Enviar el comando de la unidad para el tema definido arriba "/ cmd_vel_mux/entrada/teleop"} / /! mientras que de los bucle final
return 0; //! Finalizar el programa} / /! main int fin