İçindekiler:

Wallace Otonom Robot - Bölüm 4 - IR Mesafesi ve "Amp" Sensörleri Ekleme: 6 Adım
Wallace Otonom Robot - Bölüm 4 - IR Mesafesi ve "Amp" Sensörleri Ekleme: 6 Adım

Video: Wallace Otonom Robot - Bölüm 4 - IR Mesafesi ve "Amp" Sensörleri Ekleme: 6 Adım

Video: Wallace Otonom Robot - Bölüm 4 - IR Mesafesi ve
Video: Otonom Robotik Sistemlerde Mühendislik Kariyeri - Dr. Oktay Arslan | İTÜRO 2023 2024, Temmuz
Anonim
Image
Image
Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)

Merhaba, bugün Wallace'ın yeteneklerini geliştirmenin bir sonraki aşamasına başlıyoruz. Spesifik olarak, kızılötesi mesafe sensörlerini kullanarak engelleri algılama ve engelleme yeteneğini geliştirmeye çalışıyoruz ve ayrıca Roboclaw motor denetleyicisinin akımı izleme ve bunu sanal (yazılım) bir "sensöre" dönüştürme yeteneğinden faydalanıyoruz. Son olarak, robotta henüz bir IMU (atalet ölçüm birimi) veya ToF (uçuş süresi) sensörleri bulunmadığından, SLAM (eşzamanlı konum ve haritalama) olmadan (şimdilik) nasıl navigasyona bir göz atacağız.

Navigasyon ile, başlangıçta sadece iki ana hedef olacaktır:

  1. engellerden kaçının
  2. bir yere sıkışıp kaldığını ve ilerleme kaydetmediğini anlayın. ("ilerleme", herhangi bir anlamlı mesafe ilerleyip ilerlemediği anlamına gelir)
  3. olası bir 3. hedef, kendisini bir duvara tam olarak hizalamaya çalışmak olabilir.

Bu proje bir robot kitiyle başladı ve klavye ve ssh bağlantısı kullanarak çalışmak için temel hareketler aldı.

İkinci aşama, birçok sensörün eklenmesine hazırlanmak için yeterli destekleyici devre eklemekti.

Önceki Eğitim Tablosunda, birkaç HCSR04 akustik sensör ekledik ve robot artık apartmanda hareket ederken engellerden kaçınabilir.

İyi, sağlam düz yüzeylerle mutfakta ve koridorda iyi iş çıkarsa da, yemek odasına yaklaşırken tamamen kördür. Masa ve sandalye ayaklarını "göremez".

Bir iyileştirme, tipik motor akımlarını takip etmek olabilir ve değerler atlarsa, robot bir şeye çarpmış olmalıdır. Bu iyi bir "B planı" ve hatta C'dir. Ancak bu, yemek alanında gezinmesine gerçekten yardımcı olmuyor.

(Güncelleme: aslında, şimdilik, mevcut izleme, geçici olarak kaldırdığım ve arkadan sensörler olduğu için geri giderken A planıdır).

Bu bölümün videosu, engellerden kaçınma sensörlerinin son aşamasını oluşturmaktadır.

Videoda gördüğünüz, altı ön HCSR04 akustik sensör ve iki Sharp IR sensörüdür. IR sensörleri videoda pek devreye girmedi. Onların gücü, çoğunlukla robotun kendisini yemek alanında masa ve sandalye ayaklarına dönük olarak bulduğu zamandır.

Sensörlere ek olarak, akım monitörü özellikle geri giderken bir şeye çarpma ihtimaline karşı devreye girdi.

Son olarak, son 100 hamlenin geçmişini ve bir soruyu cevaplamak için bazı temel analizleri kullanır:

"Yakın zamanda ileriye doğru gerçek bir ilerleme oldu mu (yoksa tekrar eden bir dansa mı takıldı)?"

Yani videoda tekrarlanan bir ileri-geri gördüğünüzde, dönüyor, bu ileri-geri düzenini tanıdığı anlamına geliyor, bu yüzden başka bir şey deniyor.

Yazılımın bu sürümünün programlanmış tek amacı, sürekli ileriye doğru ilerlemeye çalışmak ve engellerden kaçınmaya çalışmaktı.

Adım 1: Destekleyici Devre Ekle (MCP3008)

Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)
Destekleyici Devre Ekle (MCP3008)

Kızılötesi sensörleri eklemeden önce, onlar ile Raspberry Pi arasındaki arayüz devresine ihtiyacımız olacak.

Bir MCP3008 analogdan dijitale dönüştürücü ekleyeceğiz. Bu çipin Raspberry Pi'ye nasıl bağlanacağı birçok çevrimiçi kaynak var, bu yüzden burada buna fazla girmeyeceğim.

Esasen, bir seçeneğimiz var. Kızılötesi sensörlerin sürümü 3V'ta çalışıyorsa, MCP3008 de çalışabilir ve ardından doğrudan Raspberry'ye bağlanabiliriz.

[3V IR sensörü] - [MCP3008] -- [Raspberry Pi]

Ancak benim durumumda çoğunlukla 5V kullanıyorum, bu da iki yönlü bir seviye değiştirici anlamına geliyor.

[5V IR sensörü] -- [MCP3008] -- [5V-to-3V çift yönlü veri yolu] -- [Raspberry Pi]

Not: IR sensöründen yalnızca bir sinyal çıkışı vardır. Doğrudan MCP3008'in giriş analog sinyal hatlarından birine gider. MCP3008'den Raspberry Pi'ye (çift yönlü veri yolu üzerinden) bağlamamız gereken 4 veri hattı vardır.

Şu anda robotumuz sadece iki IR sensörü kullanarak çalışacak, ancak kolayca daha fazlasını ekleyebiliriz. MCP3008 sekiz analog giriş kanalı.

Adım 2: IR Sensörlerini Monte Edin

IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin
IR Sensörlerini Monte Edin

Sharp birkaç farklı IR sensörü üretir ve bunların farklı menzilleri ve kapsama alanları vardır. GP2Y0A60SZLF modelini sipariş ettim. Seçtiğiniz model, sensörün yerleşimini ve yönünü etkileyecektir. Ne yazık ki benim için tam olarak hangi sensörleri alacağımı araştırmadım. Bu daha çok "onların sunduklarından hangilerini güvenilir bir kaynaktan makul bir zamanda ve fiyatta alabilirim" kararıydı.

(Güncelleme: Ancak, bu sensörler iç ortam aydınlatmasıyla karışıyor gibi göründüğü için bu önemli olmayabilir. Hala bu sorunu araştırıyorum)

Bu sensörleri robota monte etmenin en az üç yolu vardır.

  1. Birbirlerinden biraz uzağa bakacak şekilde, önde sabit bir konuma yerleştirin.
  2. Bunları ön tarafta, birbirinden biraz uzağa bakacak şekilde bir servoya yerleştirin.
  3. Bunları sabit bir konumda, önde, ancak en sol ve en sağ köşelerde, birbirine açılı olacak şekilde yerleştirin.

1. seçeneği 3. seçenekle karşılaştırırken, 3. seçeneğin çarpışma alanının daha fazlasını kapsayacağını düşünüyorum. Resimlere bakarsanız, 3. seçim sadece sensör alanları üst üste gelecek şekilde değil, aynı zamanda robotun merkezini ve dış genişliğinin ötesini de kapsayabilecek şekilde yapılabilir.

1 numaralı seçenekle, sensörler birbirinden ne kadar uzak olursa, merkezde o kadar fazla kör nokta olur.

#2 yapabilirdik (olasılık olarak servo ile bazı resimler ekledim) ve bir tarama yapmalarını sağlayabilirdik ve açıkçası bu en fazla alanı kapsayabilir. Ancak, en az iki nedenden dolayı bir servo kullanımını mümkün olduğunca uzun süre ertelemek istiyorum:

  • Raspberry Pi'deki PWM iletişim kanallarından birini kullanacağız. (Bunu geliştirmek mümkün ama yine de…)
  • Servo ile akım çekişi önemli olabilir
  • Donanım ve yazılıma daha fazlasını ekler

Uçuş Süresi (ToF) veya belki bir kamera gibi daha önemli sensörler eklerken servo seçeneğini daha sonra bırakmak istiyorum.

2. seçeneğin diğer iki seçenekte mevcut olmayan bir başka olası avantajı daha vardır. Bu IR sensörleri, aydınlatmaya bağlı olarak karışabilir. Robot, aslında yakın bir nesne olmadığı halde, çok yakın olan bir nesnenin okumasını alıyor olabilir. #3 seçeneği ile, alanları çakışabileceğinden, her iki sensör de aynı nesneyi (farklı açılardan) kaydedebilir.

Bu yüzden yerleştirme seçimi #3 ile gidiyoruz.

Adım 3: Test Zamanı

Image
Image

Raspberry Pi, MCP3008 ADC ve Sharp IR sensörleri arasındaki tüm bağlantıları yaptıktan sonra test zamanı. Sistemin yeni sensörlerle çalıştığından emin olmak için basit bir test.

Önceki Instructables'ta olduğu gibi, mümkün olduğunca kablolamaPi C kitaplığını kullanıyorum. İşleri kolaylaştırır. WiringPi web sitesini incelerken çok bariz olmayan bir şey, MCP3004/3008 için doğrudan desteğin olmasıdır.

Bu olmadan bile, sadece SPI uzantısını kullanabilirsiniz. Ama gerek yok. Gordon'un wirePi için git deposuna yakından bakarsanız, desteklenen çiplerin bir listesiyle karşılaşırsınız, bunlardan biri MCP3004/3008 içindir.

Kodu bu sayfada düzgün görüntüleyemediğim için bir dosya olarak eklemeye karar verdim.

Adım 4: Bir Sanal Sensör - AmpSensor

Robotun dış dünya hakkında bilgi almasını ne kadar farklı şekilde sağlarsanız, o kadar iyidir.

Robot şu anda sekiz HCSR04 akustik sonar sensörüne sahiptir (bunlar bu Talimatın odak noktası değildir) ve şimdi iki Sharp IR mesafe sensörüne sahiptir. Daha önce belirtildiği gibi, başka bir şeyden de yararlanabiliriz: Roboclaw'ın motor akımlarını algılama özelliği.

Motor denetleyicisine yapılan bu sorgu çağrısını bir C++ sınıfına sarabilir ve buna AmpSensor adını verebiliriz.

Yazılıma bazı "akıllı" özellikler ekleyerek, düz hareket (ileri, geri) ve ayrıca dönme hareketleri (sol, sağ) sırasında tipik akım çekişini izleyebilir ve ayarlayabiliriz. Bu amper aralıklarını bildiğimizde, kritik bir değer seçebiliriz, böylece AmpSensor motor kontrolöründen bu değeri aşan bir akım okuması alırsa, motorların muhtemelen durduğunu biliriz ve bu genellikle robotun çarptığını gösterir. Bir şeyin içine.

Yazılıma biraz esneklik eklersek (komut satırı argümanları ve/veya işlem sırasında klavye girişi), o zaman sadece robotun hareket etmesine ve nesnelere çarpmasına izin vererek deney yaparken "kritik amplifikatör" eşiğini artırabilir / azaltabiliriz, hem düz içeri hem de dönerken.

Yazılımın navigasyon kısmı hareketin yönünü bildiğinden, tüm bu bilgileri belki de hareketi durdurmak ve başka bir şey denemeden önce hareketi kısa bir süre için tersine çevirmek için kullanabiliriz.

Adım 5: Navigasyon

Robot şu anda gerçek dünya geri bildiriminde sınırlıdır. Engellerden kaçınma için birkaç yakın mesafe sensörüne sahiptir ve mesafe sensörlerinin bir engeli ıskalaması durumunda akım çekmeyi izlemek için bir geri dönüş tekniğine sahiptir.

Enkoderli motorları yoktur ve bir IMU'su (atalet-ölçüm-birimi) yoktur, bu nedenle gerçekten hareket edip etmediğini ve ne kadar döndüğünü bilmeyi zorlaştırır.

Şu anda robotta bulunan sensörlerle bir tür mesafe göstergesi elde edilebilse de, görüş alanları geniş ve öngörülemezlik var. Akustik sonar doğru şekilde yansımayabilir; kızılötesi, diğer aydınlatmalar veya hatta birden fazla yansıtıcı yüzey ile karıştırılabilir. Robotun hareket edip etmediğini, ne kadar ve hangi yönde hareket ettiğini bilmek için bir teknik olarak mesafedeki değişimi gerçekten izlemeye çalışmanın zahmete değip değmeyeceğinden emin değilim.

A) Psuedo-C++ ortamını sevmiyorum, b) ve çok fazla geliştirmenin okuma-yazma belleğini (?) geliştirmek için bir ana bilgisayara ihtiyaç duyar (?). Ya da belki Raspberry Pi gibi olurum.

Ancak Raspbian çalıştıran Pi gerçek zamanlı bir işletim sistemi değil, bu nedenle bu sensörlerin kararsızlıkları ve işletim sisteminin her seferinde tam olarak okumaması arasında, bu sensörlerin amacının engellerden kaçınma için daha uygun olduğunu hissettim. gerçek mesafe ölçümü.

Bu yaklaşım, bu amaç için (SLAM) daha iyi ToF (uçuş süresi) sensörlerini (daha sonra) kullanabileceğimiz zaman karmaşık görünüyordu ve çok fazla faydası yoktu.

Kullanabileceğimiz bir yaklaşım, son X saniye veya komutlar içinde hangi hareket komutlarının verildiğinin bir tür kaydını tutmaktır.

Örnek olarak, robotun çapraz olarak bir köşeye baktığını söyleyin. Bir sensör seti ona bir duvara çok yakın olduğunu söylüyor, bu yüzden dönüyor, ama sonra diğer sensör seti ona diğer duvara çok yakın olduğunu söylüyor. Sadece yan yana bir deseni tekrarlamakla biter.

Yukarıdaki örnek sadece çok basit bir durumdur. Bazı zekalar eklemek, tekrarlanan deseni yeni bir düzeye yükseltebilir, ancak robot köşede sıkışıp kalır.

Örnek, yerinde ileri geri dönmek yerine, bir yöne döner, anlık olarak geri gider (bu daha sonra kritik mesafe göstergelerini siler) ve diğer yönde dönse bile, köşeye doğru bir açıyla ileri gider., temelde aynı şeyin daha karmaşık bir pıtırtısını tekrarlamak.

Bu, gerçekten bir komut geçmişi kullanabileceğimiz ve bu bilgileri nasıl kullanacağımıza ve kullanacağımıza bir göz atabileceğimiz anlamına geliyor.

Hareket tarihini kullanmanın çok temel (ilkel) iki yolunu düşünebilirim.

  • son X hamle sayısı için Y modeliyle eşleşiyorlar mı? Basit bir örnek olabilir (ve bu oldu) "İLERİ, GERİ, İLERİ, GERİ, …..". Yani DOĞRU (kalıp bulundu) veya YANLIŞ (bulunamadı) döndüren bu eşleştirme işlevi var. TRUE ise, programın gezinme bölümünde diğer hareket dizilerini deneyin.
  • son X hamle sayısı için genel veya net ileri hareket var mı? Gerçek ileri hareketin ne olduğu nasıl belirlenebilir? Kolay bir karşılaştırma, son X hamle için "İLERİ", "GERİ" den daha fazla gerçekleşir. Ama bu tek olmak zorunda değil. Şuna ne dersiniz: "SAĞ, SAĞ, SOL, SAĞ". Bu durumda, robot bir köşeden çıkmak için sağa dönüş yapmak zorunda kalıyor veya duvara belirli bir açıyla yaklaştığı için, bu gerçek bir ilerleme olarak kabul edilebilir. Öte yandan, "LEFT, RIGHT, LEFT, RIGHT…" gerçek ileri ilerleme olarak değerlendirilmeyebilir. Bu nedenle, eğer "SAĞ", "SOL"dan daha fazla meydana gelirse veya "SOL", "SAĞ"dan daha fazla meydana gelirse, bu gerçek bir ilerleme olabilir.

Bu Eğitilebilir Yazının başlangıcında, olası bir 3. hedefin kare yapmak veya bir duvara hizalamak olabileceğinden bahsetmiştim. Ancak bunun için "bir nesneye yakın mıyız"dan daha fazlasına ihtiyacımız var. Örneğin, mesafeye ilişkin makul derecede iyi, istikrarlı tepkiler vermek için öne bakan iki akustik sensör (bu makalenin odak noktası değil) elde edebilirsek, açıkçası biri diğerinden çok farklı bir değer bildirirse, robot duvara yaklaşmıştır. bir açıyla ve bu değerlerin birbirine yaklaşıp yaklaşmadığını görmek için biraz manevra yapmaya çalışabilir (duvara tam olarak bakacak şekilde).

Adım 6: Son Düşünceler, Sonraki Aşama…

Umarım bu Eğitilebilirlik bazı fikirler vermiştir.

Daha fazla sensör eklemek, bazı avantajlar ve zorluklar getirir.

Yukarıdaki durumda, tüm akustik sensörler birlikte iyi çalıştı ve yazılım açısından oldukça basitti.

IR sensörleri karışıma dahil edildiğinde, biraz daha zorlu hale geldi. Bunun nedeni, bazı görüş alanlarının akustik sensörlerinkilerle örtüşmesidir. IR sensörleri, değişen ortam ışığı koşullarında biraz hassas ve tahmin edilemez görünüyordu, oysa akustik sensörler elbette aydınlatmadan etkilenmiyor.

Bu yüzden zorluk, akustik bir sensör bize hiçbir engel olmadığını, ancak IR sensörü olduğunu söylüyorsa ne yapmamız gerektiğiydi.

Şimdilik, deneme yanılma sonrasında işler şu öncelikte sonuçlandı:

  1. amp-algılama
  2. IR algılama
  3. akustik algılama

Yaptığım şey sadece IR sensörlerinin hassasiyetini azaltmaktı, böylece sadece çok yakın nesneleri (yaklaşmakta olan sandalye ayakları gibi) algılayacaklardı.

Raspberry Pi ve Roboclaw motor kontrolörü arasında ara sıra kontrol kaybıyla (seri iletişim kaybı) karşılaşmama rağmen, şimdiye kadar herhangi bir çoklu iş parçacığı veya kesmeye dayalı yazılım yapmaya gerek olmadı.

Burası E-Stop devresinin (önceki Talimatlara bakın) normal olarak kullanıma gireceği yerdir. Bununla birlikte, geliştirme sırasında Roboclaw'ı sıfırlamak zorunda kalmakla (henüz) uğraşmak istemediğimden ve robot o kadar hızlı gitmediğinden ve onu izlemek ve kapatmak için hazırım, yapmadım. E-Stop'u bağladı.

Sonunda, çoklu iş parçacığı büyük olasılıkla gerekli olacaktır.

Sonraki adımlar…

Buraya kadar getirdiğin için teşekkürler.

Bazı VL53L1X IR lazer ToF (uçuş süresi) sensörleri elde ettim, bu yüzden bir servo ile birlikte bir sonraki Eğitilebilirliğin konusu büyük olasılıkla bu.

Önerilen: