İçindekiler:

IRobot Create-Mars Expedition Rover Mark I: 4 Adım
IRobot Create-Mars Expedition Rover Mark I: 4 Adım

Video: IRobot Create-Mars Expedition Rover Mark I: 4 Adım

Video: IRobot Create-Mars Expedition Rover Mark I: 4 Adım
Video: Mars rover navigation 101: how robots safely drive on the red planet! (SciOdy 2021) 2024, Temmuz
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Bu talimat, size MatLab kodlamasını kullanarak iRobot Create'i nasıl kuracağınızı öğretecektir. Robotunuz, şekilleri ayırt ederek mineral arama, uçurum sensörleri kullanarak engebeli arazide manevra yapma ve canlı bir besleme ile manuel olarak kontrol etme yeteneğine sahip olacak.

Adım 1: Sarf Malzemeleri

Gereçler
Gereçler

Bu proje için Roomba robot elektrikli süpürgenin programlanabilir bir versiyonu olan bir iRobot Create'e ihtiyacınız olacak. Robot, özellikle çarpma sensörleri, uçurum sensörleri ve "Light Bump" sensörleri olmak üzere bu proje için gereken tüm sensörlerle donatılmıştır. Ayrıca kablosuz iletişim, canlı programlama ve canlı video beslemesi için kullanılan bir Raspberry Pi ve video kameraya da ihtiyacınız olacak. Son olarak, Raspberry Pi ve kamera için 3D baskılı bir montaj parçasına ihtiyacınız olacak.

Adım 2: İstenen Sonucu Karşılayacak Kodlama Geliştirin

İstenen Sonucu Karşılamak için Kodlama Geliştirin
İstenen Sonucu Karşılamak için Kodlama Geliştirin

Roomba'nızı bağladıktan sonra, istediğiniz girdilerden sonra istediğiniz çıktıları size verecek bir Matlab kodu oluşturmanız gerekecektir.

Kod burada görülebilir:

%Roomba Projesi%Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal(mheal) %4/11/19 %Problem Açıklama: Mars'ın %keşfi/yerleşimi sırasında insanlara yardım etmek için bir gezici oluşturun. %Çözüm yöntemi: Organik maddeyi kontrol etmek için %ışık tamponları, uçurum sensörleri ve kamera kullanarak organik(yeşil) madde arayın. Gezicinin tamponlar, uçurum sensörleri ve tekerlek yüksekliği sensörleri kullanarak engebeli arazide gezinmesine izin verin. İnsanların geziciyi güvenli bir mesafeden kontrol etmesini ve mineralleri manuel olarak aramasını sağlayın. seçimler = {'HAYAT', 'KABA ARAZİ', 'KULLANICI KONTROLÜ'}; %İletişim menüsünde üç seçenek Ayar = menü('', seçenekler) Ayar>0 ise %Seçenek seçilirse kullanıcı onay seçimlerini isteyin2 = {'Evet', 'Hayır'} %"evet" veya "Hayır" için bir hücre dizisi oluşturun " seçim Onayla = menü(['"' seçimler{Ayar} '" modunu seçtiniz.'], seçimler2) %Kullanıcı ayar seçimini onaylayın eğer Onayla==1 ise Ayar==1 ise %"LIFE" ayarının seçilip seçilmediğini kontrol edin i =0 iken i==0 r.setLEDDigits(num2str('LIFE')) %i=1:100 için LED'de 'LIFE' göster r.setDriveVelocity(0.05) %roomba'yı 0,05 m/sy'de ileriye taşı = r.getCliffSensors % Uçurum sensörü değerlerini "y" hücre yapısında alın ve saklayın l = r.getLightBumpers %Işık çarpma değerlerini alın ve yapı "f"de saklayın l.left>100 %Sol ışık tamponunun kapsanıp kapsanmadığını kontrol edin r.moveDistance(-0.05)) %roomba'yı 0,05 metre geriye taşı r.turnAngle(20) %roomba'yı 20 derece sola döndür img=r.getImage %roomba rect üzerindeki ahududu pasta kamerasından görüntü al = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif l.leftFront>%100 Sol/ön ışık tamponunun kapalı olup olmadığını kontrol edin r.moveDistance(-0.05) %roomba'yı 0,05 metre geriye taşıyın img=r.getImage %roomba'daki ahududu pastası kamerasından görüntü alın ve 'img' değişkeninde saklayın ' doğru = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif l.leftCenter>%100 Sol/orta ışık tamponunun kapalı olup olmadığını kontrol edin r.moveDistance(-0.05) %roomba'yı 0,05 metre geriye taşıyın img=r.getImage %roomba'daki ahududu pastası kamerasından görüntü alın ve 'img' değişkeninde saklayın ' doğru = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif l.rightCenter>100 %Sağ/orta ışık tamponunun kapalı olup olmadığını kontrol edin r.moveDistance(-0.05)%Odayı 0,05 metre geriye taşıyın img=r.getImage %roomba'daki ahududu pastası kamerasından görüntü alın ve 'img değişkeninde saklayın ' doğru = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif l.rightFront>100 %Sağ/ön ışık tamponunun kapalı olup olmadığını kontrol edin r.moveDistance(-0.05)%Odayı 0,05 metre geriye taşıyın img=r.getImage %roomba'daki ahududu pastası kamerasından görüntü alın ve 'img' değişkeninde saklayın ' doğru = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif l.right>100 %Sağ ışık tamponunun kapalı olup olmadığını kontrol edin r.moveDistance(-0.05)%Odayı 0,05 metre geriye taşı r.turnAngle(-20)%Odayı sağa 20 derece döndür img=r.getImage %Şuradan görüntü al rasberry pie kamerayı roomba'ya yerleştirin ve 'img' değişkeninde saklayın rect = [100 0 150 150]; img = imcrop(img, rect) merkeze odaklanmak için resmi %kırp kırmızı = ortalama(mean(img(:,:, 1))) %ortalama kırmızı yoğunluk yeşil = ortalama(mean(img(:,:, 2))) %ortalama yeşil yoğunluk mavi = ortalama(mean(img(:,:, 3))) yeşil ise %ortalama mavi yoğunluk>kırmızı && yeşil>mavi %Bitkinin resimde olup olmadığını kontrol edin d=msgbox(['Yaşam bulundu! ']); %"Yaşam bulundu!" yazan bir mesaj kutusu görüntüle bekle(d); end elseif y.leftÖn<1500 %roomba'nın sol/ön kısmının uçurumdan uzak olup olmadığını kontrol edin r.moveDistance(-0.1, 0.05) %roomba'yı 0,05 m/s'de 0,1 metre geriye taşı r.turnAçı(-5) %Rotate roomba 5 derece CW başkaysa y.sağÖn<1500 %roomba'nın sağ/ön kısmının uçurumdan uzak olup olmadığını kontrol edin r.moveDistance(-0.1, 0.05) %Odayı 0,05 m/s'de 0,1 metre geriye taşı r.dönüşAçı(5) %Rotate roomba 5 derece CCW aksi takdirde y.sol<1000 %roomba'nın sol tarafının uçurumdan uzak olup olmadığını kontrol edin r.moveDistance(-0.05, 0.05) %Odayı 0,05 m/s'de 0,05 metre geriye taşı r.dönüşAçısı(-10) %Odayı 10 derece döndür CW elseif y.right0 %Eğer Devam==1 ise butona basılırsa çalıştır i=0 %Ömrü aramaya devam et başka i=1 %End LIFE modu end end end elseif Ayar==2 %"KABA ARAZİ" ayarının seçilip seçilmediğini kontrol edin i=0 iken i==0 r.setLEDDigits(num2str('RGH')) % i=1:1000 için LED Ekranda 'Kaba' görüntüleyin r.setDriveVelocity(0.05) %roomba sürücü hızını 0,05 m/sx olarak ayarlayın = r.getBumpers % "x" yapısında tampon sensör değerlerini alın ve saklayın y = r.get CliffSensors %x.sağ==1 ise uçurum sensörü değerlerini "y" yapısında alın ve saklayın %Sağ tampona basılıp basılmadığını kontrol edin r.turnAngle(10) %Odayı sola 10 derece döndürün x.left==1 ise %Sol olup olmadığını kontrol edin tampon basılı r.turnAngle(-10) %Odayı sağa 10 derece döndür x.front==1 %Ön tampona basılıp basılmadığını kontrol edin r.turnAngle(20) %Odayı 20 derece sola çevirin x.rightWheelDrop==1 % Sağ tekerleğin düşüp düşmediğini kontrol edin r.turnAngle(-20)%Rotate roomba 20 derece CW yoksa x.leftWheelDrop==1 %Sağ tekerleğin düştüğünü kontrol edin r.turnAngle(20) %Rotate roomba 20 derece CCW başkaysa y.leftÖn< 1500 %roomba'nın ön sol kısmının uçurumdan uzakta olup olmadığını kontrol edin r.moveDistance(-0.05, 0.05) %roomba'yı 0,05 m/s'de 0,05 metre geriye taşı r.dönüşAçısı(-5)%Odayı CW aksi takdirde 5 derece CW döndürün. 1500 %roomba'nın sağ ön kısmının uçurumdan uzakta olup olmadığını kontrol edin r.moveMesafe(-0.05, 0.05)%Odayı 0,05 m/s'de 0,05 metre geriye taşıyın r.dönüşAçısı(5) %Odayı sola 5 derece döndürme aksi takdirde sol. %Sol kısım o olup olmadığını kontrol edin f roomba uçurumdan uzakta r.moveDistance(-0.05, 0.05)%roomba'yı 0,05 m/s'de 0,05 metre geriye taşı r.turnAngle(-10)%Odayı CW 10 derece döndür yoksa Devam==1 ise y.doğru0 %Engebeli araziye devam et else i=1 %End engebeli arazi end end end else %Manuel Mod i=0 r.setLEDDigits(num2str('USER')) %LED Ekranda 'KULLANICI'yı Görüntüle d=msgbox(['Yön Tuşları - Hareket; S - Rover'ı Durdur; ESC - Son Kullanıcı Kontrolü; A - Kaynağı Bul']); bekle(d); iken i==0 r.showCamera %Ahududu pastası kamerası canlı beslemesini ayrı bir pencerede aç D=getkey(1) Kullanıcı tarafından basılan %Retrieve tuşuna, D==30 ise ASCII değerini D değişkeni olarak saklayın "yukarı" okunun olup olmadığını kontrol edin basıldı r.setDriveVelocity(0.1) %roomba'yı 0,2 m/s'de ileri gönder yoksa D==28 %"sol" oka basılıp basılmadığını kontrol edin r.setDriveVelocity(0) %roomba'nın ileri veya geri hareketini durdur r.turnAngle(15, 0.05)%Odayı 0,05 m/s'de sola 45 derece döndür yoksa D==31 %"aşağı" okuna basılıp basılmadığını kontrol et r.setDriveVelocity(-0.1) %Odayı 0,2 m/sn'de geriye doğru hareket ettir yoksa D==29 % "Sağ" oka basılıp basılmadığını kontrol edin r.setDriveVelocity(0) %Odanın ileri veya geri hareketini durdurun r.turnAngle(-15, 0.05) %Odayı 0,05 m/s'de 45 derece CW döndürün yoksa D==27 %Kontrol edin "esc" (escape) tuşuna basıldı i=1 %Döngüden çıkmak için "i" değişkeninin değerini değiştirin d=msgbox('"Kullanıcı Kontrolünden Çıkılıyor"') %Kullanıcıya manuel moddan çıkıldığını bildirin yoksa D== 115 %"s" tuşuna basılıp basılmadığını kontrol edin r.setDriveVelocity(0) % ileri veya geri gidiyorsa D==97 %"a"ya basıldığını kontrol edin image = r.getImage; imwrite(image, 'image.png') W = Classify(image) K = mode(W) eğer K == 3 d=msgbox('Kaynak bulundu') % Dikdörtgen kaynak algılanırsa görüntüle waitfor(d); %Kullanıcının "d" mesaj kutusunu kapatmasını bekle elseif K == 0 d=msgbox('Kaynak Değil:(') % Dikdörtgen kaynak algılanmadıysa göster waitfor(d); %Kullanıcının "d" mesaj kutusunu kapatmasını bekle end else d=msgbox('Geçerli bir anahtar girişi değil.') %Kullanıcı "ayar seç" menüsünü kapatırsa görüntüle waitfor(d); %Kullanıcının "d" mesaj kutusunu kapatmasını bekleyin end waitfor(d); %Bekleyin kullanıcı "d" mesaj kutusunu kapatacak end end else d=msgbox('Hoşçakal') %Seçenekler kapalıysa hoşçakal der end waitfor(d);

3. Adım: Test Etme

Test yapmak
Test yapmak

Kodunuz yazıldıktan sonra Roomba'nızı test etmeniz gerekecektir. Kodunuz doğru gibi görünse de, Roomba'nızın tanımlamasını istediğiniz nesneleri doğru bir şekilde tanımak için, özellikle renk veya şekil için değerlerinizin çoğunun değiştirilmesi gerekecektir.

Adım 4: Görsel Çıktıları Gözlemleyin

Görsel Çıktıları Gözlemleyin
Görsel Çıktıları Gözlemleyin
Görsel Çıktıları Gözlemleyin
Görsel Çıktıları Gözlemleyin

Roomba'nızı görsel çıktılarına göre başarılı bir şekilde programlayıp programlamadığınız çok açık olacaktır.

Çıktılar şunları içerir:

  • Şekil Algılama: Roomba'nın doğru mineralleri bulmak için şekilleri düzgün bir şekilde ayırt etme yeteneği
  • Engebeli Arazi Manevraları: Uçurumlardan veya karanlık alanlardan kaçınır
  • Manuel Mod: Canlı yayın ve Roomba'yı kontrol etme yeteneği
  • Resimler: Minerallerin resimleri
  • Life Found!: Bitkinizin organik yaşamı tanımladığını belirten bir MatLab metin kutusu.

Eğitimimizin sonu bu, yeni Mars Expedition Rover'ınızın keyfini çıkarın!

Önerilen: