Índice:
- Etapa 1: suprimentos
- Etapa 2: desenvolver codificação para satisfazer o resultado desejável
- Etapa 3: Teste
- Etapa 4: Observe as saídas visuais
Vídeo: IRobot Create-Mars Expedition Rover Mark I: 4 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:39
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
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
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
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
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:
Assombração da casa de Mark Twain: 5 etapas
Assombrando a casa de Mark Twain: Há rumores de que a casa de Mark Twain é assombrada pelo famoso autor. Neste Instructable, eu " descobri " uma velha fotografia que prova sem sombra de dúvida que o fantasma de Twain realmente assombra esta casa histórica
A máquina definitiva de Beer Pong - PongMate CyberCannon Mark III: 6 etapas (com imagens)
The Ultimate Beer Pong Machine - PongMate CyberCannon Mark III: IntroduçãoO PongMate CyberCannon Mark III é a peça mais recente e avançada de tecnologia de beer pong a ser vendida ao público. Com o novo CyberCannon, qualquer pessoa pode se tornar o jogador mais temido da mesa de beer pong. Como é isso p
Slave Trigger Flash Mark II: 6 etapas (com imagens)
Slave Trigger Flash Mark II: Neste instrutível irei explicar como fazer um verdadeiro (ótico) flash de trigger escravo com um mínimo de componentes. Existem muitos designs complexos que você pode encontrar na internet, este design é muito simples e funciona bem em ambiente claro e escuro
Usando o módulo de comando IRobot Create com Linux: 4 etapas
Usando o Módulo de Comando do IRobot Create com Linux: Como o iRobot não forneceu aos usuários do Linux uma maneira de usar o módulo de comando, eu tive que descobrir sozinho. Não se intimide, não é nada difícil, realmente. Tudo o que você precisa fazer é executar alguns scripts. Vamos começar, vamos?
Alto-falantes Mark I Super Psyllium Passivia: 6 etapas (com fotos)
Mark I Alto-falantes Super Psyllium Passivia: Inspirados na variedade de designs de alto-falantes nos instructables, que melhor maneira de entrar na briga da Arte do Som do que fazer YAS (Yet Another Speaker)! Somos pessoas normais aqui no Regularity Audio Labs e tínhamos esses maravilhosos recipientes vazios espalhados