Table des matières:

Transformer votre Roomba en Mars Rover : 5 étapes
Transformer votre Roomba en Mars Rover : 5 étapes

Vidéo: Transformer votre Roomba en Mars Rover : 5 étapes

Vidéo: Transformer votre Roomba en Mars Rover : 5 étapes
Vidéo: Documentaire spatiale // Mission Curiosity // Le visiteur de mars 【FR】 2024, Novembre
Anonim
Transformer votre Roomba en Mars Rover
Transformer votre Roomba en Mars Rover

Étape 1: Rassemblez vos documents

Afin de mener à bien ce projet, vous aurez besoin de rassembler les matériaux suivants:

1 Robot Roomba

1 Kit Raspberry Pi

1 caméra vidéo

Accès à MATLAB

Étape 2: Téléchargez les boîtes à outils Roomba pour MATLAB

Téléchargez les boîtes à outils Roomba pour MATLAB
Téléchargez les boîtes à outils Roomba pour MATLAB
Téléchargez les boîtes à outils Roomba pour MATLAB
Téléchargez les boîtes à outils Roomba pour MATLAB

Exécutez le code suivant afin d'installer les boîtes à outils nécessaires pour terminer ce projet.

fonction roombaInstaller

clc;

% liste de fichiers à installer

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

% emplacement à partir duquel installer

options = weboptions('CertificateFilename', ''); % lui dire d'ignorer les exigences de certificat

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

dlgTitle = 'Installation/Mise à jour de Roomba';

% afficher le but et obtenir la confirmation

invite = {

« Ce programme téléchargera ces fichiers EF 230 Roomba: »

''

strjoin(fichiers, ' ')

''

'dans ce dossier:'

''

CD

''

'Voulez-vous continuer? '

};

bip;

yn = questdlg(invite, …

dlgTitre, …

'Oui', 'Non', 'Oui');

if ~strcmp(yn, 'Oui'), return; finir

% obtenir la liste des fichiers existants

fichiers_existants = fichiers(cellfun(@exist, fichiers) > 0);

si ~isempty(existing_files)

% assurez-vous qu'il est vraiment possible de les remplacer

prompt = {'Vous remplacez ce(s) fichier(s): '

''

strjoin(fichiers_existants, ' ')

''

« OK pour remplacer ? »

};

bip;

yn = questdlg(invite, …

dlgTitre, …

'Oui', 'Non', 'Oui');

if ~strcmp(yn, 'Oui'), return; finir

finir

% télécharger les fichiers

cnt = 0;

pour i=1:longueur(fichiers)

f=fichiers{i};

disp(['Téléchargement ' f]);

essayer

url = [serveur f];

websave(f, url, options); % d'options ajoutées pour éviter les erreurs de sécurité

cnt = cnt + 1;

attraper

disp(['Erreur de téléchargement ' f]);

factice = [f '.html'];

if exist(dummy, 'file')==2

supprimer (factice)

finir

finir

finir

si cnt == longueur (fichiers)

msg = 'Installation réussie';

waitfor(msgbox(msg, dlgTitle));

autre

msg = 'Erreur d'installation - voir la fenêtre de commande pour plus de détails';

waitfor(errordlg(msg, dlgTitle));

finir

fin %roombaInstall

Étape 3: Connectez-vous à votre Roomba

Il est maintenant temps de vous connecter à votre Roomba via WiFi. À l'aide de 2 doigts, appuyez simultanément sur les boutons Dock et Spot pour allumer ou réinitialiser votre Roomba. Ensuite, exécutez le code r=roomba(# de votre Roomba) dans la fenêtre de commande de MATLAB pour vous connecter à votre robot. Une fois que vous avez exécuté cette commande, votre Roomba devrait être prêt à fonctionner.

Étape 4: Choisissez comment vous voulez contrôler votre Roomba

Choisissez comment vous voulez contrôler votre Roomba
Choisissez comment vous voulez contrôler votre Roomba
Choisissez comment vous voulez contrôler votre Roomba
Choisissez comment vous voulez contrôler votre Roomba

Vous pouvez contrôler votre Roomba de deux manières: de manière autonome ou en utilisant un smartphone comme contrôleur.

Si vous choisissez de conduire le Roomba de manière autonome, vous devrez utiliser les trois capteurs intégrés: capteurs d'escarpement, capteurs de choc et capteurs de lumière.

Pour utiliser un smartphone, vous devez d'abord connecter votre smartphone à votre ordinateur en suivant les étapes ci-dessous.

REMARQUE: votre ordinateur et votre smartphone doivent être sur le même réseau WiFi pour se connecter correctement !

1. Téléchargez l'application MATLAB depuis l'App Store sur votre appareil.

2. Tapez « connecteur activé » dans votre fenêtre de commande et définissez un mot de passe qui devra être saisi dans les deux appareils.

3. Après cela, MATLAB vous donnera l'adresse IP de votre ordinateur. Vous devez accéder à la page des paramètres de l'application MATLAB sur votre smartphone et ajouter un ordinateur à l'aide de l'adresse IP donnée et du mot de passe que vous avez entré précédemment.

4. Dans la fenêtre de commande de votre ordinateur, tapez le code m=mobiledev et cela devrait initialiser votre smartphone en tant que contrôleur pour votre Roomba.

5. Votre ordinateur et votre smartphone devraient être prêts à fonctionner maintenant.

Étape 5: Conduisez votre Roomba

Maintenant que vous disposez de tous les outils nécessaires pour créer votre Mars Rover, vous êtes prêt à créer votre propre code. Nous avons joint un exemple de code ci-dessous pour la conduite autonome et la conduite contrôlée par smartphone.

Conduite autonome

fonction Explore_modified(r)

% arguments d'entrée: 1 objet roomba, r

% arguments de sortie: aucun

%la description:

La fonction % utilise une boucle while infinie pour permettre l'autonomie

%exploration de l'environnement du bot.

%

%funciton fournit également des instructions au roomba pour savoir quoi faire dans

%les situations suivantes: La(les) roue(s) perd(ent) contact(s) avec le sol, un

%object est détecté devant ou de chaque côté du bot, et un

%une chute soudaine est détectée devant ou de chaque côté du bot.

%

%instructions typiques incluent des commandes de mouvement destinées à maximiser

%exploration ou éviter un danger détecté et commandes pour communiquer

%informations concernant les découvertes des bots (photos), position (graphique), % et état (avertissement bloqué) avec l'utilisateur via matlab et/ou e-mail. Nombreuses

%sound commandes sont ajoutées pour le plaisir.

%configurer les capacités de messagerie

mail = '[email protected]';

mot de passe = 'EF230Roomba';

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

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

setpref('Internet', 'SMTP_Nom d'utilisateur', courrier);

setpref('Internet', 'SMTP_Password', mot de passe);

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.bip('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; %définir la valeur de référence des capteurs d'escarpement

lightBumper_datum = 200; %set light Valeur de référence des capteurs de pare-chocs

pos=[0, 0]; %variable pour le stockage de position avec la donnée initialisée

angle=0; %définir l'angle de référence

réseau=0; % de déplacement angulaire net

i=2; %itérateur pour ajouter des lignes pour positionner la variable de stockage

dist = 0;

r.setDriveVelocity(v, v); %start roomba avance

bien que vrai

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Lumière = r.getLightBumpers;

RandAngle = randi([20, 60], 1); % génère 1 angle aléatoire entre 20 et 60 degrés. Utilisé pour empêcher le bot de rester coincé dans une boucle

%Que faire si une ou plusieurs roues perdent le contact avec le sol:

% arrêter le mouvement, envoyer un e-mail d'avertissement avec une photo de l'environnement, % et demandez à l'utilisateur s'il doit continuer ou attendre de l'aide

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

r.stop

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

r.bip('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, 'coincé.png');

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

imfile='coincé.png';

position=sauvepos(pos);

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

sendmail(mail, 'AIDE !', 'Je suis bloqué sur une falaise !', {imfile, position})

list = {'Continuer', 'Arrêter'};

idx = menu('Que dois-je faire ?', liste);

si idx == 2

Pause

finir

%Que faire si un objet est détecté devant le bot:

%stop, reculer, prendre une photo, alerter l'utilisateur de la découverte

%par e-mail, tournez à 90 degrés et continuez à explorer

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); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

r.bip('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Sib2^, Sib2^, Sib3.5^, G1^, A8^')

img = r.getImage;

imwrite(img, 'FrontBump.png')

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

imfile='FrontBump.png';

position=sauvepos(pos);

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

sendmail(mail, 'Alerte !', 'J'ai trouvé quelque chose !', {imfile, position})

angle = 90;

netangle=netangle+angle;

r.turnAngle(angle);

r.setDriveVelocity(v, v);

%Que faire si un objet est détecté à gauche du bot:

%stop, se tourner vers l'objet, reculer, prendre une photo, alerter

%utilisateur de découverte par e-mail, tournez à 90 degrés et continuez à explorer

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); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

angle=30;

netangle=netangle+angle;

r.turnAngle(angle);

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

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

img = r.getImage;

imwrite(img, 'LeftBump.png')

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

imfile='LeftBump.png';

position=sauvepos(pos);

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

sendmail(mail, 'Alerte !', 'J'ai trouvé quelque chose !', {imfile, position})

angle=-90;

netangle=netangle+angle;

r.turnAngle(angle);

r.setDriveVelocity(v, v);

%Que faire si un objet est détecté à droite du bot:

%stop, se tourner vers l'objet, reculer, prendre une photo, alerter

%utilisateur de découverte par e-mail, tournez à 90 degrés et continuez à explorer

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); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

angle=-30;

netangle=netangle+angle;

r.turnAngle(angle);

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

pause (1.5);

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

img = r.getImage;

imwrite(img, 'RightBump.png')

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

imfile='RightBump.png';

position=sauvepos(pos);

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

sendmail(mail, 'Alerte !', 'J'ai trouvé quelque chose !', {imfile, position});

angle=90;

netangle=netangle+angle;

r.turnAngle(angle);

r.setDriveVelocity(v, v);

%Que faire si une falaise est détectée à gauche du bot:

%stop, reculez, tournez à droite, continuez à explorer

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

r.stop;

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % obtenir la coordonnée x

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %obtenir la coordonnée y

i=i+1;

angle=-RandAngle;

netangle=netangle+angle;

r.turnAngle(angle);

r.setDriveVelocity(v, v);

%Que faire si une falaise est détectée à droite du bot:

%stop, reculez, tournez à gauche, continuez à explorer

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

r.stop;

dist = r.getDistance;

pos(i, 1)= dist * sind(angle); % obtenir la coordonnée x

pos(i, 2)= dist * cosd(angle); %obtenir la coordonnée y

i=i+1;

r.moveDistance(-.125);

angle=RandAngle;

netangle=netangle+angle;

r.turnAngle(angle);

r.setDriveVelocity(v, v);

finir

finir

Contrôleur de smartphone

Options = {'Autonome', 'Contrôle manuel'}

Invite = menu('Comment souhaitez-vous contrôler le rover ?', Options)

m = mobiledev

r = roomba(19)

si Invite == 1

Explorateur)

autre

bien que vrai

pause(.5)

PhoneData=m. Orientation;

Azi=DonnéesTéléphone(1);

Pas=DonnéesTéléphone(2);

Côté=DonnéesTéléphone(3);

si Côté>130 || Côté<-130% si le téléphone est retourné face vers le bas, arrêtez le roomba et quittez la boucle

r.stop

r.bip('C, C, C, C')

Pause

elseif Side>25 && Side<40 %si le téléphone est tourné de côté entre 25 et 40 deg tourner à gauche de 5 deg

r.turnAngle(-5);

sinon si Côté>40 % si le téléphone est tourné sur le côté à plus de 40 degrés, tournez à gauche à 45 degrés

r.turnAngle (-45)

elseif Side-40 %si le téléphone est tourné de côté entre -25 et -40 deg tourner à droite 5 deg

r.turnAngle(5);

elseif Side<-40 %si le téléphone est tourné de côté à moins de -40 deg tourner à gauche à 45 deg

r.turnAngle(45)

finir

% Si le téléphone est tenu près de la verticale, prenez une image et tracez-la

si Pas<-60 && image<=9

r.bip

img=r.getImage;

intrigue secondaire (3, 3, image)

imshow (img)

finir

% avance et recule en fonction de l'orientation avant et arrière

si Pitch>15 && Pitch<35 %si Pitch entre 15 et 35 deg avancer sur courte distance

% obtenir des données de pare-chocs légers avant de se déplacer

litBump=r.getLightBumpers;

si litBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500% si quelque chose est devant le roomba et va frapper s'il avance, faire du bruit et afficher un message

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

sinon %move

r.moveDistance(.03);

%Obtenir des données de bumper après le déplacement

Bump=r.getBumpers;

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

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

r.moveDistance(-.01)

finir

% obtenir les données du capteur de falaise

Cliff=r.getCliffSensors;

si Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1 500 % si quelque chose déclenche le capteur de falaise, traitez-le comme de la lave et sauvegardez

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

r.moveDistance(-.031)

finir

finir

sinon si Pitch>35 %si Pitch supérieur à 35 deg avancer sur une plus longue distance

% obtenir des données de pare-chocs légers avant de se déplacer

litBump=r.getLightBumpers;

si litBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>15% si quelque chose est devant le roomba et va frapper s'il avance, faire du bruit et afficher un message

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

sinon %move

r.moveDistance(.3)

%Obtenir des données de bumper après le déplacement

Bump=r.getBumpers;

si Bump.right==1 || Bump.left==1 || Bump.front==1 %si vous frappez quelque chose, faites du bruit, affichez un message et sauvegardez

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

r.moveDistance(-.01)

finir

% obtenir les données du capteur de falaise après le déplacement

Cliff=r.getCliffSensors;

si Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500% si quelque chose déclenche le capteur de falaise, traitez-le comme de la lave et sauvegardez

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

r.moveDistance(-.31)

finir

finir

sinon si Pitch-35 %si pitch entre -15 et -35 deg reculer courte distance

r.moveDistance(-.03);

% obtenir les données du capteur de falaise après le déplacement

Cliff=r.getCliffSensors;

si Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500% si quelque chose déclenche le capteur de falaise, traitez-le comme de la lave et sauvegardez

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

r.moveDistance(.04)

finir

sinon si Pitch-60 %si pitch entre -35 et -60 deg reculer plus loin

r.moveDistance(-.3)

% obtenir les données du capteur de falaise après le déplacement

Cliff=r.getCliffSensors;

si Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500% si quelque chose déclenche le capteur de falaise, traitez-le comme de la lave et sauvegardez

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

r.moveDistance(.31)

finir

finir

finir

finir

Conseillé: