Índice:

IRobot Create-Mars Expedition Rover Mark I: 4 etapas
IRobot Create-Mars Expedition Rover Mark I: 4 etapas

Vídeo: IRobot Create-Mars Expedition Rover Mark I: 4 etapas

Vídeo: IRobot Create-Mars Expedition Rover Mark I: 4 etapas
Vídeo: Perseverance Mars Rover Landing- Inside Story 2024, Julho
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Este instrutível irá ensiná-lo a configurar o iRobot Create usando a codificação MatLab. Seu robô terá a capacidade de pesquisar minerais distinguindo formas, manobrar em terrenos acidentados com o uso de sensores de penhasco e ser controlado manualmente por meio de um feed ao vivo.

Etapa 1: suprimentos

Suprimentos
Suprimentos

Para este projeto, você precisará do iRobot Create, que é uma versão programável do aspirador de pó robô Roomba. O robô vem equipado com todos os sensores necessários para este projeto, especificamente sensores de colisão, sensores de penhasco e sensores "Light Bump". Você também precisará de um Raspberry Pi e uma câmera de vídeo, usados para comunicação sem fio, programação ao vivo e alimentação de vídeo ao vivo. Por último, você precisará de uma montagem impressa em 3D para o Raspberry Pi e a câmera.

Etapa 2: desenvolver codificação para satisfazer o resultado desejável

Desenvolva a codificação para satisfazer o resultado desejável
Desenvolva a codificação para satisfazer o resultado desejável

Depois de conectar seu Roomba, você precisará criar um código Matlab que fornecerá as saídas desejadas após as entradas desejadas.

O código pode ser visto aqui:

% Projeto Roomba% Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal (mheal)% 4/11/19% Descrição do problema: Crie um rover para ajudar os humanos durante a% exploração / habitação de Marte. Método de solução%: Pesquisa de matéria orgânica (verde) por meio do uso de% light bumpers, sensores de penhasco e câmera para verificar a matéria orgânica. Permita que% o rover navegue em terrenos acidentados com o uso de pára-choques, sensores de% de penhasco e sensores de altura das rodas. Permita que humanos controlem o rover de% de uma distância segura e pesquisem manualmente por minerais. escolhas = {'VIDA', 'TERRENO ÁSPERO', 'CONTROLE DO USUÁRIO'}; % Três opções no menu de diálogo Configuração = menu ('', opções) se Configuração> 0% Se a opção escolhida solicitar opções de confirmação do usuário2 = {'Sim', 'Não'}% Crie uma matriz de células para "sim" ou "Não "escolha Confirmar = menu (['Você escolheu"' escolhas {Configuração} '"modo.'], escolhas2)% Confirma a escolha da configuração do usuário se Confirmar == 1 se Configuração == 1% Verifique se a configuração" VIDA "foi escolhida i = 0 enquanto i == 0 r.setLEDDigits (num2str ('LIFE'))% Exibir 'LIFE' no LED para i = 1: 100 r.setDriveVelocity (0,05)% Mova roomba para frente em 0,05 m / sy = r.getCliffSensors % Recuperar e armazenar valores do sensor de penhasco na estrutura celular "y" l = r.getLightBumpers% Recuperar e armazenar valores de colisão de luz na estrutura "f" se l.esquerda> 100% Verifique se o pára-choque de luz esquerdo está coberto r.moveDistance (-0,05)% Mova roomba para trás 0,05 metros r.turnAngle (20)% Girar roomba 20 graus CCW img = r.getImage% Obter imagem da câmera rasberry pie no roomba rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Life found!" waitfor (d); end elseif l.leftFront> 100% A verificação está à esquerda / o pára-choque da luz frontal está coberto r.moveDistance (-0,05)% Mova o roomba para trás 0,05 metros img = r.getImage% Obtenha a imagem da câmera rasberry no roomba e armazene na variável 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Life found!" waitfor (d); end elseif l.leftCenter> 100% Verifique se o pára-choque esquerdo / central está coberto r.moveDistance (-0,05)% Mova o roomba para trás 0,05 metros img = r.getImage% Obtenha a imagem da câmera rasberry torta no roomba e armazene na variável 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Vida encontrada!" waitfor (d); end elseif l.rightCenter> 100% Verifique se o pára-choque de luz direito / central está coberto r.moveDistance (-0,05)% Mova o roomba para trás 0,05 metros img = r.getImage% Obtenha a imagem da câmera rasberry torta no roomba e armazene na variável 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Vida encontrada!" waitfor (d); end elseif l.rightFront> 100% Verifique se o pára-choque direito / frontal está coberto r.moveDistance (-0,05)% Mova o roomba para trás 0,05 metros img = r.getImage% Obtenha a imagem da câmera rasberry no roomba e armazene na variável 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Life found!" waitfor (d); end elseif l.right> 100% Verifique se o pára-choque de luz direito está coberto r.moveDistance (-0,05)% Mova o roomba para trás 0,05 metros r.turnAngle (-20)% Girar roomba 20 graus CW img = r.getImage% Obter imagem de câmera de pizza rasberry no roomba e armazene na variável 'img' rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagem para focar no vermelho central = média (média (img (:,:, 1)))% intensidade média de vermelho verde = média (média (img (:,:, 2)))% intensidade média verde azul = média (média (img (:,:, 3)))% intensidade média azul se verde> vermelho && verde> azul% Verifique se a planta está na imagem d = msgbox (['Vida encontrada! ']); % Exibe uma caixa de mensagem dizendo "Life found!" waitfor (d); end elseif y.leftFront <1500% Verifique se a parte esquerda / frontal do roomba está fora do penhasco r.moveDistance (-0,1, 0,05)% Mova o roomba para trás 0,1 metros a 0,05 m / s r.turnAngle (-5)% Girar roomba 5 graus CW elseif y.rightFront <1500% Verifique se a parte direita / frontal do roomba está fora do penhasco r.moveDistance (-0,1, 0,05)% Mova o roomba para trás 0,1 metros a 0,05 m / s r.turnAngle (5)% Girar roomba 5 graus CCW elseif y.left <1000% Verifique se o lado esquerdo do roomba está fora do penhasco r.moveDistance (-0,05, 0,05)% Mova o roomba para trás 0,05 metros a 0,05 m / s r.turnAngle (-10)% Girar roomba 10 graus CW elseif y.right0% Executar se o botão for pressionado se Continuar == 1 i = 0% Continuar procurando por vida else i = 1% Finalizar modo LIFE end end end elseif Configuração == 2% Verifique se a configuração "ROUGH TERRAIN" foi escolhida i = 0 enquanto i == 0 r.setLEDDigits (num2str ('RGH'))% Display 'Rough' no display LED para i = 1: 1000 r.setDriveVelocity (0,05)% Defina a velocidade do roomba drive para 0,05 m / sx = r.getBumpers% Recupere e armazene os valores do sensor bumper na estrutura "x" y = r.get CliffSensors% Recupere e armazene os valores do sensor de penhasco na estrutura "y" se x.right == 1% Verifique se o amortecedor direito está pressionado r.turnAngle (10)% Girar roomba 10 graus CCW elseif x.esquerdo == 1% Verifique se esquerdo amortecedor pressionado r.turnAngle (-10)% Girar roomba 10 graus CW elseif x.front == 1% Verifique se o amortecedor dianteiro foi pressionado r.turnAngle (20)% Girar roomba 20 graus CCW elseif x.rightWheelDrop == 1% Verifique se a roda direita caiu r.turnAngle (-20)% Rotate roomba 20 graus CW elseif x.leftWheelDrop == 1% Verifique se a roda esquerda caiu r.turnAngle (20)% Rotate roomba 20 graus CCW elseif y.leftFront < 1500% Verifique se a parte frontal esquerda do roomba está fora do penhasco r.moveDistance (-0,05, 0,05)% Mova o roomba para trás 0,05 metros a 0,05 m / s r.turnAngle (-5)% Girar roomba 5 graus CW elseif y.rightFront < 1500% Verifique se a parte frontal direita do roomba está fora do penhasco r.moveDistance (-0,05, 0,05)% Mova o roomba para trás 0,05 metros a 0,05 m / s r.turnAngle (5)% Girar roomba 5 graus CCW elseif y.left <1000 % Verifique se a parte esquerda o f roomba está fora do penhasco r.moveDistance (-0,05, 0,05)% Mova o roomba para trás 0,05 metros a 0,05 m / s r.turnAngle (-10)% Girar roomba 10 graus CW elseif y.right0 se Continuar == 1 i = 0 % Continue terreno acidentado else i = 1% Fim do terreno acidentado end end end else% Modo manual i = 0 r.setLEDDigits (num2str ('USER'))% Display 'USER' no display LED d = msgbox (['Arrow Keys - Mover; S - Pare o Rover; ESC - Controle do usuário final; A - Localizar recurso ']); waitfor (d); enquanto i == 0 r.showCamera% Abra a imagem ao vivo da câmera rasberry pie em uma janela separada D = getkey (1)% Tecla de recuperação pressionada pelo usuário, armazene o valor ASCII como variável D se D == 30% Verifique se a seta "para cima" foi foi pressionado r.setDriveVelocity (0,1)% Enviar roomba para frente a 0,2 m / s elseif D == 28% Verifique se a seta "esquerda" foi pressionada r.setDriveVelocity (0)% Impedir que o roomba se mova para frente ou para trás r.turnAngle (15, 0,05)% Girar roomba 45 graus CCW a 0,05 m / s elseif D == 31% Verifique se a seta "para baixo" foi pressionada r.setDriveVelocity (-0,1)% Mover roomba para trás a 0,2 m / s elseif D == 29% Verifique se a seta "direita" está pressionada r.setDriveVelocity (0)% Impede que o roomba se mova para frente ou para trás r.turnAngle (-15, 0,05)% Gire o roomba 45 graus CW a 0,05 m / s elseif D == 27% Verifique se a tecla "esc" (escape) foi pressionada i = 1% Altere o valor da variável "i" para sair do loop d = msgbox ('Saindo do "Controle do usuário"')% Avise ao usuário que o modo manual está sendo encerrado elseif D == 115% Verifique se a tecla "s" foi pressionada r.setDriveVelocity (0)% Pare o roomba de indo para frente ou para trás elseif D == 97% Verifique se "a" foi pressionado image = r.getImage; imwrite (image, 'image.png') W = Classificar (imagem) K = modo (W) se K == 3 d = msgbox ('Recurso encontrado')% Exibir se recurso retangular detectado waitfor (d); % Espera que o usuário feche a caixa de mensagem "d" elseif K == 0 d = msgbox ('Não Recurso:(')% Mostra se o recurso retangular não foi detectado waitfor (d);% Espera que o usuário feche a caixa de mensagem "d" end else d = msgbox ('Não é uma entrada de chave válida.')% Exibe se o usuário fecha o menu "escolher configuração" waitfor (d);% Espera que o usuário feche a caixa de mensagem "d" end waitfor (d);% Aguarde usuário fecha a caixa de mensagem "d" end end end else d = msgbox ('Goodbye')% Diz adeus se as opções estiverem fechadas end waitfor (d);

Etapa 3: Teste

Testando
Testando

Depois que seu código for escrito, você precisará testar seu Roomba. Embora seu código possa parecer correto, muitos de seus valores, especialmente de cor ou forma, precisarão ser alterados para reconhecer corretamente os objetos que você gostaria que seu Roomba identificasse.

Etapa 4: Observe as saídas visuais

Observe as saídas visuais
Observe as saídas visuais
Observe as saídas visuais
Observe as saídas visuais

Será muito claro se você programou ou não o Roomba com sucesso com base em suas saídas visuais.

As saídas incluem:

  • Detecção de formas: a capacidade do Roomba de distinguir adequadamente as formas para encontrar os minerais corretos
  • Manobras em terreno acidentado: evita penhascos ou áreas escuras
  • Modo manual: feed ao vivo e capacidade de controlar o Roomba
  • Fotos: Fotos de minerais
  • Life Found !: Uma caixa de texto MatLab significando que sua planta identificou vida orgânica.

Este é o fim do nosso tutorial, aproveite seu novo Mars Expedition Rover!

Recomendado: