Tabla de contenido:
- Paso 1: reúna sus materiales
- Paso 2: descargue las cajas de herramientas de Roomba para MATLAB
- Paso 3: conéctese a su Roomba
- Paso 4: elija cómo desea controlar su Roomba
- Paso 5: conduzca su Roomba
Video: Convirtiendo su Roomba en un Mars Rover: 5 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:40
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
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
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:
Mars Rover con Raspberry Pi: 5 pasos
Mars Rover con Raspberry Pi: Estimado gran aprendiz, Siempre tengo curiosidad por saber sobre Mars Rover, que tiene 6 ruedas que pueden recorrer toda la superficie de Marte y explorar cosas de la Tierra. También quiero explorar cosas sentándome en mi computadora portátil. Así que ahora creo que es el momento adecuado para hacerlo y
Convirtiendo cualquier automóvil R / C en un automóvil R / C con control de aplicación Bluetooth: 9 pasos
Convirtiendo cualquier automóvil R / C en un automóvil R / C con control de aplicación Bluetooth: este proyecto muestra los pasos para cambiar un automóvil ordinario con control remoto a un automóvil con control Bluetooth (BLE) con la placa de robótica Wombatics SAM01, la aplicación Blynk y la aplicación MIT Inventor. Hay muchos autos RC de bajo costo con muchas características como los faros LED y
Mars Roomba Project UTK: 4 pasos
Mars Roomba Project UTK: DESCARGO DE RESPONSABILIDAD: ESTO SOLO FUNCIONARÁ SI EL ROOMBA ESTÁ CONFIGURADO DE CUALQUIER FORMA ESPECÍFICA, ESTE INSTRUCTABLE FUE CREADO PARA ESTUDIANTES Y FACULTADES DE LA UNIVERSIDAD DE TENNESSEE Y ESTUDIANTES DE LA UNIVERSIDAD DE TENNESSEE Este código se utiliza para configurar un Roomba para que funcione localmente escrito y s
Mars Roomba: 6 pasos
Mars Roomba: este Instructable lo guiará en las instrucciones para operar un robot aspirador Roomba controlado por Raspberry Pi. El sistema operativo que usaremos es a través de MATLAB
Convirtiendo su Windows XP o Vista en una Mac y Linux: 10 pasos
Convirtiendo su Windows XP o Vista en una Mac y Linux: este Instructable le mostrará cómo convertir su PC con Windows en una Mac y una PC, además de ejecutar Linux.- Le recomiendo que tenga al menos 2 GB de RAM - y más de 10GB de espacio en el disco duro (si desea Linux) se recomienda Vista o XP. Estoy haciendo esto en