Índice:

Como fazer um robô jogador de basquete autônomo usando um IRobot Crie como base: 7 etapas (com imagens)
Como fazer um robô jogador de basquete autônomo usando um IRobot Crie como base: 7 etapas (com imagens)

Vídeo: Como fazer um robô jogador de basquete autônomo usando um IRobot Crie como base: 7 etapas (com imagens)

Vídeo: Como fazer um robô jogador de basquete autônomo usando um IRobot Crie como base: 7 etapas (com imagens)
Vídeo: Robô que limpa o chão? Nós testamos! 2024, Julho
Anonim
Como fazer um robô jogador de basquete autônomo usando um IRobot como base
Como fazer um robô jogador de basquete autônomo usando um IRobot como base

Esta é a minha entrada para o desafio iRobot Create. A parte mais difícil de todo esse processo para mim foi decidir o que o robô faria. Eu queria demonstrar os recursos interessantes do Create, ao mesmo tempo em que adicionava um toque de robo. Todas as minhas ideias pareciam cair na categoria de chatas, mas úteis, ou frias e pouco práticas. No final, o legal e pouco prático venceu e o robô jogador de basquete nasceu. Depois de pensar um pouco, percebi que isso poderia ser prático. Suponha que você use papel laranja e que todas as suas latas de lixo tenham tabelas verdes …

Etapa 1: Aquire Parts

Por causa do limite de tempo do concurso, a maioria das peças que usei estava "pronta para uso". Peças usadas do robô em "estoque": Create (x1) - do iRobot www.irobot.comXBC V.3.0 (x1) - do Botball www.botball.orgCreate-Roomba cable (x1) - do Botball www.botball.orgServo (x2) - do Botball www.botball.orgSharp rangefinder (x1) - do Botball www.botball.orgAssorted LEGO bricks - do LEGO www.lego.com parafusos de máquina6-32 (x4) - do McMaster www.mcmaster.com Peças do robô "criadas" usadas: folha de PVC extrudada de 3/8 "de espessura - esse material é incrível, mas não me lembro de onde o obtive, mas é exatamente como esse material https://www.lynxmotion.com / Category.aspx? CategoryID = 62Outras partes: Bola "POOF" laranja - da lixeira do WalMartBasketball - da "tabela" LowesGreen - PVC extra pintado de verde brilhante

Etapa 2: Crie a peça única

Crie a peça única
Crie a peça única

A única parte que tive de fabricar foi uma placa aparafusada ao Create e ofereceu espaçamento LEGO. O espaçamento dos orifícios dos tijolos LEGO é de 8 mm, mas fiz um espaçamento duplo para economizar tempo. O PVC extrudado é muito fácil de trabalhar. Pode ser cortado com uma faca, mas é rígido e forte. Costumo pegar o robô por esta placa e ainda não tive nenhum problema.

Etapa 1: corte a folha em 3,5 "x 9,5", você pode cortar isso com uma faca. Etapa 2: faça os furos para os parafusos de criação. Os parafusos criados fazem uma caixa de 2 e 5/8 "por 8 e 5/8". Etapa 3: faça os orifícios espaçados dos tijolos de LEGO. Use uma broca de 3/16 "e afastei os furos de 16 mm. Dica: coloquei a folha em um programa CAD, imprimi em tamanho real e colei na folha. Então usei isso como um guia para cortar e perfuração.

Etapa 3: montagem do robô

Montando o Robô
Montando o Robô
Montando o Robô
Montando o Robô
Montando o Robô
Montando o Robô

Gosto de construir as coisas da forma mais simples possível, dessa forma, quando elas saltam da mesa, você não precisa reconstruir tanto!

1. Aparafuse a placa recém-formada na parte superior do Create 2. Construa um braço para agarrar a bola 3. Construa um braço para segurar a câmera 4. Construa uma montagem para o rangefinder 5. Monte o XBC e conecte todos os cabos

Etapa 4: Programando o Robô

Decidi usar o XBC como meu controlador principalmente por causa de seu rastreamento de cores integrado. Porque decidi usar o XBC como o cérebro da operação, programei meu robô em Interactive C, ou como eu chamo de IC. O IC é gratuito para uso e pode ser baixado em www.botball.org. O IC é muito semelhante ao C ++, mas possui várias bibliotecas integradas. Acontece que David Miller, da University of Oklahoma, escreveu uma biblioteca para o Create, que pode ser baixada de sua página em https://i-borg.engr.ou.edu/~dmiller/create/. Com esses recursos e os manuais de criação, estava pronto para programar. Mas o próximo grande desafio era o que eu queria fazer? Eu queria um robô que pudesse pegar bolas laranjas e pontuá-las em uma cesta. Meu objetivo parecia simples e provavelmente poderia ter sido simples, mas quanto mais eu aprendia sobre o que o Create poderia fazer, mais eu queria que ele fizesse. Minha lista final ficou assim: 1. Encontre o ball2 laranja. Pegue o ball3 laranja. Localize basket4. Coloque a bola no basketWhile1. Evitando objects2. Não cair de nada (como uma mesa) 3. Detectar a carga da bateria e encaixar na home base quando estiver baixoOh, e tudo isso é completamente autônomo, ou seja, está tudo pré-programado.

Etapa 5: Código

Pode ser confuso, mas funciona. # Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // porta servo da câmera # define arm 3 // porta servo arm # define et (analog (0)) // et port / * O cabo de criação também precisa ser conectado. O conector de alimentação, o plugue de 3 pinos na porta 8 e o rotulado UX em JP 28 (próximo à porta USB) com o U voltado para a câmera * / # define c_down 5 // câmera servo para baixo # define a_down 17 // braço servo para baixo # define espera 50 // servo segura bola # define travado 27 // braço posição do servo para evitar ser pego na mesa # define tiro 150 // servo lançar bola # define track_c 25 // câmera servo track posição próxima # define track_f 45 // câmera servo track posição distante # define centro 120 // visão do centro da câmera # define inrange 30 // track_y coordena quando a bola está na garra # define bola 0 // canal da bola laranja # define ball_x (track_x (ball, 0)) // coordenada x da bola # define ball_y (track_y (ball, 0)) // coordenada y da bola # define lento 100 // velocidade lenta motor # define fast 175 // velocidade do motor rápido # define clear 0.2 // s leep para se afastar dos obstáculos # define o tempo 0,5 //1,0 é uma curva à direita de 90 graus # define o descanso 0,05 // tempo para dormir enquanto rastreia os blobs # define a velocidade a 175 // a velocidade da curva evitada # define back_s -200 // velocidade para afaste-se do objeto colidido # defina reto 32767 // dirija em linha reta # defina backb 2 // canal da cor principal da tabela # defina o quadrado 1 // canal da cor de destaque da tabela # defina track_d 250 // posição da câmera para rastrear o gol # define track_find 70 // posição da câmera para rastreamento longo # define reverso 2.25 // tempo de sono para 180 # define back_f -150 // volta velocidade rápida # define back_sl -125 // volta baixa velocidade # define center_x 178 // true x center of cam # define center_y 146 // true y center of camint pida; // evitar processint pidb; // rastrear processint pidc; // score processint have_ball = 0; // diz em qual função somos inválidos main () {long ch; enable_servos (); // habilitar servos init_camera (); // iniciar câmera cconnect (); // conectar para criar com controle completo start_a (); // iniciar função evitar start_b (); // iniciar função ball_tracking enquanto (1) {if (r_button () || gc_ldrop || gc_rdrop) {// se pego ou botão de ombro r kill (pida); matar (pidb); matar (pidc); disable_servos (); desconectar(); break;} create_battery_charge (); display_clear (); printf ("carga =% l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); matar (pidb); matar (pidc); lançar(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("carga =% l / n", gc_battery_charge); dormir (1,0);} cconectar (); de volta(); sono (2,0); começar um(); start_b ();}}} void Avoid () {while (1) {// repetir para sempre create_sensor_update (); // atualizar todos os valores do sensor // create_drive (speeda, straight); if (gc_lbump == 1) {// left bump Avoid_right ();} // vira à direita para evitar else if (gc_rbump == 1) {// right bump Avoid_left ();} // vira à esquerda para evitar else if (gc_lfcliff == 1) {// penhasco frontal esquerdo Avoid_right ();} else if (gc_rfcliff == 1) {// penhasco frontal direito Avoid_left ();} else if (gc_lcliff == 1) {// penhasco esquerdo Avoid_right ();} else if (gc_rcliff == 1) {// precipício direito Avoid_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// repetir até obter a bola track_update (); far (); // define a câmera ready (); // define o braço while (et <255) {// até que o valor máximo aconteça quando a bola for capturada track_update (); // atualize a imagem da câmera if (ball_x <= (center-5)) {// se a bola for deixada track_update (); create_drive_direct (lento, rápido); // vire à esquerda sleep (rest);} else if (ball_x> = (center + 5)) {// se a bola está certa track_update (); create_drive_direct (fast, slow); // vire à direita sleep (rest);} else if (ball_x (center-5)) {// se a bola está centrada track_update (); create_drive_straight (fast); // ir direto dormir (descansar);}} grab (); // pegar a bola beep (); // fazer ruído parar (); // parar de dirigir have_ball = 1; // tomar nota de que Eu tenho a bola} start_c (); // encontre a cesta sleep (1.0); // durma para não fazer nada quando for morto} void find_basket () {kill (pidb); // processo de rastreamento da bola de matar find (); // coloque a câmera track_set_minarea (1000); // a tabela é grande, portanto, procure por bolhas grandes while (have_ball) {// enquanto eu tenho a bola track_update (); while (track_x (backb, 0) = (center_x + 20)) {// enquanto não centralizado track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// se a tabela está à esquerda track_update (); create_spin_CCW (100);} // vire à esquerda else if (track_x (backb, 0) <= (center_x-20)) {// se a tabela estiver à direita track_update (); create_spin_CW (300-center_x);} // vire à direita diminuindo conforme o centro se aproxima} stop (); while (track_size (backb, 0) <= (6000)) {// enquanto o alvo tem menos de 6000 pixels de tamanho track_update (); if (track_x (backb, 0) <= (center_x-5)) {// se o alvo for deixado track_update (); create_drive_direct (lento, rápido); // vire à esquerda sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// se o alvo está à direita track_update (); create_drive_direct (fast, slow); // vire à direita sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// se o alvo está centralizado track_update (); create_drive_straight (fast); // ir direto dormir (descansar);}} stop (); // create_drive_straight (fast); // chegar um pouco mais perto //sleep(1.0); //Pare(); sono (1,0); create_spin_CW (speeda); // giro para a direita dormir (reverso); // dormir o suficiente para uma parada de 180 giros (); down (); // abaixar a câmera para rastrear o quadro sleep (1.0); track_set_minarea (200); // use um tamanho mínimo menor, uma vez que estamos apontados para ele e vamos nos aproximar enquanto (track_y (backb, 0)> = (center_y-140)) {// enquanto o alvo é menor que o coordenar y track_update (); if (track_x (backb, 0) <= (center_x-5)) {// se o alvo for deixado track_update (); back_right (); // vire à esquerda sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// se o alvo está certo track_update (); back_left (); // vire à direita sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// se o alvo está centralizado track_update (); back (); // vá direto dormir (descanso);}} stop (); bip(); throw (); // atirar sleep (1.0); have_ball = 0; // lembrete que joguei a bola e não consegui} start_b (); // de volta ao rastreamento da bola sleep (1.0); // não faça nada até que o processo termine} void cconnect () {create_connect (); create_full (); // para controle total dos sensores de borda create_power_led (0, 255);} // ledvoid de energia verde desconectar () {stop (); // parar de mover create_disconnect ();} void back_away () {back (); sono (claro); stop ();} void rotate_l () {create_spin_CCW (speeda); hora de dormir); stop ();} void rotate_r () {create_spin_CW (speeda); 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 ledge () {set_servo_position (arm, locked);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// prepare-se set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= segurar; a + = 1) {// levante o braço 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 (Avoid ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // aguarde o término do processo de criação atual e tenha prioridade kill_process (pid); CREATE_FREE; // terminei stop ();} void Avoid_left () {kill (pidb); // para tudo o resto kill (pidc); ledge (); // pegar a garra para que não fique presa na mesa back_away (); // recuar rotate_l (); // girar para longe do obstáculo ready (); // colocar a garra de volta no chão if (have_ball) {// se eu tiver a bola start_c ();} // iniciar o rastreamento do gol else if (! have_ball) {// se eu não tiver a bola start_b ();} // iniciar o rastreamento da bola} void Avoid_right () {matar (pidb); matar (pidc); borda (); back_away (); rotate_r (); pronto(); 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);}

Etapa 6: valeu a pena?

Os custos foram: Criar + bateria + doc = $ 260XBC kit inicial (xbc, cam, blocos de LEGO, sensores) = $ 579PVC + tinta + parafusos = cerca de $ 20Custo total = $ 859Eu já tinha o kit inicial XBC do Botball, então o custo para mim foi o custo do Criar. Acho que valeu a pena, e a melhor parte é que todas as peças que usei são reutilizáveis, se eu pudesse me esforçar para separar este bot. Este vídeo mostra a sub-rotina de evitar, em cima de uma mesa. Este vídeo mostra o robô marcando 5 bolas laranja em um gol. Eu apenas ajudei a acelerar o processo, ele teria encontrado a bola 5 eventualmente por conta própria.

Etapa 7: Conclusão

O resultado final é um robô que pode pegar e marcar bolas laranjas em um gol sozinho.

Adorei trabalhar neste projeto. Quanto mais eu trabalhava neste robô, mais apegado me tornava a ele. Agora falo com ele como se fosse um animal de estimação. Espero que isso tenha ajudado você em seu próximo projeto. Há muitas pessoas a quem preciso agradecer, mas são muitas. Como Bernardo de Chartres tão elegantemente afirmou: "somos como anões nos ombros de gigantes, de modo que podemos ver mais do que eles, e as coisas a uma distância maior, não em virtude de qualquer nitidez à vista de nossa parte, ou qualquer distinção, mas porque somos transportados para o alto e elevados por seu tamanho gigante."

Recomendado: