İçindekiler:

Roomba'nızı Mars Gezgini'ne Dönüştürmek: 5 Adım
Roomba'nızı Mars Gezgini'ne Dönüştürmek: 5 Adım

Video: Roomba'nızı Mars Gezgini'ne Dönüştürmek: 5 Adım

Video: Roomba'nızı Mars Gezgini'ne Dönüştürmek: 5 Adım
Video: Daniel Schmachtenberger: Teknoloji Bizi Yok Edecek mi? 2024, Kasım
Anonim
Roomba'nızı Mars Gezgini'ne Dönüştürmek
Roomba'nızı Mars Gezgini'ne Dönüştürmek

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

MATLAB için Roomba Araç Kutularını indirin
MATLAB için Roomba Araç Kutularını indirin
MATLAB için Roomba Araç Kutularını indirin
MATLAB için Roomba Araç Kutularını indirin

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ı Nasıl Kontrol Etmek İstediğinizi Seçin
Roomba'nızı Nasıl Kontrol Etmek İstediğinizi Seçin
Roomba'nızı Nasıl Kontrol Etmek İstediğinizi Seçin
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: