İçindekiler:

Robo-Teknisyen: 8 Adım
Robo-Teknisyen: 8 Adım

Video: Robo-Teknisyen: 8 Adım

Video: Robo-Teknisyen: 8 Adım
Video: Savaş Robotu Üretildi! 2024, Temmuz
Anonim
Robo-Teknisyen
Robo-Teknisyen

Bir an için Mars'a inen astronotlardan biri olduğunuzu hayal edin. Yapmanız gereken milyonlarca şey, alınacak numuneler, yapılacak deneyler, toplanacak veriler var, ancak günde bir veya iki kez, bunları incelemek için yaşadığınız yerleşim ve/veya araştırma modüllerini dolaşmanız gerekiyor. Bu gerekli, birisinin o şeyin iyi durumda olduğundan, binlerce parçanın ve parçanın hepsinin çalıştığından ve yerinde olduğundan emin olması gerekiyor. Ama ya sizi bu görevlerden bazılarından kurtaracak otomatik bir yardımcı olsaydı. Ya her şeyin yerinde, çalışır durumda ve güvenli olduğundan emin olmak için modüllerin içinde hareket edebilen küçük bir robot olsaydı.

Robo-Teknisyen kurtarmaya.

Esasen, bu kod, Robo-Teknisyeni yerde açık renkli bir yol izlediği için kontrol eder. Robo-Teknisyen'in bir sonraki nereye gideceğine karar vermesine izin vermek için görüntü işleme için bir fotoğrafın çekilmesini isteyen yolda bir kavşak veya dönüş bulana kadar bu yolu izleyecektir. Hafif çarpma ve çarpma sensörleri, Robo-Teknisyen'i hasardan korumak için çalışır ve çarpma sensörleri, tanı amaçlı bir fotoğrafın ne zaman çekileceğini kontrol eder. Hep birlikte, Robo-Teknisyen, Mar'ın modüllerini yakınlaştırmak, astronotların temel inceleme görevini yaparken zamanını boşaltmak, yalnızca yanlış bir şey bulduğunda insan girdisini aramak için tasarlanmıştır.

Yine bir uyarı olarak, bu devam eden bir çalışmadır. Kod, olduğu gibi çalışır, ancak özellikle birden fazla örtüşen program olduğundan, hıçkırıklara sahiptir. Ayrıca, bu projenin gerçek bir Mars görevinde çalışması için, bu özel amaç için bir robotun yapılması gerekecek, bu yüzden yine sanırım bu bir "kavram kanıtı" yapısı.

Bunu başlatmak ve çalıştırmak için ihtiyaç duyacağınız birkaç şey var. Pahalı bir programa, o program için destek paketlerine ve biraz da kodlama geçmişine ihtiyacınız olacak. Ben bir öğrenci olduğum için ve bazı zemin kat kodları sağlandığından (ahududu pi için), özellikle kurulum hakkında konuşmayacağım. Bu temel kod için tüm bağlantıları aşağıda bulabilirsiniz. Gelelim malzeme listesine.

Donanım

  • Raspberry Pi (3 sürümünü kullandık)
  • iRobot®
  • Raspberry Pi'yi Robo-Teknisyen'e bağlı tutmak için bir tür tutma cihazı
  • Raspberry Pi kamera (otomatik odaklama ve görüntü çözünürlüğü iyi olduğu sürece ne tür olduğu önemli değil)
  • kamerayı Robo-Teknisyen üzerinde ileriye dönük tutmak için bir tür stand veya kılıf
  • beyaz (veya çok açık renkli), zemine sağlam bir şekilde tutulan şerit olarak kullanılacak bir malzeme. Ön iki uçurum sensörü arasındaki boşluktan biraz daha geniş olması gerekiyor.
  • Çok büyük metinli 4 işaret (üzerlerinde GÖRÜNTÜ, SAĞ, GERİ ve SOL sözcükleri basılı)
  • Renkli kağıtlar (en az üç ve tercihen kırmızı, yeşil ve mavi)

Yazılım

  • Matlab (2018a ve 2017b'nin ikisi de kullanıldı ve çok az fark yaratıyor gibi görünüyor)
  • Matlab için Raspberry Pi destek paketi
  • Matlab'a bağlantı için Raspberry Pi kodu (aşağıda verilen kaynak koduna bağlantı)
  • Matlab için Görüntü İşleme Araç Kutusu (bu projeyi araç kutusu olmadan hemen hemen yapamazsınız)
  • OPSİYONEL: Telefonunuzda yüklü olan Matlab Mobile daha sonra anlatacağım

Adım 1: Donanımı Kurma

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Bu, iRobot®'un temel bir öğretici ile birlikte Matlab ile iletişim kurabilmesini sağlayan temel kodun bağlantısıdır. Daha önce de söylediğim gibi, öğretici zaten çok iyi hazırlanmış olduğu için bu özel bölümü ele almayacağım. Bağlantıdaki adımları izledikten sonra, verilen bilgileri incelemek için Matlab'ın "doc" komutunu kullanabileceğinizi belirteceğim. özellikle:

doktor odası

Ve çok önemli bir nokta daha.

Dosyaları yukarıdaki bağlantıdan indirdiğinizde, Matlab, kullanıcı tarafından oluşturulan dosyaların mevcut çalışma klasöründe olmasını gerektirdiğinden, ONLARI YUKARIDA BELİRTTİĞİM KLASÖRE KOYUN.

Bu arada, koda geçelim.

Adım 2: Tüm Bu Sensörleri Bulma

Tüm Bu Sensörleri Bulma
Tüm Bu Sensörleri Bulma
Tüm Bu Sensörleri Bulma
Tüm Bu Sensörleri Bulma

Bir saniye ayırın ve iRobot®'u inceleyin. Bunların nerede olduğunu bilmek güzel, böylece Robo-Teknisyen'in aldığı girdiler hakkında bir fikriniz olur ve kuracağınız yolu takip etmek yerine şeyin neden daireler çizdiğini anlayabilirsiniz (bu, veya olmamış olabilir). Belli ki ön tarafta büyük fiziksel çarpma sensörünü göreceksiniz. Uçurum sensörlerini görmek biraz daha zor, ters çevirmeniz ve ön kenara yakın dört şeffaf plastik pencereyi aramanız gerekecek. Hafif çarpma sensörleri daha da gizlidir, ancak şimdilik parlak siyah bantta canlı olarak fiziksel çarpma sensör çubuğunun ön tarafında bulunan iRobot®'un ön tarafındaki koşuları söylemek yeterli olacaktır.

Tekerlek düşme sensörleri var, ancak bunlar bu projede kullanılmadığı için sensörleri test etmeye devam edeceğiz.

Adım 3: Parametreleri Ayarlamak için Test Etme

Parametreleri Ayarlamak için Test Etme
Parametreleri Ayarlamak için Test Etme

Robo-Teknisyeni işini yapması için göndermeden önce, belirli tuhaflıklarını ve sensör aralıklarını bulmamız gerekiyor. Her iRobot® biraz farklı olduğundan ve robotun ömrü boyunca değiştiğinden, sensörlerin çalışacağı alanları nasıl okuduğunu bulmamız gerekiyor. Bunu yapmanın en kolay yolu size açık renkli bir yol (Robo-Teknisyen'in çalışacağı yüzeyde beyaz yazıcı kağıdı şeritleri kullandım ancak açık renkli herhangi bir şey yapacaktır).

Matlab'ı başlatın ve yeni bir komut dosyası açın. Komut dosyasını DAHA ÖNCE AÇIKLADIĞIM AYNI KLASÖRDE kaydedin ve istediğiniz şekilde adlandırın (yine de kısa tutmaya çalışın, çünkü bu dosyanın adı işlev adı olacaktır). Robotu açın ve komutları komut penceresine yazarak öğreticideki roomba değişken kurulumunu kullanın.

Raspberry Pi'nin iRobot®'a takılı olduğundan ve bilgisayarınızın aynı internet bağlantısına bağlı olduğundan emin olun. Matlab'ın neden bağlanmadığını anlamaya çalışırken saçınızı çekmeye daha az zaman harcarsınız

r = roomba(ayarladığınız numara)

Bu durumda "r" değişkeni gerekli değildir, buna istediğiniz gibi diyebilirsiniz, ancak tek harfli bir değişken kullanmak hayatı kolaylaştırır.

Yol kurulduktan ve oda ba başarıyla bağlandıktan sonra, geleceğin Robo-Teknisyeni'ni bir veya iki uçurum sensörünün yolun üzerinde olduğu yere yerleştirin. Açıkçası bu, diğer iki veya üçünün seçtiğiniz yüzeyin üstünde olduğu anlamına gelir.

Şimdi test sensörlerini şu komutla başlatın:

r.testSensörler

"r." öğesinin daha önce tanımladığınız değişken olduğunu unutmayın, bu nedenle ' r ' değilse ' r'yi değiştirin. neye karar verdiysen ona Bu, bir ton bilgi içeren test sensörü ekranını getirecektir.

Bu proje için ışık Tamponları, tamponlar ve uçurum bölümlerine odaklanın. Sensörlerin farklı yüzeylerde nasıl değiştiğini veya ışıkBumper değerlerinin değişmesi için bir nesnenin ne kadar yakın olması gerektiğini vb. izlediğinizden emin olarak Robo-Teknisyeni hareket ettirin. Bu sayıları aklınızda bulundurun (veya bir yere yazın), çünkü parametrelerinizi bir saniyede ayarlamak için onlara ihtiyacınız var.

Adım 4: Kodu Başlatma

İlk önce bir fonksiyon oluşturacaksınız. Ben ona "yol" dedim ama yine isim gerekli değil ama bundan sonra ona "yol" diyeceğim.

Kodun üst kısmı, bazı kullanıcı giriş seçeneklerini ayarlıyor. in listdlg'de kullanılacak bazı listeler oluşturur ve ardından bir liste iletişim kutusu açar. Bu, kullanıcının daha sonra devreye girecek olan hangi yol rengini takip etmek istediğini seçmesine olanak tanır.

liste = {'Kırmızı', 'Mavi', 'Yeşil'}

problist = {'Kaza, Görüntüyü Kaydet', 'Bileşen Yerinde Değil, Görüntüyü Kaydet', 'Beklenen, Devam Et'} pathcolor = listdlg('PromptString', 'Bir Yol Rengi Seçin', … 'SeçimModu', 'tek', 'ListString', liste) prob = 0; sürücü = ;

"Prob" ve "drive" değişkenleri, işlevin ana while döngüsü içinde kullanılacakları için burada bildirilmelidir, ancak yine, bu değişkenlerden herhangi birini yeniden adlandırmak veya liste seçimlerini değiştirmek isterseniz, sorun değil. kodun geri kalanında tutarlısın.

Adım 5: While Döngüsünün Başı: Fiziksel Darbe Sensörleri

while döngüsünün üst kısmı fiziksel çarpma sensörü mantığını içerir. Temel olarak, Robo-Teknisyen bir şeye çarptığında durur (veya ön çarpma sensörü için 0,1 metre geriye gider), sonra fotoğraf çekmek için kendini konumlandırır. Önce hız ve konum kontrol kısmını kapatalım.

Önceki adımlarda Robo-Teknisyen üzerindeki tüm sensörleri test ettiyseniz, çarpma sensörlerinin, sensörün normal, basılmamış konumunu temsil eden sıfır ile bir mantık değerine (0 veya 1) sahip olduğunu bileceksiniz. Kod için bunu aklınızda bulundurun.

while true %main while döngüsü %alma tampon bilgisi S = r.getBumpers if S.left ~= 0 r.stop elseif S.right ~= 0 r.stop elseif S.front ~= 0 r.stop end

Bu temel "bir şeye çarparsa dur" kısmıdır. Sensörler bir çarpışma algılarsa, kodun bir sonraki bölümüne geçer ve bu, bir fotoğraf çekmek için Robo-Teknisyenin konumunu yeniden ayarlar.

if S.left ~= 0 %if döngüsü tampon bilgisini alır ve kamerayı fotoğraf için hizalar r.turnAngle(5) duraklama(0.5) img = r.getImage %fotoğraf çeker ve görüntüyü görüntüler(img) %dialog box prob = listdlg(' PromptString', 'Beklenmeyen Bir Engel Bulundu, Lütfen Tanımlayın'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) duraklama(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Beklenmeyen Bir Engel Bulundu, Lütfen Tanımlayın'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) duraklama(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Beklenmeyen Bir Engel Bulundu, Lütfen Tanımlayın'…, 'SelectionMode', 'single', 'ListString', problist) end

Temel olarak, görüntü çekildikten sonra, üç seçenekli başka bir iletişim kutusu görünecektir. İlk iki seçenek, fotoğrafı daha sonra ele alacağım belirli bir klasöre kaydeder, üçüncü seçenek ise diyalog kutusunu kapatır ve döngü boyunca devam eder. Seçenekleri hatırlayamıyorsanız, önceki adıma bakın.

Şimdi, çarpma sensörü kısmı ile fotoğraf kaydetme kısmı arasına bir kod bölümü ekledim. Bu, lightBumper değerlerini alır ve sürüş hızını 0,025 metre/saniyeye (çok yavaş) ayarlar; bu aslında gerekli değildir, ancak Robo-Teknisyen'in nesnelere çarpmasını ve nihayetinde fiziksel çarpma sensörlerini yıpratmasını azaltır.

L.left > 100 ise L = r.getLightBumpers || L.solÖn >100 || L.sağÖn >100 || L.right >100 sürücü = 0.025 r.setDriveVelocity(0.025) başka sürücü = 0.1 son

Bu, daha önce gözlemlediğiniz (ve umarım yazdığınız) değerlerin devreye girdiği kısım olacaktır

"L.(sensörün yönü ve yönü) > 100" benim gözlemlediğim değerlere dayanıyordu, bu yüzden gözlemleriniz farklıysa bu sayıları değiştirin. Buradaki fikir, Robo-Teknisyen birkaç santimetre önünde bir şey algılarsa, yavaşlayacaktır, bundan daha fazlası gereksizdir.

Sonraki bölüm, fotoğrafların daha sonra kaydedildiği yerdir.

prob iletişim kutusunda birinci veya ikinci seçenek seçilmişse, eğer prob == ise görüntüyü kaydeder 1 %if döngüsü fotoğraf için dosya bilgisi oluşturur, zaman damgası ile yazar t = saat; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); klasör = 'E:\UTK\Sınıflar\sonbahar 18\ef230\irobot\images'; fullFileName = fullfile(klasör, basename); imwrite(img, fullFileName) close Şekil 1 duraklama(2) elseif prob == 2 t = saat; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); klasör = 'E:\UTK\Sınıflar\sonbahar 18\ef230\irobot\images'; fullFileName = fullfile(klasör, basename); imwrite(img, fullFileName) kapat Şekil 1 duraklama(2) bitiş

Fotoğrafların kaydedildiği tüm dosya adları ve konumlar isteğe bağlıdır. Giriş adımında oluşturduğum roomba klasörünün içine yuvalanmış bir klasör seçtim ama istediğiniz herhangi bir yerde olabilir. Ayrıca fotoğraflar zaman damgasıyla kaydedilir, ancak bu özellikle gerekli değildir (bir Mars görevi için varsayımsal olarak yararlı olsa da).

Kapsanan fiziksel çarpma sensörleri ile uçurum sensörlerine ve takip yoluna geçebiliriz.

Adım 6: Yolu Takip Etme

Uç sensörlerinin kodu, iki ön ve iki yan sensör değerinin değerlerini karşılaştırmak için ayarlanmıştır. Bu değerleri (muhtemelen) gözlemlenen değerlerinize göre değiştirmeniz gerekecektir. Ayrıca muhtemelen birkaç test çalışmasından sonra bu değerleri düzenlemeniz ve ortam ışığına, günün saatine (test alanının ne kadar iyi aydınlatıldığına bağlı olarak) veya sensör pencerelerinin ne zaman kirli olduğuna bağlı olarak değiştirmeniz gerekecektir.

Ancak uçurum sensörü koduna geçmeden önce, Matlab'dan bazı gereksiz verileri temizlemek için eklediğim kısa bir kod parçası var. Bu kısım gerekli değil, ancak programı çalıştırmak için gereken depolama alanını azaltmak için kullandım.

img'yi temizle t taban adını temizle fullFileName klasörü temizle

Bir sonraki kod bölümü, projenin etidir. Robo-Teknisyen'in zemine yerleştirilen açık renkli yolu takip etmesini sağlar. Özetle, gözlemlenen değerlere göre ön iki uçurum sensörünün eşiğin üzerinde olması için kendisini yönlendirmeye çalışır ve programın görüntü işleme adımlarına biraz sonra başlamasına izin verir.

C = r.getCliffSensors %if döngüsü, C.leftFront > 2000 && C.rightFront >2000 %düz yol kılavuzu r.setDriveVelocity(drive) elseif ise C.leftFront 2000 bir renk bandını takip eder(beyaz) sol r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000% robot çok uzağa giderse sola döner r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.solÖn >100 || L.sağÖn >100 || L.right >100 img = r.getImage end %C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(-) ise yolda bir bükülme olup olmadığını kontrol eder 2.5) yol görüntü tanıma disp('GÖRÜNTÜ ALIYOR') için bitiş % yer tutucu bitiş bitiş bitiş

Seçtiğim değişken isimlerinin isteğe bağlı olduğunu unutmayın, ancak yine mümkün olduğunda tek harfli değişkenleri kullanmak hayatı kolaylaştırdığını düşünüyorum

Kodun orta kısmını açıklamak gerekirse, iki ön sensör yolun kenarından çıktığında (bir kavşağa geldiğinde veya yolun sonuna geldiğinde) önünde bir şey olup olmadığına bakar.. Bunun çalışması için yolun sonuna veya herhangi bir kavşakta yere bir nesne yerleştirmeniz gerekir.

Fotoğraf çekildikten sonra ne yapacağını bulmak için görüntü tanıma özelliğini kullanır. Kodun bu bölümünde de bir yer tutucu var:

Yol resmi tanımadisp için % yer tutucu('GÖRÜNTÜ ALIYOR')

Bunu şu an için kullandım çünkü özellikle bir sonraki adımda meydana gelen metin ve renk işleme hakkında konuşmak istedim.

Adım 7: Görüntü İşleme

Görüntü işlemenin iki bölümü vardır. Birincisi, metin tanımaya devam edip etmemeye karar vermek için resimdeki renk yoğunluğunu hesaplayan renk tanımadır. Renk hesaplamaları, başlangıçtaki ilk diyalog kutusunda hangi seçimin yapıldığına dayanmaktadır (kırmızı, mavi, yeşil kullandım, ancak renk yoğunluğunun ortalama değerleri tarafından tanınabildiği sürece istediğiniz renkleri seçebilirsiniz. Ahududu Pi kamera).

img = r.getImage img = imcrop(img, [0 30 512 354]) imgb =imcrop(img, [0 30 512 354]) imgt = imcrop(img, [0 30 512 354]) kırmızı = ortalama(ortalama(imgb(:,:, 1))); g = ortalama(ortalama(imgb(:,:, 2))); b = ortalama(ortalama(imgb(:,:, 3)));

Bu yoğunluk kontrolüdür. Bu, bir sonraki bölümde ne yapmak istediğine karar vermek için kullanılacak.

if red > g && red >b if yol rengi == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == GÖRÜNTÜ || R. Kelimeler{2} == GÖRÜNTÜ || R. Words{3} ==GÖRÜNTÜ t = saat; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); klasör = 'E:\UTK\Sınıflar\sonbahar 18\ef230\irobot\images'; fullFileName = fullfile(klasör, basename); imwrite(img, fullFileName) duraklama(2) elseif R. Words{1} == SAĞ || R. Kelimeler{2} == SAĞ || R. Words{3} ==SAĞ r.turnAngle(-75) elseif R. Words{1} == SOL || R. Kelimeler{2} == SOL || R. Words{3} == SOL r.turnAngle(75) elseif R. Words{1} == GERİ || R. Kelimeler{2} == GERİ || R. Words{3} ==GERİ r.turnAngle(110) end else r.turnAngle(110) end end

Bu segment, ilk diyalog kutusunda seçilen rengin kameranın gördüğü renkle eşleşip eşleşmediğine karar verir. Bunu yaparsa, metin tanımayı çalıştırır. Hangi kelimenin (GÖRÜNTÜ, GERİ, SAĞ veya SOL) göründüğünü ve ardından ya döner (sağ ve sol için), kendi etrafında döner (geri için) ya da resim çeker ve öncekiyle aynı şekilde kaydeder.

Farklı renkler için kodun yalnızca tek bir bölümünü sağladım

Kodun mavi ve yeşili tanımasına izin vermek için, kodu kopyalayın ve segmentin en üstündeki mantık kontrolünü değiştirin ve " pathcolor == (sayı) " öğesini üst iletişim kutusundaki renk seçimlerine karşılık gelecek şekilde ayarlayın (için kod görüntülendiği gibi, mavi 2 ve yeşil 3) olur.

Adım 8: Bitmiş Ürün

Bitmiş ürün
Bitmiş ürün

Şimdi Robo-Teknisyen, Mars görev modüllerini yakınlaştırmalı ve herhangi bir şey yerinde olmadığında astronotlara rapor vermelidir.

Tüm uçurum sensörü ve lightBumper değerlerinin, gözlemlenen değerlerinizle değiştirilmesi gerektiğini unutmayın. Ayrıca, tecrübelerime dayanarak, bu projeyi koyu renkli bir zeminde test etmeyi daha iyi buldum ve zemin yansıtıcı değilse daha da iyi. Bu, yol ile zemin arasındaki kontrastın artmasını sağlar ve bu da Robo-Teknisyen'in onu doğru bir şekilde takip etmesini daha olası kılar.

Umarım Mars görevi için küçük bir yardımcı ayarlamaktan zevk almışsınızdır ve iyi eğlenceler.

Önerilen: