Índice:

Transformando seu Roomba em um Mars Rover: 5 etapas
Transformando seu Roomba em um Mars Rover: 5 etapas

Vídeo: Transformando seu Roomba em um Mars Rover: 5 etapas

Vídeo: Transformando seu Roomba em um Mars Rover: 5 etapas
Vídeo: CRIEI UM CARRO MALUCO PARA EXPLORAR NOVOS PLANETAS!! (RoverCraft) 2024, Novembro
Anonim
Transformando seu Roomba em um Mars Rover
Transformando seu Roomba em um Mars Rover

Etapa 1: Reúna seus materiais

Para concluir este projeto, você precisará reunir os seguintes materiais:

1 robô Roomba

1 Kit Raspberry Pi

1 câmera de vídeo

Acesso ao MATLAB

Etapa 2: Baixe as caixas de ferramentas do Roomba para MATLAB

Baixe as caixas de ferramentas do Roomba para MATLAB
Baixe as caixas de ferramentas do Roomba para MATLAB
Baixe as caixas de ferramentas do Roomba para MATLAB
Baixe as caixas de ferramentas do Roomba para MATLAB

Execute o código a seguir para instalar as caixas de ferramentas necessárias para concluir este projeto.

function roombaInstall

clc;

% lista de arquivos para instalar

files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% local de onde instalar

options = weboptions ('CertificateFilename', ''); % dizem para ignorar os requisitos do certificado

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Instalação / atualização do Roomba';

% exibir objetivo e obter confirmação

prompt = {

'Este programa irá baixar estes arquivos EF 230 Roomba:'

''

strjoin (arquivos, '')

''

'para esta pasta:'

''

CD

''

'Você quer continuar? '

};

bip;

yn = questdlg (prompt,…

dlgTitle, …

'Sim', 'Não', 'Sim');

if ~ strcmp (yn, 'Sim'), retorna; fim

% obtém a lista de arquivos que existem

existing_files = files (cellfun (@exist, files)> 0);

if ~ isempty (existing_files)

% certifique-se de que está tudo bem para substituí-los

prompt = {'Você está substituindo este (s) arquivo (s):'

''

strjoin (existing_files, '')

''

'OK para substituir?'

};

bip;

yn = questdlg (prompt,…

dlgTitle, …

'Sim', 'Não', 'Sim');

if ~ strcmp (yn, 'Sim'), retorna; fim

fim

% baixe os arquivos

cnt = 0;

para i = 1: comprimento (arquivos)

f = arquivos {i};

disp (['Baixando' f]);

Experimente

url = [servidor f];

websave (f, url, opções); % opções adicionadas para evitar erros de segurança

cnt = cnt + 1;

pegar

disp (['Erro ao baixar' f]);

dummy = [f '.html'];

se existir (fictício, 'arquivo') == 2

deletar (fictício)

fim

fim

fim

if cnt == length (arquivos)

msg = 'Instalação bem sucedida';

waitfor (msgbox (msg, dlgTitle));

outro

msg = 'Erro de instalação - veja a janela de comando para detalhes';

waitfor (errordlg (msg, dlgTitle));

fim

fim% roombaInstall

Etapa 3: conecte-se ao seu Roomba

Agora é hora de se conectar ao seu Roomba usando wi-fi. Usando 2 dedos, pressione os botões Dock e Spot simultaneamente para ligar ou redefinir o Roomba. Em seguida, execute o código r = roomba (# do seu Roomba) na janela de comando do MATLAB para se conectar ao seu robô. Depois de executar esse comando, seu Roomba deve estar pronto para funcionar.

Etapa 4: escolha como deseja controlar seu Roomba

Escolha como deseja controlar seu Roomba
Escolha como deseja controlar seu Roomba
Escolha como deseja controlar seu Roomba
Escolha como deseja controlar seu Roomba

Existem duas maneiras de controlar o Roomba: de forma autônoma ou usando um smartphone como controlador.

Se você optar por dirigir o Roomba de forma autônoma, precisará usar os três sensores integrados: sensores de penhasco, sensores de colisão e sensores de luz.

Para usar um smartphone, primeiro você precisa conectar seu smartphone ao computador seguindo as etapas abaixo.

NOTA: Seu computador e smartphone precisam estar na mesma rede WiFi para se conectar corretamente!

1. Baixe o aplicativo MATLAB da loja de aplicativos em seu dispositivo.

2. Digite "conector ligado" na janela de comando e defina uma senha que precisará ser inserida em ambos os dispositivos.

3. Depois de fazer isso, o MATLAB fornecerá o endereço IP do seu computador. Você precisa ir para a página de configurações no aplicativo MATLAB em seu smartphone e adicionar um computador usando o endereço IP fornecido e a senha que você digitou anteriormente.

4. Na janela de comando em seu computador, digite o código m = mobiledev e isso deve inicializar seu smartphone como um controlador para seu Roomba.

5. Seu computador e smartphone devem estar prontos agora.

Etapa 5: conduza seu Roomba

Agora que você tem todas as ferramentas necessárias para criar seu Mars Rover, está pronto para criar seu próprio código. Anexamos um código de exemplo abaixo para a direção autônoma e a direção controlada por smartphone.

Direção Autônoma

função Explore_modified (r)

% argumentos de entrada: 1 objeto roomba, r

% argumentos de saída: nenhum

%Descrição:

A função% utiliza um loop while infinito para permitir a autonomia

% exploração dos arredores do bot.

%

% funciton também fornece instruções para o roomba sobre o que fazer em

% nas seguintes situações: Roda (s) perde (m) contato com o solo, um

% objeto é detectado na frente ou para qualquer lado do bot, e um

% queda repentina é detectada na frente ou em qualquer um dos lados do bot.

%

% instruções típicas incluem comandos de movimento destinados a maximizar

% exploração ou evita um perigo detectado e comandos para se comunicar

% de informações sobre as descobertas dos bots (fotos), posição (gráfico), % e estado (aviso ocioso) com o usuário via matlab e / ou e-mail. Diversos

% comandos de som são adicionados para diversão.

% configurar recursos de e-mail

mail = '[email protected]';

senha = 'EF230Roomba';

setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Internet', 'E_mail', mail);

setpref ('Internet', 'SMTP_Username', mail);

setpref ('Internet', 'SMTP_Password', senha);

props = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'true');

props.setProperty ('mail.smtp.auth', 'true');

props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty ('mail.smtp.socketFactory.port', '465');

% r = roomba (19)

r.beep ('G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C1 ^^, C1 ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');

v =.1;

reflect_datum = 2700; % definir o valor de referência dos sensores de penhasco

lightBumper_datum = 200; % definir valor de referência de sensores de pára-choques leves

pos = [0, 0]; % variável para armazenamento de posição com datum inicializado

ângulo = 0; % definido ângulo de referência

netangle = 0; % deslocamento do ângulo líquido

i = 2; % iterator para adicionar linhas para posicionar a variável de armazenamento

dist = 0;

r.setDriveVelocity (v, v); % iniciar o roomba avançando

enquanto verdadeiro

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); % gera 1 ângulo aleatório entre 20 e 60 graus. Usado para evitar que o bot fique preso em um loop

% O que fazer se uma ou mais rodas perder o contato com o solo:

% pare o movimento, envie um e-mail de aviso com a imagem dos arredores, % e pergunte ao usuário se deve prosseguir ou esperar por ajuda

if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

r.beep ('F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^, F # 1 ^^, C1 ^^ ')

img = r.getImage;

imwrite (img, 'stick.png');

%--------------------------

imfile = 'preso.png';

posição = savepos (pos);

%---------------------------

sendmail (mail, 'HELP!', 'Estou encalhado em um penhasco!', {imfile, posição})

list = {'Continuar', 'Parar'};

idx = menu ('O que devo fazer?', lista);

se idx == 2

pausa

fim

% O que fazer se um objeto for detectado na frente do bot:

% pare, volte, tire uma foto, alerte o usuário sobre a descoberta

% via e-mail, gire 90 graus e continue explorando

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

r.bipe ('A1 ^, A1 ^, A4 ^, A2 ^, G2 ^, G2 ^, G4 ^, Bb2 ^, Bb2 ^, Bb3.5 ^, G1 ^, A8 ^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png';

posição = savepos (pos);

%---------------------------

sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição})

ângulo = 90;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.setDriveVelocity (v, v);

% O que fazer se o objeto for detectado à esquerda do bot:

% pare, vire em direção ao objeto, recue, tire uma foto, alerta

% usuário de descoberta via e-mail, vire 90 graus e continue explorando

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

ângulo = 30;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

r.bipe ('A4 ^, A4 ^, G1 ^, E1 ^, C3.5 ^, C2 ^^, C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, E8 ^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png';

posição = savepos (pos);

%---------------------------

sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição})

ângulo = -90;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.setDriveVelocity (v, v);

% O que fazer se o objeto for detectado à direita do bot:

% pare, vire em direção ao objeto, recue, tire uma foto, alerta

% usuário de descoberta via e-mail, vire 90 graus e continue explorando

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

ângulo = -30;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

pausa (1,5);

r.bipe ('C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, C8 ^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

posição = savepos (pos);

%---------------------------

sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição});

ângulo = 90;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.setDriveVelocity (v, v);

% O que fazer se o penhasco for detectado à esquerda do bot:

% pare, mova para trás, vire à direita, continue explorando

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y

i = i + 1;

ângulo = -RandAngle;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.setDriveVelocity (v, v);

% O que fazer se o penhasco for detectado à direita do bot:

% pare, mova para trás, vire à esquerda, continue explorando

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (ângulo); % get x coordinate

pos (i, 2) = dist * cosd (ângulo); % obter a coordenada y

i = i + 1;

r.moveDistance (-. 125);

ângulo = Ângulo Rand;

rede = rede + ângulo;

r.turnAngle (ângulo);

r.setDriveVelocity (v, v);

fim

fim

Controlador de smartphone

Opções = {'Autônomo', 'Controle Manual'}

Prompt = menu ('Como você gostaria de controlar o rover?', Opções)

m = mobiledev

r = roomba (19)

se Prompt == 1

Explorador)

outro

enquanto verdadeiro

pausa (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Lado = PhoneData (3);

se lado> 130 || Lado <-130% se o telefone estiver virado para baixo, interromper o roomba e sair do loop

r.stop

r.bipe ('C, C, C, C')

pausa

elseif Side> 25 && Side <40% se o telefone for virado de lado entre 25 e 40 graus, vire à esquerda 5 graus

r.turnAngle (-5);

elseif Side> 40% se o telefone for virado de lado por mais de 40 graus, vire à esquerda 45 graus

r.turnAngle (-45)

elseif Side-40% se o telefone for virado de lado entre -25 e -40 graus, vire à direita 5 graus

r.turnAngle (5);

elseif Side <-40% se o telefone for virado para o lado menos de -40 graus, vire à esquerda 45 graus

r.turnAngle (45)

fim

% Se o telefone for segurado perto da vertical, pegue uma imagem e plote-a

se Pitch <-60 && image <= 9

r.beep

img = r.getImage;

subtrama (3, 3, imagem)

imshow (img)

fim

% movem para frente e para trás com base na orientação frontal e traseira

se o pitch> 15 && Pitch <35% se o pitch entre 15 e 35 graus, avance uma curta distância

% obtém dados de bumper leves antes de mover

litBump = r.getLightBumpers;

if litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% se algo estiver na frente do roomba e irá bater se mover para frente, fazer barulho e exibir uma mensagem

r.beep ('C ^^, F # ^, C ^^, F # ^')

else% move

r.moveDistance (0,03);

% Obtenha dados do bumper depois de mover

Bump = r.getBumpers;

if Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r.bipe ('A, C, E')

r.moveDistance (-. 01)

fim

% obtém dados do sensor de penhasco

Cliff = r.getCliffSensors;

se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

fim

fim

elseif Pitch> 35% se pitch maior 35 graus mover para frente a uma distância maior

% obtém dados de bumper leves antes de mover

litBump = r.getLightBumpers;

if litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% se algo estiver na frente do roomba e irá bater se mover para frente, fazer barulho e exibir uma mensagem

r.beep ('C ^^, F # ^, C ^^, F # ^')

else% move

r.moveDistance (.3)

% Obtenha dados do bumper depois de mover

Bump = r.getBumpers;

if Bump.right == 1 || Bump.left == 1 || Bump.front == 1% se você bater em algo, faça um barulho, exiba uma mensagem e faça backup

r.bipe ('A, C, E')

r.moveDistance (-. 01)

fim

% obtém dados do sensor de penhasco após a movimentação

Cliff = r.getCliffSensors;

se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

fim

fim

elseif Pitch-35% se pitch entre -15 e -35 graus mover para trás curta distância

r.moveDistance (-. 03);

% obtém dados do sensor de penhasco após a movimentação

Cliff = r.getCliffSensors;

se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e faça backup

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

fim

elseif Pitch-60% se o pitch entre -35 e -60 graus mover para trás em uma distância maior

r.moveDistance (-. 3)

% obtém dados do sensor de penhasco após a movimentação

Cliff = r.getCliffSensors;

se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

fim

fim

fim

fim

Recomendado: