Table des matières:
- Étape 1: Rassemblez vos documents
- Étape 2: Téléchargez les boîtes à outils Roomba pour MATLAB
- Étape 3: Connectez-vous à votre Roomba
- Étape 4: Choisissez comment vous voulez contrôler votre Roomba
- Étape 5: Conduisez votre Roomba
Vidéo: Transformer votre Roomba en Mars Rover : 5 étapes
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:05
É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
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
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é:
Comment transformer votre Raspberry Pi en passerelle d'accès à distance : 6 étapes
Comment transformer votre Raspberry Pi en passerelle d'accès à distance : Hé les gars ! À la lumière des récents événements, notre équipe de remote.it a travaillé dur pour trouver des idées pour rendre le travail à distance indolore et accessible. Nous avons mis au point l'image de carte SD remote.itPi, qui est une carte SD que vous pouvez mettre dans un nouveau
Comment transformer votre téléphone portable en carte de crédit/débit : 5 étapes
Comment transformer votre téléphone portable en carte de crédit/débit : Mod facile à faire pour une carte de crédit/débit supplémentaire avec puce RFID (c'est-à-dire Paypass). Grâce à cette méthode, vous pourrez localiser et extraire la puce RFID de votre carte de rechange compatible Paypass et la placer dans votre téléphone portable. Cela vous permettra de présenter votre
Comment transformer votre conception en carte PCB professionnelle - Mon approche : 9 étapes
Comment transformer votre conception en carte PCB professionnelle | Mon approche : Dans cet article, je partagerai mon approche pour construire une carte PCB professionnelle en très peu d'étapes détaillées. J'ai également intégré une vidéo de la même chose, vous pouvez la regarder ou continuer à lire le post pour l'explication détaillée.Commençons donc avec le
Contrôlez votre ordinateur avec votre Ipod Touch ou votre Iphone : 4 étapes
Contrôlez votre ordinateur avec votre Ipod Touch ou Iphone : c'est mon premier instructable donc je suis désolé si ce n'est pas le meilleur. Avez-vous déjà eu envie de vous asseoir sur votre canapé ou votre lit et de contrôler vos appareils Mac ou Windows en toute simplicité. Cette instructable vous apprendra comment contrôler complètement votre ordinateur avec votre Ipo
Comment transformer votre téléphone portable LG EnV 2 en un modem commuté portable pour votre ordinateur portable (ou ordinateur de bureau): 7 étapes
Comment transformer votre téléphone portable LG EnV 2 en un modem commuté portable pour votre ordinateur portable (ou ordinateur de bureau): Nous avons tous à un moment donné besoin d'utiliser Internet là où cela n'était tout simplement pas possible, comme dans la voiture , ou en vacances, où ils facturent une somme d'argent coûteuse par heure pour utiliser leur wifi. enfin, j'ai trouvé un moyen simple d'obtenir