Tabla de contenido:

Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base: 7 pasos (con imágenes)
Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base: 7 pasos (con imágenes)

Video: Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base: 7 pasos (con imágenes)

Video: Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base: 7 pasos (con imágenes)
Video: Amazon re:MARS 2022 - Day 2 - Keynote 2024, Mes de julio
Anonim
Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base
Cómo hacer un robot de baloncesto autónomo usando un IRobot Create como base

Esta es mi entrada para el desafío iRobot Create. La parte más difícil de todo este proceso para mí fue decidir qué iba a hacer el robot. Quería demostrar las características interesantes de Create, al mismo tiempo que agregué algo de estilo robo. Todas mis ideas parecían caer en la categoría de aburridas pero útiles o frías y poco prácticas. Al final, lo genial y poco práctico ganó y nació el robot jugador de baloncesto. Después de pensarlo un poco, me di cuenta de que podría ser práctico. Suponga que usa papel naranja y que todos sus botes de basura tienen tableros verdes …

Paso 1: Adquirir piezas

Debido al límite de tiempo del concurso, la mayoría de las piezas que utilicé estaban "listas para usar". Piezas de robot "en stock" utilizadas: Create (x1) - de iRobot www.irobot.com XBC V.3.0 (x1) - de Botball www.botball.orgCreate-Roomba cable (x1) - de Botball www.botball.orgServo (x2) - de Botball www.botball.org Telémetro nítido (x1) - de Botball www.botball.org Ladrillos LEGO surtidos - de LEGO www.lego.com 6-32 tornillos de máquina (x4) - de McMaster www.mcmaster.com Piezas de robot "creadas" utilizadas: lámina de PVC extruido de 3/8 "de grosor: este material es increíble, pero no recuerdo de dónde lo conseguí, pero es como este material https://www.lynxmotion.com / Category.aspx? CategoryID = 62Otras partes: Pelota naranja "POOF" - de WalMartBasketball con aspecto de portería - de LowesGreen "tablero" - PVC extra pintado de verde brillante

Paso 2: crea la pieza única

Crea la pieza única
Crea la pieza única

La única parte que tuve que fabricar fue una placa que se atornilló al Create y ofreció espacio LEGO. El espacio entre los orificios de los ladrillos LEGO es de 8 mm, pero hice un espacio doble para ahorrar tiempo. Es muy fácil trabajar con PVC extruido. Se puede cortar con un cuchillo, pero es rígido y fuerte. A menudo tomo el robot por esta placa y todavía no he tenido ningún problema.

Paso 1: corte la hoja a 3.5 "x 9.5", puede cortarla con un cuchillo. Paso 2: Taladre los agujeros para los tornillos de creación. Los tornillos de creación hacen una caja de 2 y 5/8 "por 8 y 5/8". Paso 3: Taladra los agujeros espaciados con ladrillos LEGO. Utilicé una broca de 3/16 "y separé los orificios con una separación de 16 mm. Consejo: coloqué la hoja en un programa CAD, la imprimí en tamaño completo y la pegué con cinta adhesiva a la hoja. Luego utilicé esto como guía para cortar y perforación.

Paso 3: Montaje del robot

Montaje del robot
Montaje del robot
Montaje del robot
Montaje del robot
Montaje del robot
Montaje del robot

Disfruto construyendo cosas de la manera más simple posible, de esa manera cuando saltan de la mesa, ¡no tienes que reconstruir tanto!

1. Atornille la placa recién formada a la parte superior del Create 2. Construya un brazo para agarrar la bola 3. Construya un brazo para sostener la cámara 4. Construya un soporte para el telémetro 5. Monte el XBC y conecte todos los cables

Paso 4: programación del robot

Decidí usar el XBC como mi controlador principalmente debido a su seguimiento de color integrado. Como decidí hacerlo con el XBC como cerebro de la operación, programé mi robot en Interactive C, o como lo llamo IC. IC es de uso gratuito y se puede descargar en www.botball.org. IC es muy similar a C ++, pero tiene varias bibliotecas integradas. Resulta que David Miller de la Universidad de Oklahoma ha escrito una biblioteca para Create que se puede descargar de su página en https://i-borg.engr.ou.edu/~dmiller/create/. Con esos recursos y los manuales para la creación estaba listo para programar. Pero el siguiente gran desafío fue ¿qué quería que hiciera? Quería un robot que pudiera ir a recoger bolas naranjas y anotarlas en una canasta. Mi objetivo sonaba simple, y probablemente podría haber sido simple, pero cuanto más me metía en lo que podía hacer Create, más quería que hiciera. Mi lista final se veía así: 1. Encuentra la bola naranja 2. Coge la bola naranja 3. Localice la cesta 4. Ponga la pelota en la canasta mientras 1. Evitar objetos 2. No caerse de nada (como una mesa) 3. Detectando la carga de la batería y acoplando con la home base cuando baja Oh, y todo esto es completamente autónomo, lo que significa que todo está preprogramado.

Paso 5: Código

Puede ser complicado, pero funciona. # Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // camera servo port # define arm 3 // arm servo port # define et (analog (0)) // et port / * El cable de creación también debe estar enchufado. El conector de alimentación, el enchufe de 3 clavijas en el puerto 8 y el etiquetado UX en JP 28 (al lado del puerto USB) con la U hacia la cámara * / # definir c_down 5 // servo de la cámara hacia abajo # definir a_down 17 // armar el servo hacia abajo # definir mantener 50 // servo mantener la bola # definir atrapado 27 // armar la posición del servo para evitar ser atrapado en la mesa # definir disparar 150 // servo lanzar la bola # definir track_c 25 // servo de la cámara posición de cierre de la pista # definir track_f 45 // servo de la cámara seguir la posición lejana # definir el centro 120 // centro de la visión de la cámara # definir el rango 30 // track_y coordinar cuando la bola está en la garra # definir la bola 0 // canal de bola naranja # definir bola_x (track_x (bola, 0)) // coordenada x de bola # definir bola_y (track_y (bola, 0)) // coordenada y de bola # definir lento 100 // velocidad de lento motor # define rápido 175 // velocidad del motor rápido # define claro 0.2 // s leep para alejarse de los obstáculos # define el tiempo 0.5 //1.0 es un giro a la derecha de 90 grados # define el descanso 0.05 // tiempo para dormir mientras rastrea las manchas # define la velocidad a 175 // velocidad para evitar el giro # define back_s -200 // velocidad para alejarse del objeto golpeado # definir recto 32767 // conducir en línea recta # definir backb 2 // canal del color principal del tablero # definir cuadrado 1 // canal del color de acento del tablero # definir track_d 250 // posición de la cámara para el objetivo de seguimiento # define track_find 70 // posición de la cámara para seguimiento largo # define reverse 2.25 // tiempo de reposo para un 180 # define back_f -150 // back fast speed # define back_sl -125 // back slow speed # define center_x 178 // true x center of cam # define center_y 146 // verdadero y centro de camint pida; // evita processint pidb; // rastrea processint pidc; // puntúa processint have_ball = 0; // dice a qué función estamos invocados main () {long ch; enable_servos (); // habilitar servos init_camera (); // iniciar la cámara cconnect (); // conectar para crear con control total start_a (); // iniciar la función de evitar start_b (); // iniciar la función ball_tracking while (1) {if (r_button () || gc_ldrop || gc_rdrop) {// si se levanta o r botón de hombro kill (pida); matar (pidb); matar (pidc); disable_servos (); desconectar(); romper;} create_battery_charge (); display_clear (); printf ("cargo =% l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); matar (pidb); matar (pidc); lanzar(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("cargo =% l / n", gc_battery_charge); dormir (1.0);} cconnect (); espalda(); dormir (2,0); empezar un(); start_b ();}}} void evitar () {while (1) {// repetir para siempre create_sensor_update (); // actualizar todos los valores del sensor // create_drive (speeda, straight); if (gc_lbump == 1) {// golpe a la izquierda evitar_derecha ();} // gira a la derecha para evitar else if (gc_rbump == 1) {// golpe a la derecha evitar_left ();} // gira a la izquierda para evitar else if (gc_lfcliff == 1) {// acantilado delantero izquierdo evitar_derecha ();} else if (gc_rfcliff == 1) {// acantilado delantero derecho evitar_left ();} else if (gc_lcliff == 1) {// acantilado izquierdo evitar_derecho ();} else if (gc_rcliff == 1) {// acantilado derecho evitar_izquierda ();}}} void track_ball () {matar (pidc); while (! have_ball) {// repetir hasta obtener la bola track_update (); far (); // establece la cámara lista (); // establece el brazo while (et <255) {// hasta que se alcanza el valor máximo cuando se atrapa la pelota track_update (); // actualiza la imagen de la cámara if (ball_x <= (center-5)) {// si se deja la bola track_update (); create_drive_direct (lento, rápido); // girar a la izquierda sleep (descansar);} else if (ball_x> = (center + 5)) {// si la bola está a la derecha track_update (); create_drive_direct (rápido, lento); // gira a la derecha sleep (descanso);} else if (ball_x (center-5)) {// si la bola está centrada track_update (); create_drive_straight (rápido); // ir directamente a dormir (descansar);}} agarrar (); // agarrar la bola bip (); // hacer ruido stop (); // dejar de conducir have_ball = 1; // tomar nota de que I have ball} start_c (); // encuentra la canasta sleep (1.0); // sleep para no hacer nada cuando me maten} void find_basket () {kill (pidb); // proceso de rastreo de kill ball find (); // coloca la cámara track_set_minarea (1000); // el tablero es grande, así que solo busca manchas grandes while (have_ball) {// mientras tengo la pelota track_update (); while (track_x (backb, 0) = (center_x + 20)) {// mientras no está centrado track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// si se deja el tablero track_update (); create_spin_CCW (100);} // gira a la izquierda else if (track_x (backb, 0) <= (center_x-20)) {// si el tablero está a la derecha track_update (); create_spin_CW (300-center_x);} // gira a la derecha reduciendo la velocidad a medida que el centro se acerca} stop (); while (track_size (backb, 0) <= (6000)) {// mientras que el objetivo tiene un tamaño inferior a 6000 píxeles track_update (); if (track_x (backb, 0) <= (center_x-5)) {// si se deja el objetivo track_update (); create_drive_direct (lento, rápido); // gira a la izquierda sleep (descanso);} else if (track_x (backb, 0)> = (center_x + 5)) {// si el objetivo es correcto track_update (); create_drive_direct (rápido, lento); // gira a la derecha sleep (descanso);} else if (track_x (backb, 0) (center_x-5)) {// si el objetivo está centrado track_update (); create_drive_straight (rápido); // ir directamente a dormir (descansar);}} detener (); // create_drive_straight (fast); // acércate un poco más //sleep(1.0); //parada(); dormir (1.0); create_spin_CW (speeda); // girar a la derecha sleep (reverse); // dormir el tiempo suficiente para un giro de 180 stop (); down (); // baja la cámara para rastrear el sueño del tablero (1.0); track_set_minarea (200); // usamos un tamaño mínimo más pequeño, ya que estamos apuntando hacia él y vamos a acercarnos while (track_y (backb, 0)> = (center_y-140)) {// mientras que el objetivo es menor que el y coordina track_update (); if (track_x (backb, 0) <= (center_x-5)) {// si se deja el objetivo track_update (); back_right (); // girar a la izquierda sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// si el objetivo es correcto track_update (); back_left (); // girar a la derecha sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// si el objetivo está centrado track_update (); back (); // ir directamente a dormir (descansar);}} detener (); bip(); lanzar (); // disparar dormir (1.0); have_ball = 0; // recordatorio de que lancé la pelota y no la tengo} start_b (); // de vuelta al rastreo de la pelota sleep (1.0); // no hagas nada hasta que este proceso muera} void cconnect () {create_connect (); create_full (); // para el control total de los sensores de repisa create_power_led (0, 255);} // led de energía verdevoid desconectar () {detener (); // dejar de moverse create_disconnect ();} void back_away () {back (); dormir (despejado); stop ();} void rotate_l () {create_spin_CCW (velocidad); hora de dormir); stop ();} void rotate_r () {create_spin_CW (velocidad); hora de dormir); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void ready () {set_servo_position (arm, a_down);} void check () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} void repisa () {set_servo_position (brazo, atrapado);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// prepárate set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a + = 1) {// levanta el brazo suavemente set_servo_position (arm, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (evitar ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // espera a que finalice el proceso de creación actual y toma prioridad kill_process (pid); CREATE_FREE; // he terminado stop ();} void evitar_left () {kill (pidb); // detener todo lo demás kill (pidc); repisa (); // levanta la garra para que no quede atrapada en la mesa back_away (); // retrocede rotate_l (); // rota lejos del obstáculo ready (); // vuelve a poner la garra hacia abajo if (have_ball) {// si tengo el balón start_c ();} // iniciar el seguimiento del gol else if (! have_ball) {// si no tengo el balón start_b ();} // iniciar el seguimiento del balón} void evitar_right () {matar (pidb); matar (pidc); repisa(); back_away (); rotate_r (); Listo(); if (have_ball) {start_c ();} else if (! have_ball) {start_b ();}} void back_left () {create_drive_direct (back_f, back_sl);} void back_right () {create_drive_direct (back_sl, back_f);}

Paso 6: ¿Valió la pena?

Los costos fueron: Crear + batería + documento = $ 260 Kit de inicio XBC (xbc, cam, ladrillos LEGO, sensores) = $ 579 PVC + pintura + tornillos = aproximadamente $ 20 Costo total = $ 859 Ya tenía el kit de inicio XBC de Botball, así que el costo Para mí fue el costo de Create. Creo que valió la pena, y la mejor parte es que todas las partes que usé son reutilizables, si pudiera separarme de este bot. Este video muestra la subrutina de evitar, sobre una mesa. Este video muestra al robot anotando 5 bolas naranjas en un gol. Solo ayudé a acelerar el proceso, eventualmente habría encontrado la bola 5 por sí sola.

Paso 7: Conclusión

El resultado final es un robot que puede recoger y anotar bolas naranjas en una portería por sí solo.

Me encantó trabajar en este proyecto. Cuanto más trabajaba en este robot, más me apegaba a él. Ahora le hablo como si fuera una mascota. Espero que esto te haya ayudado en tu próximo proyecto. Hay muchas personas a las que debo agradecer, pero hay demasiadas. Como dijo con tanta elegancia Bernardo de Chartres: "somos como enanos sobre los hombros de gigantes, de modo que podemos ver más que ellos, y las cosas a mayor distancia, no en virtud de ninguna agudeza visual de nuestra parte, ni de ninguna distinción, sino porque somos elevados y elevados por su tamaño gigante ".

Recomendado: