Tabla de contenido:

Convirtiendo su Roomba en un Mars Rover: 5 pasos
Convirtiendo su Roomba en un Mars Rover: 5 pasos

Video: Convirtiendo su Roomba en un Mars Rover: 5 pasos

Video: Convirtiendo su Roomba en un Mars Rover: 5 pasos
Video: ME CONVIERTO en el HOMBRE Mas Fuerte de GTA 5 2024, Noviembre
Anonim
Convirtiendo su Roomba en un Mars Rover
Convirtiendo su Roomba en un Mars Rover

Paso 1: reúna sus materiales

Para completar este proyecto, deberá reunir los siguientes materiales:

1 robot Roomba

1 kit de frambuesa Pi

1 cámara de video

Acceso a MATLAB

Paso 2: descargue las cajas de herramientas de Roomba para MATLAB

Descargue las cajas de herramientas de Roomba para MATLAB
Descargue las cajas de herramientas de Roomba para MATLAB
Descargue las cajas de herramientas de Roomba para MATLAB
Descargue las cajas de herramientas de Roomba para MATLAB

Ejecute el siguiente código para instalar las cajas de herramientas necesarias para completar este proyecto.

sala de funcionesbaInstalar

clc;

% lista de archivos para instalar

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

% ubicación desde la que instalar

options = weboptions ('Nombre de archivo de certificado', ''); % decirle que ignore los requisitos del certificado

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

dlgTitle = 'Instalación / Actualización de Roomba';

% mostrar el propósito y obtener la confirmación

prompt = {

'Este programa descargará estos archivos EF 230 Roomba:'

''

strjoin (archivos, '')

''

'a esta carpeta:'

''

CD

''

'¿Quieres continuar? '

};

bip;

yn = questdlg (indicador,…

dlgTitle,…

'Sí', 'No', 'Sí');

si ~ strcmp (yn, 'Yes'), return; fin

% obtener una lista de archivos que existen

archivos_existentes = archivos (cellfun (@exist, archivos)> 0);

si ~ está vacío (archivos_existentes)

% asegúrese de que esté realmente bien reemplazarlos

prompt = {'Está reemplazando estos archivos:'

''

strjoin (archivos_existentes, '')

''

'¿Está bien reemplazar?'

};

bip;

yn = questdlg (indicador,…

dlgTitle,…

'Sí', 'No', 'Sí');

si ~ strcmp (yn, 'Yes'), return; fin

fin

% descargar los archivos

cnt = 0;

para i = 1: longitud (archivos)

f = archivos {i};

disp (['Descargando' f]);

tratar

url = [servidor f];

websave (f, url, opciones); % de opciones agregadas para evitar errores de seguridad

cnt = cnt + 1;

captura

disp (['Error al descargar' f]);

ficticia = [f '.html'];

si existe (ficticio, 'archivo') == 2

eliminar (ficticio)

fin

fin

fin

if cnt == longitud (archivos)

msg = 'Instalación exitosa';

esperar (msgbox (msg, dlgTitle));

demás

msg = 'Error de instalación; consulte la ventana de comandos para obtener más detalles';

esperar (errordlg (msg, dlgTitle));

fin

end% roombaInstalar

Paso 3: conéctese a su Roomba

Ahora es el momento de conectarse a su Roomba mediante WiFi. Con 2 dedos, presione los botones Dock y Spot simultáneamente para encender o restablecer su Roomba. A continuación, ejecute el código r = roomba (# de su Roomba) en la ventana de comandos de MATLAB para conectarse a su robot. Una vez que haya ejecutado este comando, su Roomba debería estar listo para funcionar.

Paso 4: elija cómo desea controlar su Roomba

Elija cómo desea controlar su Roomba
Elija cómo desea controlar su Roomba
Elija cómo desea controlar su Roomba
Elija cómo desea controlar su Roomba

Hay dos formas de controlar su Roomba: de forma autónoma o utilizando un teléfono inteligente como controlador.

Si elige conducir el Roomba de forma autónoma, deberá utilizar los tres sensores integrados: sensores de desnivel, sensores de golpes y sensores de luz.

Para utilizar un teléfono inteligente, primero debe conectar su teléfono inteligente a su computadora siguiendo los pasos a continuación.

NOTA: ¡Su computadora y su teléfono inteligente deben estar en la misma red WiFi para conectarse correctamente!

1. Descargue la aplicación MATLAB de la tienda de aplicaciones en su dispositivo.

2. Escriba "conector activado" en la ventana de comandos y establezca una contraseña que deberá ingresar en ambos dispositivos.

3. Después de hacerlo, MATLAB le dará la dirección IP de su computadora. Debe ir a la página de configuración en la aplicación MATLAB en su teléfono inteligente y agregar una computadora con la dirección IP proporcionada y la contraseña que ingresó anteriormente.

4. En la ventana de comandos de su computadora, escriba el código m = mobiledev y esto debería inicializar su teléfono inteligente como controlador para su Roomba.

5. Su computadora y teléfono inteligente deberían estar listos para funcionar ahora.

Paso 5: conduzca su Roomba

Ahora que tiene todas las herramientas necesarias para crear su Mars Rover, está listo para crear su propio código. Hemos adjuntado un código de ejemplo a continuación tanto para la conducción autónoma como para la conducción controlada por teléfono inteligente.

Conducción autónoma

función Explore_modified (r)

% argumentos de entrada: 1 objeto roomba, r

% argumentos de salida: ninguno

%descripción:

La función% utiliza un bucle while infinito para permitir la autonomía

% de exploración del entorno del bot.

%

% funciton también proporciona instrucciones al roomba sobre qué hacer en

% las siguientes situaciones: Rueda (s) pierde (s) contacto con el suelo, un

% de objeto se detecta en frente o a ambos lados del bot, y un

% de caída repentina se detecta en frente o a ambos lados del bot.

%

% de las instrucciones típicas incluyen comandos de movimiento destinados a maximizar

% exploración o evitar un peligro detectado y comandos para comunicarse

% de información sobre los descubrimientos de los bots (imágenes), posición (gráfico), % y estado (advertencia varada) con el usuario a través de matlab y / o correo electrónico. Varios

Se añaden% comandos de sonido para su disfrute.

% configurar capacidades de correo electrónico

mail = '[email protected]';

contraseña = 'EF230Roomba';

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

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

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

setpref ('Internet', 'SMTP_Password', contraseña);

props = java.lang. System.getProperties;

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

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

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 = 0,1;

reflect_datum = 2700; % establecer el valor de referencia de los sensores de desnivel

lightBumper_datum = 200; % set light Valor de referencia de los sensores del parachoques

pos = [0, 0]; % variable para almacenamiento de posición con datum inicializado

ángulo = 0; % ajustado ángulo de referencia

netangle = 0; % de desplazamiento de ángulo neto

i = 2; % iterador para agregar filas a la variable de almacenamiento de posición

dist = 0;

r.setDriveVelocity (v, v); % iniciar roomba avanzando

si bien es cierto

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); % genera 1 ángulo aleatorio entre 20 y 60 grados. Se usa para evitar que el bot se atasque en un bucle

% Qué hacer si una o más ruedas pierden contacto con el suelo:

% detener el movimiento, enviar un correo electrónico de advertencia con una imagen de los alrededores, % y pregunte al usuario si debe continuar o esperar ayuda

si Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obtener la 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, 'atascado.png');

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

imfile = 'atascado.png';

posición = savepos (pos);

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

sendmail (mail, '¡AYUDA!', '¡Estoy varado en un acantilado!', {imfile, position})

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

idx = menu ('¿Qué debo hacer?', lista);

si idx == 2

rotura

fin

% Qué hacer si se detecta un objeto frente al bot:

% detener, retroceder, tomar una foto, alertar al usuario del descubrimiento

% por correo electrónico, gire 90 grados y siga 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); % obtener la coordenada x

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

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

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

i = i + 1;

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

img = r.getImage;

imwrite (img, 'FrontBump.png')

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

imfile = 'FrontBump.png';

posición = savepos (pos);

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

sendmail (mail, '¡Alerta!', '¡Encontré algo!', {imfile, position})

ángulo = 90;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.setDriveVelocity (v, v);

% Qué hacer si se detecta un objeto a la izquierda del bot:

% detenerse, girar hacia el objeto, retroceder, tomar una foto, alertar

% de usuarios de descubrimiento por correo electrónico, gire 90 grados y siga explorando

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

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

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

i = i + 1;

ángulo = 30;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

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

i = i + 1;

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

img = r.getImage;

imwrite (img, 'LeftBump.png')

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

imfile = 'LeftBump.png';

posición = savepos (pos);

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

sendmail (mail, '¡Alerta!', '¡Encontré algo!', {imfile, position})

ángulo = -90;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.setDriveVelocity (v, v);

% Qué hacer si se detecta un objeto a la derecha del bot:

% detenerse, girar hacia el objeto, retroceder, tomar una foto, alertar

% de usuarios de descubrimiento por correo electrónico, gire 90 grados y siga 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); % obtener la coordenada x

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

i = i + 1;

ángulo = -30;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

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

i = i + 1;

pausa (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

posición = savepos (pos);

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

sendmail (mail, '¡Alerta!', '¡Encontré algo!', {imfile, posición});

ángulo = 90;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.setDriveVelocity (v, v);

% Qué hacer si se detecta un acantilado a la izquierda del bot:

% parar, retroceder, girar a la derecha, seguir 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); % obtener la coordenada x

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

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obtener la coordenada x

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

i = i + 1;

ángulo = -RandAngle;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.setDriveVelocity (v, v);

% Qué hacer si se detecta un acantilado a la derecha del bot:

% parar, retroceder, girar a la izquierda, seguir explorando

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

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (ángulo); % obtener la coordenada x

pos (i, 2) = dist * cosd (ángulo); % obtener la coordenada y

i = i + 1;

r.moveDistance (-. 125);

ángulo = RandAngle;

netangle = netangle + ángulo;

r.turnAngle (ángulo);

r.setDriveVelocity (v, v);

fin

fin

Controlador de teléfono inteligente

Opciones = {'Autónomo', 'Control manual'}

Prompt = menu ('¿Cómo le gustaría controlar el móvil?', Opciones)

m = mobiledev

r = roomba (19)

si Prompt == 1

Explorador)

demás

si bien es cierto

pausa (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Paso = PhoneData (2);

Lado = PhoneData (3);

si Lado> 130 || Lado <-130% si el teléfono está volteado hacia abajo, detenga el roomba y salga del bucle

r.stop

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

rotura

elseif Lado> 25 && Lado <40% si el teléfono se gira de lado entre 25 y 40 grados, gire a la izquierda 5 grados

r.turnAngle (-5);

elseif Lado> 40% si el teléfono se gira de lado a más de 40 grados, gire a la izquierda 45 grados

r.turnAngle (-45)

elseif Side-40% si el teléfono se gira de lado entre -25 y -40 grados, gire a la derecha 5 grados

r.turnAngle (5);

elseif Lado <-40% si el teléfono se gira de lado a menos de -40 grados, gire a la izquierda 45 grados

r.turnAngle (45)

fin

% Si el teléfono se sostiene cerca de un vertical, tome una imagen y trácela

si Pitch <-60 && imagen <= 9

r.beep

img = r.getImage;

subtrama (3, 3, imagen)

imshow (img)

fin

% se mueve hacia adelante y hacia atrás según la orientación frontal y posterior

si cabeceo> 15 && cabeceo <35% si cabeceo entre 15 y 35 grados avanza una distancia corta

% obtiene datos ligeros antes de mudarse

litBump = r.getLightBumpers;

si litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% si hay algo frente a la habitaciónba y golpeará si se mueve hacia adelante haga ruido y muestre un mensaje

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

else% move

r.moveDistance (.03);

% Obtener datos de parachoques después de mudarse

Bump = r.getBumpers;

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

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

r.moveDistance (-. 01)

fin

% obtener datos del sensor de desnivel

Cliff = r.getCliffSensors;

si Cliff.left> 1500 || Acantilado.izquierdaFrente> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% si algo activa el sensor de acantilado trátelo como lava y retroceda

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

r.moveDistance (-. 031)

fin

fin

elseif Paso> 35% si el paso es mayor de 35 grados, avance una distancia más larga

% obtiene datos ligeros antes de mudarse

litBump = r.getLightBumpers;

if litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% si hay algo frente a la habitaciónba y golpeará si se mueve hacia adelante haga ruido y muestre un mensaje

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

else% move

r.moveDistance (.3)

% Obtener datos de parachoques después de mudarse

Bump = r.getBumpers;

si Bump.right == 1 || Bump.left == 1 || Bump.front == 1% si golpea algo, haga ruido, muestre un mensaje y retroceda

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

r.moveDistance (-. 01)

fin

% obtiene datos del sensor de acantilado después de moverse

Cliff = r.getCliffSensors;

si Cliff.left> 1500 || Acantilado.izquierdaFrente> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% si algo activa el sensor de acantilado trátelo como lava y retroceda

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

r.moveDistance (-. 31)

fin

fin

elseif Paso-35% si el paso entre -15 y -35 grados retrocede una distancia corta

r.moveDistance (-. 03);

% obtiene datos del sensor de acantilado después de moverse

Cliff = r.getCliffSensors;

si Cliff.left> 1500 || Acantilado.izquierdaFrente> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% si algo activa el sensor de acantilado, trátelo como lava y retroceda

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

r.moveDistance (.04)

fin

elseif Paso-60% si el paso entre -35 y -60 grados retrocede una distancia mayor

r.moveDistance (-. 3)

% obtiene datos del sensor de acantilado después de moverse

Cliff = r.getCliffSensors;

si Cliff.left> 1500 || Acantilado.izquierdaFrente> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% si algo activa el sensor de acantilado, trátelo como lava y retroceda

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

r.moveDistance (.31)

fin

fin

fin

fin

Recomendado: