İçindekiler:
- Adım 1: Malzemelerinizi Toplayın
- 2. Adım: MATLAB için Roomba Araç Kutularını İndirin
- 3. Adım: Roomba'nıza Bağlanın
- Adım 4: Roomba'nızı Nasıl Kontrol Etmek İstediğinizi Seçin
- Adım 5: Roomba'nızı sürün
Video: Roomba'nızı Mars Gezgini'ne Dönüştürmek: 5 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
Adım 1: Malzemelerinizi Toplayın
Bu projeyi tamamlamak için aşağıdaki malzemeleri toplamanız gerekecek:
1 Oda Robotu
1 Ahududu Pi Kiti
1 Video Kamera
MATLAB'a erişim
2. Adım: MATLAB için Roomba Araç Kutularını İndirin
Bu projeyi tamamlamak için gerekli araç kutularını kurmak için aşağıdaki kodu çalıştırın.
işlev odasıbaYükle
clc;
% yüklenecek dosyaların listesi
dosyalar = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% konum yüklenecek
seçenekler = weboptions('SertifikaDosyası', ''); % sertifika gereksinimlerini görmezden gelmesini söyle
sunucu = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba Yükleme/Güncelleme';
% amacı göster ve onay al
komut istemi = {
'Bu program şu EF 230 Roomba dosyalarını indirecektir:'
''
strjoin(dosyalar, ' ')
''
'bu klasöre:'
''
CD
''
'Devam etmek istiyor musun? '
};
bip;
yn = questdlg(istem, …
dlgTitle,…
'Evet', 'Hayır', 'Evet');
eğer ~strcmp(yn, 'Evet'), return; son
% var olan dosyaların listesini al
mevcut_dosyalar = dosyalar(cellfun(@exist, dosyalar) > 0);
eğer ~ boşsa(mevcut_dosyalar)
% onları değiştirmenin gerçekten uygun olduğundan emin olun
komut istemi = {'Bu dosyaları değiştiriyorsunuz:'
''
strjoin(mevcut_dosyalar, ' ')
''
'Değiştirmek için uygun mu?'
};
bip;
yn = questdlg(istem, …
dlgTitle,…
'Evet', 'Hayır', 'Evet');
~strcmp(yn, 'Evet'), ise dönüş; son
son
% dosyaları indir
cnt = 0;
i=1 için:uzunluk(dosyalar)
f=dosyalar{i};
disp(['İndiriliyor' f]);
denemek
url = [sunucu f];
websave(f, url, seçenekler); Güvenlik hatalarını önlemek için % eklenen seçenekler
cnt = cnt + 1;
tutmak
disp(['İndirme hatası' f]);
kukla = [f '.html'];
varsa(sahte, 'dosya')==2
sil (kukla)
son
son
son
if cnt == uzunluk(dosyalar)
msg = 'Kurulum Başarılı';
waitfor(msgbox(msg, dlgTitle));
Başka
msg = 'Kurulum Hatası - ayrıntılar için komut penceresine bakın';
waitfor(errordlg(msg, dlgTitle));
son
%roombaYüklemeyi sonlandır
3. Adım: Roomba'nıza Bağlanın
Şimdi WiFi kullanarak Roomba'nıza bağlanma zamanı. Roomba'nızı açmak veya sıfırlamak için 2 parmağınızı kullanarak Dock ve Spot düğmelerine aynı anda basın. Ardından, robotunuza bağlanmak için MATLAB'ın komut penceresinde r=roomba(# of Roomba'nızın) kodunu çalıştırın. Bu komutu yürüttüğünüzde Roomba'nız kullanıma hazır olmalıdır.
Adım 4: Roomba'nızı Nasıl Kontrol Etmek İstediğinizi Seçin
Roomba'nızı kontrol etmenin iki yolu vardır: bağımsız olarak veya bir akıllı telefonu kumanda olarak kullanmak.
Roomba'yı otonom olarak sürmeyi seçerseniz, üç yerleşik sensörü kullanmanız gerekecektir: uçurum sensörleri, çarpma sensörleri ve ışık sensörleri.
Akıllı telefon kullanmak için öncelikle aşağıdaki adımları takip ederek akıllı telefonunuzu bilgisayarınıza bağlamanız gerekmektedir.
NOT: Doğru şekilde bağlanabilmeniz için bilgisayarınız ve akıllı telefonunuzun aynı WiFi ağında olması gerekir!
1. MATLAB uygulamasını cihazınızdaki uygulama mağazasından indirin.
2. Komut pencerenize "connector on" yazın ve her iki cihaza da girilmesi gereken bir parola belirleyin.
3. Bunu yaptıktan sonra MATLAB size bilgisayarlarınızın IP adresini verecektir. Akıllı telefonunuzdaki MATLAB uygulamasındaki ayarlar sayfasına gitmeniz ve verilen IP adresi ve daha önce girdiğiniz şifreyi kullanarak bir bilgisayar eklemeniz gerekiyor.
4. Bilgisayarınızdaki komut penceresinde m=mobiledev kodunu yazın ve bu, akıllı telefonunuzu Roomba'nız için bir kumanda olarak başlatacaktır.
5. Bilgisayarınız ve akıllı telefonunuz artık kullanıma hazır olmalıdır.
Adım 5: Roomba'nızı sürün
Artık Mars Rover'ınızı oluşturmak için gerekli tüm araçlara sahip olduğunuza göre, kendi kodunuzu oluşturmaya hazırsınız. Aşağıda hem otonom sürüş hem de akıllı telefon kontrollü sürüş için örnek bir kod ekledik.
Otonom Sürüş
işlev Explore_modified(r)
%input argümanları: 1 roomba nesnesi, r
%output argümanları: yok
%tanım:
% işlevi, özerkliğe izin vermek için sonsuz bir while döngüsü kullanır
Botun çevresinin % keşfi.
%
%funciton ayrıca odada ne yapılması gerektiği konusunda roomba'ya talimatlar sağlar.
Aşağıdaki durumlar: Tekerlek(ler) zeminle temasını kaybeder, bir
% nesnesi botun önünde veya her iki yanında algılandı ve bir
Botun önünde veya iki yanında %ani düşüş algılandı.
%
% tipik talimatlar, en üst düzeye çıkarmayı amaçlayan hareket komutlarını içerir
% keşif veya algılanan bir tehlikeden kaçınma ve iletişim kurma komutları
Botların keşifleri (resimler), pozisyon (grafik) ile ilgili %bilgi, Matlab ve/veya e-posta yoluyla kullanıcıyla % ve durumu (bağlı uyarı) belirtin. Birçok
%ses komutları eğlence için eklendi.
% kurulum e-posta yetenekleri
mail = '[email protected]';
şifre = 'EF230Roomba';
setpref('İnternet', 'SMTP_Sunucusu', 'smtp.gmail.com');
setpref('İnternet', 'E_posta', posta);
setpref('İnternet', 'SMTP_Kullanıcı Adı', posta);
setpref('İnternet', 'SMTP_Şifre', şifre);
sahne = 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=odaba(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 =.1;
mirror_datum=2700; % uçurum sensörleri referans değerini ayarla
lightBumper_datum = 200; % set ışık Tampon sensörleri referans değeri
konum=[0, 0]; Veri başlatılmış olarak konum depolama için %değişken
açı=0; %set referans açısı
ağ = 0; %net açı yer değiştirmesi
ben=2; Depolama değişkenini konumlandırmak için satır eklemek için % yineleyici
uzak = 0;
r.setDriveVelocity(v,v); %roomba'yı ilerlemeye başla
doğru iken
Cliff = r.getCliffSensörleri;
Çarpma = r.getTamponlar;
Light = r.getLightBumpers;
RandAçı = randi([20, 60], 1); % 20 ile 60 derece arasında 1 rastgele açı oluşturur. Botun bir döngüye takılmasını önlemek için kullanılır
%Bir veya daha fazla tekerlek zeminle temasını kaybederse ne yapmalı:
% hareketi durdur, çevrenin resmini içeren bir uyarı e-postası gönder, % ve kullanıcıya devam edip etmeyeceğini veya yardım için bekleyip beklemediğini sorun
eğer Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.dur
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
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, 'sıkışmış.png');
%--------------------------
imfile='stuck.png';
pozisyon=savepos(konum);
%---------------------------
sendmail(mail, 'YARDIM!', 'Bir uçurumda mahsur kaldım!', {imfile, pozisyon})
liste = {'Devam', 'Dur'};
idx = menu('Ne yapmalıyım?', liste);
eğer idx == 2
kırmak
son
Botun önünde bir nesne algılanırsa ne yapmalı:
%dur, geri git, resim çek, kullanıcıyı keşif konusunda uyar
%e-posta yoluyla, 90 derece dönün ve keşfetmeye devam edin
elseif Light.leftCenter > lightBumper_datum || Light.rightCenter > lightBumper_datum || Bump.front == 1
r.dur;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
r.bip('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite(img, 'FrontBump.png')
%--------------------------
imfile='FrontBump.png';
pozisyon=savepos(konum);
%---------------------------
sendmail(mail, 'Uyarı!', 'Bir şey buldum!', {imfile, pozisyon})
açı = 90;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.setDriveVelocity(v,v);
Botun solunda nesne algılanırsa ne yapmalı:
%dur, nesneye doğru dön, yedekle, fotoğraf çek, uyar
E-posta yoluyla keşif %kullanıcısı, 90 derece dönün ve keşfetmeye devam edin
elseif Light.leftFront > lightBumper_datum || Light.left > lightBumper_datum || Bump.sol == 1
r.dur;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
açı=30;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
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';
pozisyon=savepos(konum);
%---------------------------
sendmail(mail, 'Uyarı!', 'Bir şey buldum!', {imfile, pozisyon})
açı=-90;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.setDriveVelocity(v,v);
Botun sağında nesne algılanırsa ne yapmalı:
%dur, nesneye doğru dön, yedekle, fotoğraf çek, uyar
E-posta yoluyla keşif %kullanıcısı, 90 derece dönün ve keşfetmeye devam edin
elseif Light.rightFront > lightBumper_datum || Light.right > lightBumper_datum || Bump.sağ == 1
r.dur;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
açı=-30;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
duraklat(1.5);
r.bip('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite(img, 'RightBump.png')
%--------------------------
imfile='RightBump.png';
pozisyon=savepos(konum);
%---------------------------
sendmail(mail, 'Uyarı!', 'Bir şey buldum!', {imfile, pozisyon});
açı=90;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.setDriveVelocity(v,v);
Botun solunda uçurum algılanırsa ne yapmalı:
%dur, geri git, sağa dön, keşfetmeye devam et
elseif Cliff.left < mirror_datum || Cliff.leftFront < mirror_datum
r.dur;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(ağlan); %x koordinatını al
pos(i, 2)= pos(i-1, 2) + uzak * cosd(ağla); %y koordinatını al
i=i+1;
açı=-RandAngle;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.setDriveVelocity(v,v);
Botun sağında uçurum algılanırsa ne yapmalı:
%dur, geri git, sola dön, keşfetmeye devam et
elseif Cliff.right <Reflect_datum || Cliff.rightFront < mirror_datum
r.dur;
dist = r.getDistance;
konum(i, 1)= uzak * nokta(açı); %x koordinatını al
konum(i, 2)= uzak * cosd(açı); %y koordinatını al
i=i+1;
r.moveDistance(-.125);
açı=RandAçı;
ağ=ağzıt+açı;
r.turnAngle(açı);
r.setDriveVelocity(v,v);
son
son
Akıllı Telefon Denetleyicisi
Seçenekler = {'Otonom', 'Manuel Kontrol'}
Prompt = menu('Gezi aracını nasıl kontrol etmek istersiniz?', Seçenekler)
m = mobil dev
r = odaba(19)
İstemi ise == 1
Keşfet(r)
Başka
doğru iken
duraklat(.5)
PhoneData=m. Oryantasyon;
Azi=PhoneData(1);
Pitch=PhoneData(2);
Side=PhoneData(3);
Yan>130 ise || Yan<-130 %Telefon ters çevrilirse, odayı durdurun ve döngüden çıkın
r.dur
r.bip('C, C, C, C')
kırmak
elseif Side>25 && Side<40 % telefon 25 ile 40 derece arasında yana çevriliyse 5 derece sola dönün
r.turnAngle(-5);
elseif Side>%40 telefon 40 derecenin üzerinde yana çevrilirse 45 derece sola dönün
r.dönüşAçı(-45)
elseif Side-40 %Telefon -25 ile -40 derece arasında yana çevriliyse 5 derece sağa dön
r.turnAngle(5);
elseif Side<-40 %Telefon yana çevrilmişse -40 dereceden azsa sola 45 derece dön
r.dönüşAçı(45)
son
%Telefon köşeye yakın tutulursa bir resim çekin ve çizin
Eğer Aralık<-60 && resim<=9
r.bip
img=r.getImage;
alt grafik(3, 3, resim)
imshow(img)
son
%ön ve arka yönelime göre ileri ve geri hareket et
Eğer Perde>15 && Pitch<35 %15 ve 35 derece arasında ise, kısa mesafe ileri doğru hareket edin
%taşımadan önce hafif tampon verilerini al
litBump=r.getLightBumpers;
eğer litBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500 % eğer odanın önünde bir şey varsa ve ileri doğru hareket ederse vuracaksa ses çıkar ve mesaj göster
r.bip('C^^, F#^, C^^, F#^')
başka %hareket et
r.moveDistance(.03);
%Taşıdıktan sonra tampon verilerini al
Bump=r.getBumper'lar;
eğer Bump.right==1 || Bump.left==1 || Tümsek.ön==1
r.bip('A, C, E')
r.moveMesafe(-.01)
son
% uçurum sensörü verilerini al
Cliff=r.getCliffSensörler;
eğer Cliff.left>1500 || Cliff.leftÖn>1500 || Cliff.rightÖn>1500 || Cliff.right>1500 %Eğer bir şey uçurum sensörünü tetiklerse ona lav gibi davranın ve yedekleyin
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveMesafe(-.031)
son
son
elseif Perde>35 %35 daha büyükse 35 derece daha uzun mesafe ileri hareket et
%taşımadan önce hafif tampon verilerini al
litBump=r.getLightBumpers;
eğer litBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>%15 roomba'nın önünde bir şey varsa ve ileri doğru hareket ederse vuracaksa ses çıkar ve mesaj göster
r.bip('C^^, F#^, C^^, F#^')
başka %hareket et
r.moveMesafe(.3)
%Taşıdıktan sonra tampon verilerini al
Bump=r.getBumper'lar;
eğer Bump.right==1 || Bump.left==1 || Bump.front==1 %Eğer bir şeye çarparsan ses çıkar, mesajı göster ve yedekle
r.bip('A, C, E')
r.moveMesafe(-.01)
son
% taşındıktan sonra uçurum sensörü verilerini al
Cliff=r.getCliffSensörler;
eğer Cliff.left>1500 || Cliff.leftÖn>1500 || Cliff.rightÖn>1500 || Cliff.right>1500 %Eğer bir şey uçurum sensörünü tetiklerse ona lav gibi davranın ve yedekleyin
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveMesafe(-.31)
son
son
elseif Pitch-35 % eğer yükseklik -15 ile -35 derece arasında ise kısa mesafe geri git
r.moveDistance(-.03);
% taşındıktan sonra uçurum sensörü verilerini al
Cliff=r.getCliffSensörler;
eğer Cliff.left>1500 || Cliff.leftÖn>1500 || Cliff.rightÖn>1500 || Cliff.right>1500 %Eğer bir şey uçurum sensörünü tetiklerse ona lav gibi davranın ve yedekleyin
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveMesafe(.04)
son
elseif Perde -%60 -35 ile -60 derece arasında ise daha uzun mesafe geri git
r.moveMesafe(-.3)
% taşındıktan sonra uçurum sensörü verilerini al
Cliff=r.getCliffSensörler;
eğer Cliff.left>1500 || Cliff.leftÖn>1500 || Cliff.rightÖn>1500 || Cliff.right>1500 %Eğer bir şey uçurum sensörünü tetiklerse ona lav gibi davranın ve yedekleyin
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveMesafe(.31)
son
son
son
son
Önerilen:
230V AC Ampulü USB Gücüne Dönüştürmek!: 6 Adım (Resimlerle)
230V AC Ampulü USB Gücüne Dönüştürme!: eBay'de titreşen ve ince bir animasyona sahip bu zarif alev efektli ampullere rastladım. Genellikle 85-265V AC şebeke girişi ile çalışırlar, ancak aşağıdaki gibi taşınabilir uygulamalar için sahte yanan bir meşale veya fener bu ideal değil. Değiştiriyorum
Raspberry Pi Kullanan Mars Gezgini: 5 Adım
Raspberry Pi Kullanan Mars Gezgini: Sevgili tüm Büyük Öğreniciler, Mars'ın tüm yüzeyine gidebilen ve Dünya'dan bir şeyler keşfedebilen 6 tekerleğe sahip olan mars gezgini hakkında her zaman merak ediyorum. Ben de dizüstü bilgisayarımda oturarak bir şeyler keşfetmek istiyorum. Şimdi bunu yapmak için doğru zamanı düşünüyorum ve
Raspberry Pi - OpenCV Nesne Takibi ile Otonom Mars Gezgini: 7 Adım (Resimlerle)
Raspberry Pi - OpenCV Nesne Takipli Otonom Mars Gezgini: Bir Raspberry Pi 3, Açık CV nesne tanıma, Ultrasonik sensörler ve dişli DC motorlar ile güçlendirilmiştir. Bu gezici, eğitildiği herhangi bir nesneyi takip edebilir ve herhangi bir arazide hareket edebilir
Roomba İzci Gezgini: 8 Adım
Roomba Scout Explorer: En çok beklenen ve en çok araştırılan Amerikan projelerinden biri olan Mars gezici projeleri, yalnızca araştırma ve etkileşim amacıyla sürekli gelişen yüksek teknolojili otonom sistemlerin üretiminde insan başarıları haline geldi
Windows XP veya Vista'nızı Mac ve Linux'a Dönüştürmek: 10 Adım
Windows XP veya Vista'nızı Mac ve Linux'a Dönüştürme: Bu Eğitilebilir Tablo, Windows bilgisayarınızı nasıl bir mac ve bilgisayara dönüştüreceğinizi ve Linux çalıştıracağınızı gösterecektir. sabit disk alanı (linux istiyorsanız)vista veya XP önerilir - Bunu şu anda yapıyorum