Mundarija:

Robotexnik: 8 qadam
Robotexnik: 8 qadam

Video: Robotexnik: 8 qadam

Video: Robotexnik: 8 qadam
Video: Robototexnika darsida o'zi yurar mashina yasadik 2024, Iyul
Anonim
Robotexnik
Robotexnik

Bir oz tasavvur qiling -a, siz Marsga tushgan kosmonavtlardan birisiz. Sizda millionlab ishlar, olish kerak bo'lgan namunalar, tajribalar, yig'iladigan ma'lumotlar bor, lekin ularni tekshirish uchun siz yashaydigan va ishlaydigan modullar atrofida kuniga bir yoki ikki marta yugurishingiz kerak. Kimdir narsaning yaxshi holatda bo'lishini, minglab bo'laklar va qismlarning ishlayotganini va joyida bo'lishini ta'minlashi kerak. Ammo sizni bu vazifalardan ozod qiladigan avtomatlashtirilgan yordamchi bo'lsa -chi? Hamma narsa joyida, ishchi va xavfsiz ekanligiga ishonch hosil qilish uchun modullar ichida aylanib yura oladigan kichik robot bo'lsa -chi?

Robotexnik qutqarish uchun.

Asosan, bu kod Robotexnikni boshqaradi, chunki u er yuzidagi ochiq rangli yo'ldan o'tadi. U yo'lda yoki burilishda kesishgan joyni topmaguncha shu yo'ldan yuradi, bu esa tasvirni qayta ishlash uchun suratga olinishini va Robotexnikning qaerga borishi to'g'risida qaror qabul qilishiga imkon beradi. Yorug'lik va zarba sensori Robotexnikni shikastlanishdan himoya qilish uchun ishlaydi va datchiklar qachon diagnostika suratga olinishini boshqaradi. Robotexnik birgalikda Mar modullarini yaqinlashtirishga mo'ljallangan bo'lib, kosmonavtlarning vaqtini bo'shatib, tekshiruvning asosiy vazifasini bajaradi.

Yana ogohlantirish sifatida, bu davom etayotgan ish. Kod, mavjud bo'lganidek, ishlaydi, lekin u hıçkırıklara ega, ayniqsa, bir nechta bir -biriga o'xshash dasturlar mavjud. Bundan tashqari, ushbu loyiha haqiqiy Mars missiyasida ishlashi uchun aynan shu maqsadda robot ishlab chiqarilishi kerak edi, shuning uchun menimcha, bu "kontseptsiya isboti" qurilishi.

Buni ishga tushirish uchun sizga bir nechta narsa kerak bo'ladi. Sizga qimmatbaho dastur, ushbu dastur uchun qo'llab -quvvatlash paketlari va kodlash bo'yicha ozgina ma'lumot kerak bo'ladi. Men talaba bo'lganim uchun va birinchi qavat kodi berilgan (malina pi uchun), men sozlash haqida aniq gapirmayman. Siz asosiy kod uchun barcha havolalarni quyida topishingiz mumkin. Keling, materiallar ro'yxatiga o'tamiz.

Uskuna

  • Raspberry Pi (biz 3 -versiyadan foydalanganmiz)
  • iRobot ®
  • Raspberry Pi-ni Robotexnikga biriktirib qo'yadigan ushlab turuvchi qurilma
  • Raspberry Pi kamerasi (qanday avtofokus va tasvir aniqligi yaxshi bo'lsa, qanday bo'lishidan qat'i nazar)
  • Robotexnik ustidan kamerani oldinga qaratib turadigan stend yoki g'ilof
  • polga mahkam yopishtirilgan oq (yoki juda och rangli) tasma sifatida ishlatiladigan material. U oldingi ikkita jarlik sensori orasidagi bo'shliqdan biroz kengroq bo'lishi kerak.
  • Juda katta matnli 4 ta belgi (Rasm, O'ng, Orqa va Chap so'zlari yozilgan)
  • Rangli qog'oz varaqlari (kamida uchta, yaxshisi qizil, yashil va ko'k)

Dasturiy ta'minot

  • Matlab (2018a va 2017b ishlatilgan va unchalik farq qilmaganga o'xshaydi)
  • Matlab uchun Raspberry Pi qo'llab -quvvatlash to'plami
  • Matlab -ga ulanish uchun Raspberry Pi kodi (quyida keltirilgan manba kodiga havola)
  • Matlab uchun tasvirni qayta ishlash asboblar qutisi (siz bu loyihani asboblar qutisiz qilolmaysiz)
  • Ixtiyoriy: telefoningizga Matlab Mobile o'rnatilgan, men buni keyinroq tushuntiraman

1 -qadam: uskunani sozlash

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

Bu iRobot® Matlab bilan asosiy darslik bilan bog'lanishini ta'minlash uchun asosiy kodning havolasi. Yuqorida aytganimdek, men bu qismni qamrab olmayman, chunki darslik juda yaxshi tuzilgan. Shuni aytib o'tmoqchimanki, havoladagi amallarni bajarganingizdan so'ng, kiritilgan ma'lumotlarni ko'rib chiqish uchun Matlabning "doc" buyrug'idan foydalanishingiz mumkin. Xususan:

hujjat xonasi

Va yana bir muhim nuqta.

Fayllarni yuqoridagi havoladan yuklaganingizda, ularni yuqoridagi tavsiflangan papkaga qo'ying, chunki Matlab foydalanuvchi yaratgan fayllarni joriy ishchi papkada bo'lishini talab qiladi.

Yo'q, biz kodga o'tamiz.

2 -qadam: Sensorlarni toping

Barcha sensorlarni qidirish
Barcha sensorlarni qidirish
Barcha sensorlarni qidirish
Barcha sensorlarni qidirish

Bir soniya oling va iRobot® tekshiruvini bering. Bularning qaerdaligini bilish yaxshi, shuning uchun siz Robotexnik qabul qilayotgan ma'lumot haqida tasavvurga egasiz va siz nima uchun siz o'rnatgan yo'lni emas, balki aylana aylanayotganini aniqlay olasiz. yoki bo'lmasligi mumkin). Shubhasiz, siz old tomondan katta jismoniy zarba sensorini ko'rasiz. Jarlik sezgichlarini ko'rish biroz qiyinroq, uni ag'darib, old chetiga yaqin to'rtta shaffof plastik oynani qidirish kerak. Yorug'lik datchiklari yanada yashiringan, ammo hozircha yaltiroq qora diapazonda "iRobot®" ning old tomonida yugurish haqida gapirish kifoya.

G'ildirak tushish sensori mavjud, lekin bu loyihada ishlatilmayapti, shuning uchun biz sensorlarni sinab ko'rishga o'tamiz.

3 -qadam: Parametrlarni o'rnatish uchun test

Parametrlarni o'rnatish uchun test
Parametrlarni o'rnatish uchun test

Robo-texnikni o'z ishiga yuborishdan oldin, biz uning o'ziga xos xususiyatlari va sensorlar diapazonini aniqlashimiz kerak. Har bir iRobot® robotning ishlash muddatidan biroz farq qilar ekan, biz sensorlar u ishlaydigan maydonlarni qanday o'qishini aniqlab olishimiz kerak. Buning eng oson yo'li - ochiq rangli yo'lni o'rnatish (Men oq printer qog'ozidan foydalanardim, lekin hamma narsa ochiq rangli bo'ladi) Robotexnik ishlaydigan sirtda.

Matlab -ni ishga tushiring va yangi skriptni oching. Skriptni o'sha papkada saqlang, men ERLIERni ta'rifladim va uni xohlagan narsangizga nomlang (lekin uni qisqa saqlashga harakat qiling, chunki bu faylning nomi funktsiya nomi bo'ladi). Robotni yoqing va buyruqlar oynasiga buyruqlarni yozib, qo'llanmadan Roomba o'zgaruvchisini sozlashdan foydalaning.

Raspberry Pi iRobot® -ga ulanganligiga ishonch hosil qiling va sizning kompyuteringiz bir xil Internetga ulangan. Matlab nima uchun ulanmasligini aniqlash uchun sochingizni oldirish uchun kamroq vaqt sarflaysiz

r = roomba (siz o'rnatgan raqam)

Bunday holda "r" o'zgaruvchisi shart emas, uni xohlaganingizcha chaqirishingiz mumkin, lekin bu bitta harfli o'zgaruvchidan foydalanishni osonlashtiradi.

Yo'l o'rnatilgach va xona muvaffaqiyatli ulangan bo'lsa, bo'lajak Robotexnikni joylashtiring, u erda bir yoki ikkita jarlik sensori yo'lning tepasida. Shubhasiz, bu qolgan ikki yoki uchtasi siz tanlagan yuzaning tepasida.

Endi test sensorlarini buyruq bilan ishga tushiring:

r.testSensorlar

Shuni yodda tutingki, "r." Siz ilgari aniqlagan o'zgaruvchi, shuning uchun "r" bo'lmasa, "r" ni o'zgartiring. siz qaror qilgan narsaga. Bu test sensori ekranini bir tonna ma'lumotga ega qiladi.

Loyihaning asosiy maqsadi yorug'lik bamperlari, bamperlar va jarlik qismlari. Robotexnikni harakatlantiring, datchiklar har xil sirtlarda qanday o'zgarishini yoki yorug'lik moslamasining tampon qiymatlari o'zgarishi uchun ob'ekt qanchalik yaqin bo'lishi kerakligini kuzatib turing. Bu raqamlarni yodda saqlang (yoki yozib qo'ying) Parametrlarni bir soniyada o'rnatish uchun ularga kerak.

4 -qadam: Kodni ishga tushirish

Birinchidan, siz funktsiyani yaratasiz. Men uni "yo'l" deb atadim, lekin yana aytaman, bu ism shart emas, lekin men bundan buyon uni "yo'l" deb atayman.

Kodning yuqori qismi ba'zi foydalanuvchi kiritish variantlarini o'rnatadi. U in listdlgda ishlatiladigan ba'zi ro'yxatlarni tuzadi va keyin ro'yxatning dialog oynasini ochadi. Bu foydalanuvchiga qaysi yo'l rangini tanlashni tanlash imkonini beradi, bu keyinchalik o'ynaydi.

list = {'Qizil', 'Moviy', 'Yashil'}

problist = {'Tasodif, Tasvirni saqlash', 'Komponent joyida emas, Tasvirni saqlash', 'Kutilmoqda, Davom et'} pathcolor = listdlg ('PromptString', 'Yo'l rangini tanlang',… 'SelectionMode', 'yagona', 'ListString', list) prob = 0; driv = ;

"Prob" va "driv" o'zgaruvchilari bu erda e'lon qilinishi kerak, chunki ular funktsiyaning asosiy tsikli ichida ishlatiladi, lekin yana, agar siz bu o'zgaruvchilarning nomini o'zgartirmoqchi bo'lsangiz yoki ro'yxat tanlovini o'zgartirmoqchi bo'lsangiz, yaxshi. siz kodning qolgan qismida izchilsiz.

5 -qadam: Loopning yuqori qismi: jismoniy zarba sezgichlari

Vaqt tsiklining yuqori qismida jismoniy zarba sensori mantig'i mavjud. Asosan, Robotexnik biror narsaga duch kelganda, u to'xtaydi (yoki oldingi zarba sensori uchun u 0,1 metrga orqaga suriladi), keyin o'zini suratga olish uchun joylashtiradi. Keling, avval tezlikni va pozitsiyani boshqarish qismini qamrab olaylik.

Agar siz avvalgi bosqichlarda Robo-Texnikdagi barcha datchiklarni sinovdan o'tkazgan bo'lsangiz, bilasizki, datchiklar mantiqiy qiymatga ega (0 yoki 1), nol esa sensorning normal, bosilmagan holatini bildiradi. Buni kod uchun yodda tuting.

haqiqiy %asosiy, pastadir %esa bamper ma'lumotlarini oladi S = r.getBampers, agar S. chap ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop oxiri

Bu "agar biror narsaga tegsa, to'xtating" asosiy qismi. Agar sensorlar to'qnashuvni aniqlasa, u kodning keyingi qismiga o'tadi, u suratga olish uchun Robotexnik pozitsiyasini o'zgartiradi.

if S.left ~ = 0 %agar pastadir bamper ma'lumotlarini olsa va kamerani rasmga moslashtirsa r.turnAngle (5) pauza (0.5) img = r.getImage %suratga oladi va tasvirni ko'rsatadi (img) %dialog oynasi prob = listdlg PromptString ',' Kutilmagan to'siq topildi, iltimos aniqlang '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pauza (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Kutilmagan to'siq topildi, aniqlang'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pauza (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Kutilmagan to'siq topildi, iltimos aniqlang'…, 'SelectionMode', 'single', 'ListString', problist) oxiri

Asosan, rasm olinganidan so'ng, uchta variant bilan boshqa dialog oynasi paydo bo'ladi. Birinchi ikkita variant fotosuratni belgilangan papkaga saqlaydi, men uni keyinroq yopaman, uchinchi variant esa dialog oynasini yopadi va tsikl davomida davom etadi. Agar siz variantlarni eslay olmasangiz, avvalgi bosqichga qarang.

Endi men zarba sensori qismi va fotosuratni saqlash qismi orasiga kod qismini kiritdim. Bu lightBumper qiymatlarini oladi va haydash tezligini sekundiga 0,025 metrga o'rnatadi (bu juda sekin), bu aslida kerak emas, lekin Robotexnikning narsalarga urilishini va oxir-oqibat jismoniy zarba sezgichlarini eskirishini kamaytiradi.

L = r.getLightBampers, agar L. chap> 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 end

Bu siz kuzatgan (va umid qilamanki, yozib qo'yilgan) qadriyatlar o'ynaydigan qism bo'ladi

"L. (sensori tomoni va yo'nalishi)> 100" men ko'rgan qiymatlarga asoslangan edi, agar sizning kuzatuvlaringiz boshqacha bo'lsa, bu raqamlarni o'zgartiring. Fikr shundan iboratki, agar Robotexnik oldidan bir necha santimetrlik narsani sezsa, u sekinlashadi, bundan ham keraksiz.

Keyingi qism - fotosuratlar keyinchalik saqlanadigan joy.

%agar prob muloqot oynasida birinchi yoki ikkinchi variant tanlangan bo'lsa, prob == 1 %bo'lsa, tasvir saqlanadi, agar loop rasm uchun fayl ma'lumotlarini tuzsa, t = soat tamg'asi bilan yozadi; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); papka = 'E: / UTK / Classes / kuz 18 / ef230 / irobot / images'; fullFileName = to'liq fayl (papka, asosiy nom); imwrite (img, fullFileName) yopish 1 -rasm pauza (2) elseif prob == 2 t = soat; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); papka = 'E: / UTK / Classes / kuz 18 / ef230 / irobot / images'; fullFileName = to'liq fayl (papka, asosiy nom); imwrite (img, fullFileName) yopish 1 -rasm pauza (2) oxiri

Rasmlar saqlanadigan barcha fayl nomlari va joylar ixtiyoriy. Men kirish bosqichida men yaratgan roomba papkasida joylashgan papkani tanladim, lekin u siz xohlagan joyda bo'lishi mumkin. Shuningdek, fotosuratlar vaqt tamg'asi bilan saqlanadi, lekin bu ayniqsa zarur emas (garchi bu Mars missiyasi uchun faraz qilingan bo'lsa ham).

Jismoniy zarba datchiklari bilan biz jarlik sensori va keyingi yo'lga o'tishimiz mumkin.

6 -qadam: Yo'l bo'ylab borish

Jarlik sensorlar kodi ikkita old va yon sensorlar qiymatlarini solishtirish uchun o'rnatiladi. Siz bu qiymatlarni (ehtimol) kuzatilgan qadriyatlaringiz asosida o'zgartirishingiz kerak bo'ladi. Ehtimol, siz bir necha sinovdan so'ng bu qiymatlarni tahrir qilishingiz va ularni atrofdagi yorug'lik, kunduz vaqti (sinov maydoni qanchalik yaxshi yoritilganligiga qarab) yoki sensor oynalar ifloslanganligiga qarab o'zgartirishingiz kerak bo'ladi.

Biz jarlik sensori kodini olishdan oldin, Matlabdan keraksiz ma'lumotlarni tozalash uchun men kiritgan qisqa kod segmenti bor. Bu qism kerak emas, lekin men uni dasturni ishga tushirish uchun zarur bo'lgan xotirani qisqartirish uchun ishlatganman.

clear img clear t clear basename clear fullFileName clear folder

Keyingi kod segmenti - bu loyihaning go'shti. Bu Robotexnikga erga qo'yilgan ochiq rangli yo'ldan borishga imkon beradi. Qisqacha aytganda, u o'zini boshqarishga harakat qiladi, shuning uchun oldingi ikkita jarlik sensori sizning kuzatilgan qiymatlaringizga asoslanib, ostonadan yuqori bo'ladi va dasturga tasvirni qayta ishlash bosqichlarini birozdan keyin boshlashga imkon beradi.

C = r.getCliffSensors %agar pastadir rangli chiziqli bo'lsa (oq), agar C.leftFront> 2000 &&rrightFront> 2000 %to'g'ri yo'l ko'rsatgichi r.setDriveVelocity (driv) elseif C.leftFront robot juda uzoqqa ketsa 2000 %o'ngga buriladi. chap r.turnAngle (-2.5) agar C.leftFront> 2000 && C.rightFront <2000%chapga burilsa, agar robot juda o'ngga o'tsa r.turnAngle (2.5) boshqa C.leftFront <2000 &&rrightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %, agar C.left> 2800 &&C o'ngda <2800 r.turnAngle (2.5) bo'lsa, yo'lda burilish bor yoki yo'qligini tekshiradi. Chapda 2800 r.turnAngle (- 2.5) yo'l tasvirini tanib olish displeyi uchun "joy %" ushlagichining oxiri

Shuni yodda tutingki, men tanlagan o'zgaruvchilar nomlari ixtiyoriy, lekin menimcha, iloji bo'lsa, bitta harfli o'zgaruvchilardan foydalanish hayotni osonlashtiradi

Kodning o'rta qismini tushuntirish uchun, ikkita old sensor yo'l chetidan chiqib ketganda (chorrahaga kelganda yoki yo'lning oxiriga yetganda), uning oldida biror narsa bor -yo'qligini ko'radi.. Buning uchun yo'lning oxirida yoki biron bir chorrahada ob'ektni erga qo'yish kerak bo'ladi.

Suratga olinganidan so'ng, nima qilish kerakligini aniqlash uchun tasvirni tanib olishdan foydalaniladi. Kodning ushbu bo'limida joy egasi ham bor:

yo'l tasvirini aniqlash uchun %joy egasi ('Rasmni olish')

Men buni hozir ishlatdim, chunki men keyingi bosqichda sodir bo'lgan matn va ranglarni qayta ishlash haqida alohida gaplashmoqchi edim.

7 -qadam: tasvirni qayta ishlash

Tasvirni qayta ishlash ikki qismdan iborat. Birinchisi - rangni aniqlash, bu rasmdagi rang intensivligini hisoblab, matnni tanib olishni davom ettirish yoki qilmaslikni hal qiladi. Rangni hisoblash birinchi muloqot oynasida qanday tanlov qilinganiga asoslanadi (men qizil, ko'k, yashil ranglardan foydalanardim, lekin siz xohlagan rangni tanlashingiz mumkin, agar rang intensivligining o'rtacha qiymatlari tan olinsa. Raspberry Pi kamerasi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) qizil = o'rtacha (o'rtacha (imgb (:,,:, 1))); g = o'rtacha (o'rtacha (imgb (:,,:, 2)))); b = o'rtacha (o'rtacha (imgb (:,,, 3))));

Bu intensivlikni tekshirish. Bu keyingi segmentda nima qilishni xohlashini aniqlash uchun ishlatiladi.

agar qizil> g && qizil> b if patcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) agar R. So'zlar {1} == RASM || R. So'zlar {2} == RASM || R. so'zlari {3} == RASM t = soat; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); papka = 'E: / UTK / Classes / kuz 18 / ef230 / irobot / images'; fullFileName = to'liq fayl (papka, asosiy nom); imwrite (img, fullFileName) pauza (2) boshqa R. R. So'zlar {1} == O'ng || R. so'zlari {2} == O'ng || R. Words {3} == RIGHT r.turnAngle (-75) else R. R. Words {1} == LEFT || R. so'zlari {2} == chapda || R. Words {3} == LEFT r.turnAngle (75) else if R. Words {1} == BACK || R. So'zlar {2} == BACK || R. Words {3} == BACK r.turnAngle (110) oxiri boshqa r.turnAngle (110) oxiri

Bu segment birinchi dialog oynasida tanlangan rang kamera ko'rayotgan rangga mos keladimi -yo'qligini hal qiladi. Agar shunday bo'lsa, u matnni tanib olish funktsiyasini bajaradi. Ko'rinib turibdiki, qaysi so'z (Rasm, Orqaga, O'ngga yoki Chapga) paydo bo'ladi, keyin aylanadi (o'ngga va chapga), aylanadi (orqaga) yoki rasm oladi va uni avvalgidek saqlaydi.

Men har xil ranglar uchun kodning faqat bitta qismini taqdim qildim

Kodni ko'k va yashil rangni tan olishiga ruxsat berish uchun kodni nusxa ko'chiring va segmentning yuqori qismidagi mantiqiy tekshirishni o'zgartiring va "pathcolor == (raqam)" ni yuqori dialog oynasidagi ranglar tanloviga mos keladigan qilib o'rnating. kod ko'rsatilgandek, ko'k 2, yashil 3 bo'ladi.

8 -qadam: Tayyor mahsulot

Tayyor mahsulot
Tayyor mahsulot

Endi Robotexnik Mars missiyasi modullarini yaqinlashtirishi va biror narsa joyida bo'lmaganida, kosmonavtlarga xabar berishi kerak.

Yodda tutingki, jarlik sensori va lightBumper -ning barcha qiymatlari siz kuzatgan qiymatlarga o'zgartirilishi kerak. Bundan tashqari, men o'z tajribamdan ko'ra, bu loyihani quyuq rangli zaminda sinab ko'rishni afzal ko'rdim va agar bu qavat aks ettirilmasa, undan ham yaxshiroq. Bu yo'l va pol o'rtasidagi kontrastni oshiradi, shuning uchun Robotexnik unga to'g'ri amal qiladi.

Umid qilamanki, sizga Mars missiyasi uchun kichik yordamchi o'rnatish va qurilishdan zavqlanish yoqdi.

Tavsiya: