Turinys:

„Wallace“autonominis robotas - 4 dalis - pridėkite IR atstumo ir „Amp“jutiklius: 6 žingsniai
„Wallace“autonominis robotas - 4 dalis - pridėkite IR atstumo ir „Amp“jutiklius: 6 žingsniai

Video: „Wallace“autonominis robotas - 4 dalis - pridėkite IR atstumo ir „Amp“jutiklius: 6 žingsniai

Video: „Wallace“autonominis robotas - 4 dalis - pridėkite IR atstumo ir „Amp“jutiklius: 6 žingsniai
Video: How Artificial Intelligence Can Revolutionize Art and Creativity | Progress Summit 2022 2024, Liepa
Anonim
Image
Image
Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)

Sveiki, šiandien pradedame kitą Wallace galimybių gerinimo etapą. Konkrečiai, mes stengiamės pagerinti jo gebėjimą aptikti ir išvengti kliūčių naudojant infraraudonųjų spindulių atstumo jutiklius, taip pat pasinaudoti „Roboclaw“variklio valdiklio galimybe stebėti srovę ir paversti ją virtualiu (programiniu) jutikliu. Galiausiai apžvelgsime, kaip naršyti be SLAM (vienu metu buvimo vieta ir žemėlapiai) (kol kas), nes robotas dar neturi IMU (inercijos matavimo vieneto) arba ToF (skrydžio laiko) jutiklių.

Naudojant navigaciją, iš pradžių tai bus tik du pagrindiniai tikslai:

  1. vengti kliūčių
  2. atpažinti, kai jis kažkur įstrigo ir nepadaro jokios pažangos. („progresas“reiškia, ar jis judėjo į priekį bet kokiu prasmingu atstumu)
  3. galimas trečiasis tikslas galėtų būti tas, kad jis bandytų lygiuotis į sieną.

Šis projektas prasidėjo nuo robotų rinkinio ir pagrindinių judesių veikimo naudojant klaviatūrą ir ssh ryšį.

Antrasis etapas buvo pridėti pakankamai palaikančių grandinių, kad būtų galima paruošti daugelio jutiklių pridėjimą.

Ankstesniame „Instructable“mes pridėjome keletą HCSR04 akustinių jutiklių, o robotas dabar gali išvengti kliūčių judėdamas po butą.

Nors virtuvėje ir koridoriuje tai gerai veikia su gerais, kietais plokščiais paviršiais, artėjant prie valgomojo jis yra visiškai aklas. Jis negali „matyti“stalo ir kėdės kojų.

Vienas iš patobulinimų gali būti stebėti įprastas variklio sroves, o jei vertės šokteli, robotas turi kažką pataikyti. Tai geras „planas B“ar net C. Tačiau tai tikrai nepadeda naršyti po valgomojo zoną.

(Atnaujinimas: iš tikrųjų kol kas srovės stebėjimas yra A planas važiuojant atbuline eiga, nes laikinai pašalinau ir jutiklius iš galo).

Šio skyriaus vaizdo įrašas yra paskutinis kliūčių vengimo jutiklių etapas.

Vaizdo įraše matote šešis priekinius HCSR04 akustinius jutiklius ir du „Sharp“IR jutiklius. Vaizdo įraše IR jutikliai nelabai pasirodė. Jų stiprybė dažniausiai yra tada, kai robotas atsiduria valgomojo zonoje, nukreiptoje prieš stalą ir kėdės kojas.

Be jutiklių, srovės monitorius pradėjo veikti ypač važiuojant atbuline eiga, jei jis į kažką atsitrenks.

Galiausiai, ji naudoja paskutinių 100 ėjimų istoriją ir keletą pagrindinių analizių, kad atsakytų į vieną klausimą:

"Ar pastaruoju metu buvo pasiekta tikra pažanga į priekį (ar ji įstrigo kai kuriuose pasikartojančiuose šokiuose)?"

Taigi vaizdo įraše, kai matote pasikartojantį į priekį ir atgal, tada jis pasisuka, tai reiškia, kad jis atpažino į priekį ir atgal nukreiptą modelį, taigi bando ką nors kita.

Vienintelis šios programinės įrangos versijos užprogramuotas tikslas buvo siekti nuolatinės pažangos ir stengtis išvengti kliūčių.

1 veiksmas: pridėkite palaikančią grandinę (MCP3008)

Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)
Pridėti palaikančią grandinę (MCP3008)

Prieš pridėdami IR jutiklius, mums reikės sąsajos grandinės tarp jų ir „Raspberry Pi“.

Pridėsime MCP3008 analoginį-skaitmeninį keitiklį. Yra daug internetinių šaltinių, kaip prijungti šį lustą prie „Raspberry Pi“, todėl čia daug nesigilinsiu.

Iš esmės mes turime pasirinkimą. Jei IR jutiklių versija veikia esant 3 V įtampai, tai gali veikti ir MCP3008, tada mes galime tiesiogiai prisijungti prie „Raspberry“.

[3V IR jutiklis] - [MCP3008] - [Raspberrry Pi]

Tačiau mano atveju aš dažniausiai dirbu 5 V, taigi tai reiškia dviejų krypčių lygio perjungiklį.

[5V IR jutiklis]-[MCP3008]-[5V – 3V dvikryptė magistralė]-[Raspberry Pi]

Pastaba: iš IR jutiklio yra tik vienas signalas. Jis eina tiesiai į vieną iš įvesties analoginio signalo linijų MCP3008. Iš MCP3008 yra 4 duomenų linijos, kurias turime prijungti (per dvipusę magistralę) prie „Raspberry Pi“.

Šiuo metu mūsų robotas veiks tik su dviem IR jutikliais, tačiau galime lengvai pridėti daugiau. MCP3008 aštuoni analoginiai įvesties kanalai.

2 žingsnis: Sumontuokite IR jutiklius

Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius
Sumontuokite IR jutiklius

„Sharp“gamina kelis skirtingus IR jutiklius, jie turi skirtingą diapazoną ir aprėpties zoną. Atsitiktinai užsisakiau GP2Y0A60SZLF modelį. Jūsų pasirinktas modelis paveiks jutiklio vietą ir orientaciją. Deja, aš tikrai netyriau, kuriuos jutiklius gauti. Tai buvo labiau „sprendimas, kurį galiu gauti už priimtiną laiką ir kainą iš patikimų šaltinių, iš tų, kuriuos jie siūlo“.

(Atnaujinimas: Tačiau tai gali būti nesvarbu, nes atrodo, kad šie jutikliai yra supainioti dėl vidinio aplinkos apšvietimo. Aš vis dar tiriu šią problemą)

Yra bent trys būdai, kaip šiuos jutiklius pritvirtinti prie roboto.

  1. Padėkite juos fiksuotoje padėtyje, priekyje, šiek tiek nukreipti vienas nuo kito.
  2. Padėkite juos ant servo, priekyje, šiek tiek nukreipti vienas nuo kito.
  3. Padėkite juos fiksuotoje padėtyje, priekyje, bet tolimiausiame ir dešiniajame tolimiausiame kampe, nukreiptais vienas į kitą.

Lyginant 1 pasirinkimą su 3 pasirinkimu, manau, kad #3 apims daugiau susidūrimo zonos. Jei pažvelgsite į vaizdus, #3 pasirinkimą galima padaryti ne tik taip, kad jutiklių laukai sutaptų, bet ir jie galėtų uždengti roboto centrą ir už jo ribų.

Pasirinkus #1, kuo toliau jutikliai yra atskirti vienas nuo kito, tuo daugiau aklos zonos centre.

Galėtume padaryti #2, (aš pridėjau keletą vaizdų su servo galimybe) ir paprašyti juos nuvalyti, ir akivaizdu, kad tai gali apimti didžiąją sritį. Tačiau noriu kuo ilgiau atidėti servo naudojimą bent dėl dviejų priežasčių:

  • Išnaudosime vieną iš „Raspberry Pi“PWM ryšio kanalų. (Tai galima patobulinti, bet vis tiek …)
  • Dabartinis traukimas naudojant servo gali būti reikšmingas
  • Tai papildo aparatinę ir programinę įrangą

Norėčiau palikti servo parinktį vėlesniam laikui, kai pridedate svarbesnius jutiklius, tokius kaip skrydžio laikas (ToF) arba galbūt fotoaparatas.

Yra dar vienas galimas 2 pasirinkimo pranašumas, kurio nėra su kitais dviem pasirinkimais. Šie IR jutikliai gali būti supainioti, priklausomai nuo apšvietimo. Gali būti, kad robotas skaito objektą, kuris yra arti, nors iš tikrųjų nėra artimo objekto. Pasirinkus #3, kadangi jų laukai gali sutapti, abu jutikliai gali registruoti tą patį objektą (skirtingais kampais).

Taigi mes pasirenkame vietą 3.

3 žingsnis: laikas išbandyti

Image
Image

Atlikus visus ryšius tarp „Raspberry Pi“, „MCP3008 ADC“ir „Sharp IR“jutiklių, laikas išbandyti. Tiesiog atlikite paprastą testą, kad įsitikintumėte, jog sistema veikia su naujais jutikliais.

Kaip ir ankstesnėse instrukcijose, aš kiek įmanoma naudoju „wiringPi C“biblioteką. Padeda lengviau. Peržiūrint „wiringPi“svetainę nėra labai akivaizdu, kad yra tiesioginė MCP3004/3008 parama.

Net ir be to, galite tiesiog naudoti SPI plėtinį. Bet nereikia. Jei atidžiai pažvelgsite į „WiringPi“Gordono „git“saugyklą, pamatysite palaikomų lustų sąrašą, iš kurių vienas skirtas MCP3004/3008.

Nusprendžiau pridėti kodą kaip failą, nes nepavyko jo teisingai parodyti šiame puslapyje.

4 žingsnis: virtualus jutiklis - „AmpSensor“

Kuo daugiau skirtingų būdų, kaip robotas gali gauti informaciją apie išorinį pasaulį, tuo geriau.

Šiuo metu robotas turi aštuonis HCSR04 akustinius sonarus (jie nėra šios instrukcijos objektas), o dabar jis turi du „Sharp“IR atstumo jutiklius. Kaip minėta anksčiau, galime pasinaudoti kažkuo kitu: „Roboclaw“variklio srovių jutimo funkcija.

Mes galime įvesti šį užklausą variklio valdikliui į C ++ klasę ir pavadinti „AmpSensor“.

Pridėdami programinei įrangai šiek tiek „gudrybių“, galime stebėti ir koreguoti tipišką srovės traukimą tiesio judesio metu (pirmyn, atgal), taip pat sukimosi judesius (kairėn, dešinėn). Kai žinome tuos stiprintuvų diapazonus, galime pasirinkti kritinę vertę, kad, jei „AmpSensor“iš variklio valdiklio gautų srovės rodmenį, viršijančią šią vertę, žinotume, kad varikliai tikriausiai sustojo, ir tai paprastai rodo, kad robotas atsitrenkė į kažką.

Jei programinei įrangai suteiksime šiek tiek lankstumo (komandinės eilutės rodyklės ir (arba) klaviatūros įvestis veikimo metu), eksperimentuodami galime padidinti / sumažinti „kritinių stiprintuvų“slenkstį, tiesiog leisdami robotui judėti ir atsitrenkti į objektus, tiek tiesiai, tiek sukant.

Kadangi mūsų programinės įrangos naršymo dalis žino judėjimo kryptį, mes galime panaudoti visą šią informaciją, kad galbūt sustabdytume judesį ir pabandytume trumpam pakeisti judėjimą prieš bandydami ką nors kita.

5 žingsnis: navigacija

Šiuo metu robotas turi ribotą realaus pasaulio atsiliepimą. Jis turi keletą artimo atstumo jutiklių, skirtų išvengti kliūčių, ir turi atsarginę metodą, skirtą stebėti srovės traukimą, jei atstumo jutikliai praleidžia kliūtį.

Jame nėra variklių su kodavimo įrenginiais ir nėra IMU (inercinio matavimo vieneto), todėl tampa sunkiau sužinoti, ar jis tikrai juda, ar sukasi, ir kiek.

Nors šiuo metu roboto jutikliuose galima gauti tam tikrą atstumo indikaciją, jų regėjimo laukas yra platus ir yra nenuspėjamas. Akustinis sonaras gali neatspindėti tinkamai; infraraudonųjų spindulių gali supainioti kitas apšvietimas ar net keli atspindintys paviršiai. Nesu tikras, kad verta vargo, kad iš tikrųjų bandytumėte sekti atstumo pokyčius kaip metodą, kad žinotumėte, ar robotas juda, kiek ir kokia kryptimi.

Aš sąmoningai nusprendžiau Nenaudoti mikrovaldiklio, pvz., „Arduino“, nes a) man nepatinka, kad tai yra „psuedo-C ++“aplinka, b) ir kad per daug plėtros išeikvos skaitymo ir rašymo atmintį (?), Ir aš norint sukurti (?) reiktų pagrindinio kompiuterio. O gal aš tiesiog atsitinku kaip „Raspberry Pi“.

Tačiau „Pi“, kuriame veikia „Raspbian“, nėra OS realiuoju laiku, todėl tarp šių jutiklių nestabilumo ir OS neskaitymo tiksliai kiekvieną kartą maniau, kad šių jutiklių paskirtis geriau tinka kliūčių vengimui, o ne faktinis atstumo matavimas.

Toks požiūris atrodė sudėtingas ir ne toks naudingas, kai tam tikslui (vėliau) galime naudoti geresnius ToF (skrydžio laiko) jutiklius (SLAM).

Vienas iš būdų, kurį galime naudoti, yra sekti, kokios judesio komandos buvo išduotos per paskutines X sekundes ar komandas.

Pavyzdžiui, pasakykite, kad robotas įstrigo į kampą įstrižai. Vienas jutiklių rinkinys sako, kad jis yra per arti vienos sienos, todėl jis sukasi, bet tada kitas jutiklių rinkinys sako, kad jis yra per arti kitos sienos. Galų gale jis tiesiog kartoja šoną į šoną.

Aukščiau pateiktas pavyzdys yra tik vienas labai paprastas atvejis. Pridėjus šiek tiek sumanumo, pakartotas modelis gali būti pakeltas į naują lygį, tačiau robotas lieka įstrigęs kampe.

Pavyzdys: vietoj to, kad suktųsi pirmyn ir atgal, jis sukasi viena kryptimi, akimirksniu daro atvirkštinę kryptį (kuri tada išvalo kritinio atstumo rodmenis) ir net jei sukasi kita kryptimi, ji vis tiek eina į priekį tam tikru kampu atgal į kampą, kartojant sudėtingesnį iš esmės to paties dalyko švilpimą.

Tai reiškia, kad mes tikrai galime naudoti komandų istoriją ir pažvelgti, kaip tą informaciją išnaudoti ir panaudoti.

Aš galiu galvoti apie du labai paprastus (pradinius) judėjimo istorijos panaudojimo būdus.

  • ar paskutinis X ėjimų skaičius atitinka Y modelį. Paprastas pavyzdys galėtų būti (ir taip atsitiko) „Į priekį, atgal, pirmyn, atgal,…..“. Taigi yra ši atitikties funkcija, kuri grąžina TRUE (modelis rastas) arba FALSE (nerasta). Jei TRUE, programos naršymo dalyje pabandykite atlikti kitas judesių sekas.
  • ar paskutinis X judesių skaičius yra bendras ar grynasis judėjimas į priekį. Kaip būtų galima nustatyti, kas yra tikrasis judėjimas į priekį? Na.. vienas paprastas palyginimas yra tas, kad paskutiniuose X ėjimuose „FORWARD“pasitaiko daugiau nei „REVERSE“. Bet tai neturi būti vienintelė. Kaip apie tai: „TEISINGA, DEŠINĖ, KAIRĖ, DEŠINĖ“. Tokiu atveju robotas turi pasukti dešinėn, kad išeitų iš kampo arba dėl to, kad priartėjo prie sienos kampu, tai būtų galima laikyti tikra pažanga į priekį. Kita vertus, „Kairė, dešinė, kairė, dešinė …“gali būti nelaikoma tikra pažanga į priekį. Taigi, jei „RIGHT“atsiranda daugiau nei „LEFT“arba „LEFT“atsiranda daugiau nei „RIGHT“, tai gali būti tikra pažanga.

Šios instrukcijos pradžioje minėjau, kad galimas trečiasis tikslas gali būti kvadrato iškėlimas arba derinimas prie sienos. Tačiau tam mums reikia daugiau nei „ar esame arti kažkokio objekto“. Pvz., Jei galime gauti du į priekį nukreiptus akustinius jutiklius (ne šio straipsnio objektas), kad būtų galima pateikti pakankamai gerus ir stabilius atsakymus dėl atstumo, akivaizdu, kad jei vienas praneša daug kitokią vertę nei kitas, robotas priartėjo prie sienos kampu ir galėtų bandyti atlikti manevrus, kad pamatytų, ar šios vertės artėja viena prie kitos (tiesiai į sieną).

6 žingsnis: paskutinės mintys, kitas etapas …

Tikiuosi, kad šis „Instructable“suteikė keletą idėjų.

Pridėjus daugiau jutiklių atsiranda tam tikrų pranašumų ir iššūkių.

Pirmiau minėtu atveju visi akustiniai jutikliai gerai veikė kartu, o programinė įranga buvo gana paprasta.

Kai į mišinį buvo įvesti IR jutikliai, jis tapo šiek tiek sudėtingesnis. Priežastis ta, kad kai kurie jų regėjimo laukai sutapo su akustinių jutiklių matymo laukais. IR jutikliai atrodė šiek tiek jautrūs ir nenuspėjami keičiantis aplinkos apšvietimo sąlygoms, tuo tarpu akustiniams jutikliams apšvietimas įtakos neturi.

Taigi iššūkis buvo, ką daryti, jei akustinis jutiklis mums sako, kad nėra jokių kliūčių, tačiau IR jutiklis yra.

Kol kas po bandymų ir klaidų viskas atiteko šiam prioritetui:

  1. stiprintuvo jutiklis
  2. IR jutiklis
  3. akustinis jutimas

Ką aš padariau, tai tik sumažinti IR jutiklių jautrumą, kad jie aptiktų tik labai artimus objektus (pvz., Artėjančias kėdės kojas)

Iki šiol nebuvo reikalo daryti programinės įrangos, turinčios daug sriegių ar pertraukų, nors kartais susiduriu su kontrolės praradimu tarp „Raspberry Pi“ir „Roboclaw“variklio valdiklio (serijinio ryšio praradimas).

Būtent čia paprastai būtų naudojama „E-Stop“grandinė (žr. Ankstesnius nurodymus). Tačiau kadangi nenoriu (kol kas) susidurti su tuo, kad turėsiu iš naujo nustatyti „Roboclaw“kūrimo metu, o robotas nesiveda taip greitai, ir aš esu šalia, kad jį stebėčiau ir išjungčiau, prijungė „E-Stop“.

Galų gale greičiausiai reikės kelių siūlų.

Tolesni žingsniai…

Ačiū, kad pavyko taip toli.

Aš įsigijau kai kuriuos VL53L1X IR lazerio ToF (skrydžio laiko) jutiklius, todėl greičiausiai tai bus kito „Instructable“tema kartu su servo.

Rekomenduojamas: