Съдържание:

Роботехник: 8 стъпки
Роботехник: 8 стъпки

Видео: Роботехник: 8 стъпки

Видео: Роботехник: 8 стъпки
Видео: Мои Школьные Истории 4 (анимация) 2024, Юли
Anonim
Роботехник
Роботехник

Представете си за секунда, че сте един от астронавтите, кацнали на Марс. Имате милион неща за вършене, проби за вземане, експерименти за провеждане, събиране на данни, но веднъж или два пъти на ден трябва да обикаляте жилищните и/или изследователските модули, в които живеете и работите, за да ги инспектирате. Необходимо е, някой трябва да се увери, че вещта е в добро състояние, че всички хиляди парчета и части работят и са на място. Но какво ще стане, ако имаше автоматизиран помощник, който да ви освободи от някои от тези задължения. Ами ако имаше малък робот, който да може да се движи вътре в модулите, за да се увери, че всичко е на мястото си, работи и е безопасно.

Роботехник на помощ.

По същество този код контролира робота-техник, тъй като следва светло оцветена пътека на земята. Той ще следва този път, докато не намери кръстовище по пътя или завой, което ще подкани снимка за обработка на изображението, за да позволи на робототехника да вземе решение къде да продължи. Сензорите за леки удари и удари работят, за да предпазят робототехника от повреда, а сензорите за удари контролират кога ще бъде направена диагностична снимка. Всички заедно, Robo-Technician е проектиран да увеличава мащабите на модулите на Mar, освобождавайки времето на астронавтите, докато изпълнява основната задача на инспекцията, като призовава човешки принос само когато открие нещо нередно.

Отново като предупреждение, това е незавършена работа. Кодът, както съществува, работи, но има хълцане, особено след като има множество, припокриващи се програми. Също така, за да може този проект да работи в действителна мисия на Марс, ще трябва да бъде създаден робот за тази конкретна цел, така че отново предполагам, че това е "доказателство за концепция".

Има няколко неща, които ще ви трябват, за да стартирате това. Ще ви трябва скъпа програма, пакети за поддръжка за тази програма и малко опит в кодирането. Тъй като съм студент и някои от приземния код са предоставени (за малиновото пи), няма да говоря специално за настройката. Можете да намерите всички връзки за този основен код по -долу. Нека да преминем към списъка с материали.

Хардуер

  • Raspberry Pi (използвахме версия 3)
  • iRobot ®
  • някакъв вид задържащо устройство, което да държи Raspberry Pi прикрепен към Robo-Technician
  • Камера Raspberry Pi (няма значение какъв вид, стига да има добър автофокус и разделителна способност на изображението)
  • някакъв вид стойка или кобур, който да държи камерата обърната напред на Robo-Technician
  • материал, който да се използва като лента, бял (или много светъл цвят), който се държи здраво за пода. Тя трябва да бъде малко по -широка от пространството между предните два сензора за скали.
  • 4 знака с много голям текст (с отпечатани думи IMAGE, RIGHT, BACK и LEFT)
  • Листове цветна хартия (поне три и за предпочитане червени, зелени и сини)

Софтуер

  • Matlab (2018a и 2017b са използвани и изглежда имат малка разлика)
  • Пакет за поддръжка на Raspberry Pi за Matlab
  • Raspberry Pi код за връзка с Matlab (връзка към изходния код, предоставен по -долу)
  • Кутия с инструменти за обработка на изображения за Matlab (почти не можете да направите този проект без инструментариума)
  • ОПЦИОНАЛНО: Matlab Mobile е инсталиран на вашия телефон, което ще обясня по -късно

Стъпка 1: Настройка на хардуера

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

Това е връзката към базовия код, за да се гарантира, че iRobot® може да комуникира с Matlab, заедно с основен урок. Както казах по -рано, няма да покривам тази конкретна част, тъй като урокът е вече много добре изложен. Ще спомена, че след като изпълните стъпките на връзката, можете да използвате командата "doc" на Matlab, за да прегледате включената информация. По -конкретно:

doc roomba

И още един много важен момент.

Когато изтегляте файловете от връзката по -горе, ПОСТАВЕТЕ ГИ В ПАПКАТА, КОЯТО ОПИСАХ ГОРЕ, тъй като Matlab изисква генерираните от потребителя файлове да бъдат в текущата работна папка.

След като това се отклони, нека преминем към кода.

Стъпка 2: Намиране на всички тези сензори

Намиране на всички тези сензори
Намиране на всички тези сензори
Намиране на всички тези сензори
Намиране на всички тези сензори

Отделете секунда и прегледайте iRobot®. Добре е да знаете къде се намират, за да имате представа за входните данни, които Robo-Technician получава, и ще можете да разберете защо нещото се върти в кръг, вместо да следвате пътя, който ще настроите (това може да или може и да не се е случило). Очевидно ще видите големия физически сензор за удари отпред. Сензорите за скалите са малко по -трудни за гледане, ще трябва да го обърнете и да потърсите четирите прозрачни пластмасови прозореца близо до предния ръб. Сензорите за леки удари са още по -скрити, но засега ще бъде достатъчно да се каже на живо в лъскавата черна лента, която се движи около предната част на iRobot®, която е отпред на физическата лента на сензора за удари.

Има сензори за падане на колелата, но те не се използват в този проект, така че ще преминем към тестване на сензорите.

Стъпка 3: Тестване за задаване на параметри

Тестване за задаване на параметри
Тестване за задаване на параметри

Преди да можем да изпратим Роботехника да си свърши работата, трябва да разберем неговите специфични странности и диапазони на сензорите. Тъй като всеки iRobot® е малко по -различен и се променя през целия живот на робота, трябва да разберем как сензорите четат областите, в които ще работи. Най -лесният начин да направите това е да настроите светло оцветена пътека (Използвах ленти от бяла хартия за принтер, но всичко светло оцветено ще направи) върху повърхността, която Robo-Technician ще работи.

Стартирайте Matlab и отворете нов скрипт. Запазете скрипта В СЪЩАТА ПАПКА, ОПИСАНА МИ ПО -РАНА и го кръстете както искате (опитайте се да го съкратите, тъй като името на този файл ще бъде името на функцията). Включете робота и използвайте настройката на променливата roomba от урока, като въведете командите в командния прозорец.

Уверете се, че Raspberry Pi е включен в iRobot® и компютърът ви е свързан към същата интернет връзка. Ще отделите по -малко време за издърпване на косата си, опитвайки се да разберете защо Matlab няма да се свърже

r = roomba (номер, който сте настроили)

Променливата "r" при това обстоятелство не е необходима, можете да я наричате както искате, но тя прави живота по -лесен за използване на променлива с една буква.

След като пътят е настроен и roomba е успешно свързан, поставете бъдещия робо-техник там, където един или два от сензорите за скали са над върха на пътеката. Очевидно това означава, че другите две или три са над повърхността, която сте избрали.

Сега стартирайте тестовите сензори с командата:

r.testSensors

Имайте предвид, че „r.“Е променливата, която сте дефинирали по -рано, така че ако не е „r“, променете „r“. за каквото и да решите. Това ще изведе тестовия сензорен екран с много информация.

За този проект се съсредоточете върху светлинните брони, брони и секциите на скалите. Преместете Robo-Technician наоколо, като внимавате да наблюдавате как сензорите се променят върху различни повърхности или колко близо трябва да бъде обект, за да се променят стойностите на ligthBumper и т.н. Имайте предвид тези числа (или ги запишете), защото ще имате нужда от тях, за да зададете вашите параметри за секунда.

Стъпка 4: Стартиране на кода

Първо ще конструирате функция. Нарекох го "път", но отново името не е необходимо, но отсега нататък ще го наричам "път".

Горната част на кода настройва някои опции за въвеждане от потребителя. Той изгражда някои списъци, които ще се използват в in listdlg и след това извежда диалогов прозорец със списък. Това позволява на потребителя да избере цвета на пътя, който иска да следва, който влиза в игра по -късно.

list = {'Червен', 'Син', 'Зелен'}

problist = {'Casualty, Save Image', 'Component Out Place, Save Image', 'Expected, Continue'} pathcolor = listdlg ('PromptString', 'Select a Path Color', … 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Променливите "prob" и "driv" трябва да бъдат декларирани тук, тъй като те ще се използват вътре в основния цикъл while на функцията, но отново, ако искате да преименувате някоя от тези променливи или да промените избора на списъка, добре е, стига вие сте последователни в останалата част от кода.

Стъпка 5: Горната част на цикъла „Докато“: Физически сензори за удар

Горната част на цикъла while съдържа физическата логика на сензора за удар. По принцип, когато робототехникът се сблъска с нещо, което спира (или за предния сензор за удар, той прави резервно копие на 0,1 метра), след това се позиционира, за да направи снимка. Нека първо покрием частта за контрол на скоростта и позицията.

Ако сте тествали всички сензори на Robo-Technician в предишните стъпки, ще знаете, че сензорите за удар имат логическа стойност (0 или 1) с нула, представляваща нормалното, не натиснато положение на сензора. Имайте това предвид за кода.

докато true %main while loop %получава информация за бронята S = r.getBumpers if S.left ~ = 0 r.stop elseif S. right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Това е основната част „ако удари нещо, спри“. Ако сензорите все пак открият сблъсък, той преминава към следващата част от кода, която пренастройва позицията на робота-техник, за да получи снимка.

ако S.left ~ = 0 %ако цикълът взема информация за бронята и подравнява камерата за снимка r.turnAngle (5) пауза (0.5) img = r.getImage %прави снимка и показва изображение (img) %диалогов прозорец prob = listdlg (' PromptString ',' Намерено е неочаквано препятствие, моля, идентифицирайте '…,' SelectionMode ',' single ',' ListString ', problist) elseif S. right ~ = 0 r.turnAngle (-5) пауза (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Намерено е неочаквано препятствие, моля, идентифицирайте'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) пауза (0.5) img = r.getImage изображение (img) prob = listdlg ('PromptString', 'Намерено неочаквано препятствие, моля, идентифицирайте'…, 'SelectionMode', 'single', 'ListString', problist) край

По принцип, след като изображението е направено, ще се появи друг диалогов прозорец с три опции. Първите две опции записват снимката в определена папка, която ще покрия по -късно, докато третата опция просто затваря диалоговия прозорец и продължава през цикъла. Ако не помните опциите, погледнете предишната стъпка.

Сега вмъкнах кодова секция между частта от сензора за удари и частта за запазване на снимки. Това взема стойности на lightBumper и задава скоростта на задвижване на 0.025 метра/секунда (много бавно), което всъщност не е необходимо, но намалява робо-техника, който се блъска в нещата и в крайна сметка износва физическите сензори за удари.

L = r.getLightBumpers, ако L.наляво> 100 || L.leftFront> 100 || L. rightFront> 100 || L. право> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 край

Това би била частта, в която ценностите, които сте наблюдавали (и надявам се записали) по -рано, влизат в игра

"L. (страна и посока на сензора)> 100" се основава на наблюдаваните от мен стойности, така че ако вашите наблюдения са различни, променете тези числа. Идеята е, че ако робототехникът усети нещо на няколко сантиметра пред себе си, то ще се забави, повече от това е ненужно.

Следващата част е мястото, където снимките се запазват за по -късно.

%, ако първата или втората опция е избрана в диалоговия прозорец, записва изображението, ако prob == 1 %, ако цикълът изгражда информация за файла за снимка, пише с времева маркировка t = часовник; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = пълен файл (папка, базово име); imwrite (img, fullFileName) close Фигура 1 пауза (2) elseif prob == 2 t = часовник; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = пълен файл (папка, базово име); imwrite (img, fullFileName) затваряне Фигура 1 пауза (2) край

Всички имена на файлове и места, където са записани снимките, не са задължителни. Избрах папка, която е вложена в папката roomba, която създадох в стъпката за въвеждане, но тя може да бъде където и да изберете. Също така снимките се запазват с времева отметка, но това не е особено необходимо (макар че би било хипотетично полезно за мисия на Марс).

С покрити физически сензори за удари, можем да преминем към сензорите за скалите и следващата пътека.

Стъпка 6: Следване на Пътя

Кодът за сензорите за скали е настроен да сравнява стойностите на двете стойности на предния и двата странични сензора. Ще трябва да промените тези стойности (вероятно) въз основа на наблюдаваните от вас стойности. Вероятно също ще трябва да редактирате тези стойности след няколко тестови цикъла и да ги промените въз основа на околната светлина, времето на деня (в зависимост от това колко добре е осветена тестовата зона) или когато сензорните прозорци са замърсени.

Преди да стигнем до кода на сензора за скали обаче, има кратък сегмент от код, който вмъкнах, за да изчистя част от ненужните данни от Matlab. Тази част не е необходима, но я използвах, за да намаля съхранението, необходимо за стартиране на програмата.

clear img clear t clear basename clear fullFileName clear folder

Следващият кодов сегмент е месото на проекта. Това позволява на робототехника да следва светлата пътека, поставена на пода. Накратко, той се опитва да се управлява така, че предните два сензора за скали са над прага, въз основа на наблюдаваните от вас стойности, и позволява на програмата да започне стъпките за обработка на изображението малко по -късно.

C = r.getCliffSensors %if цикълът следва цветова лента (бяла), ако C.leftFront> 2000 && C.rightFront> 2000 %насочване по прав път r.setDriveVelocity (driv) иначе C.leftFront 2000 %завива надясно, ако роботът отиде твърде далеч ляв r.turnAngle (-2,5) иначе, ако C.leftFront> 2000 && C. rightFront <2000%завива наляво, ако роботът отиде твърде далеч r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L. rightFront> 100 || L. right> 100 img = r.getImage end %проверява дали има завой в пътя, ако C.left> 2800 && C. right <2800 r.turnAngle (2.5) иначе C.left 2800 r.turnAngle (- 2.5) край %държач за място за разпознаване на образа на пътя („ПОЛУЧАВАНЕ НА ИЗОБРАЖЕНИЕ“) краен краен край

Имайте предвид, че избраните от мен имена на променливите са незадължителни, но отново мисля, че това улеснява живота при използване на променливи с една буква, когато е възможно

За да обясни средната част на кода, когато двата предни сензора изтичат от ръба на пътеката (когато става въпрос за кръстовище или когато достигне края на пътя), той гледа дали има нещо пред него. Ще трябва да поставите обект на земята в края на пътеката или на всяко кръстовище, за да работи това.

След като снимката е направена, тя използва разпознаване на изображение, за да разбере какво да прави. В този раздел на кода има и притежател на място:

%притежател на място за разпознаване на изображение на пътя

Използвах това за момента, защото исках да говоря конкретно за текста и цветовата обработка, която се случва, което е в следващата стъпка.

Стъпка 7: Обработка на изображения

Обработката на изображения има две части. Първо е разпознаването на цветовете, което изчислява интензитета на цвета на картината, за да реши дали да продължи или не към разпознаване на текст. Изчисленията на цветовете се основават на това какъв избор е направен в първия диалогов прозорец в началото (използвах червено, синьо, зелено, но можете да изберете каквито искате цветове, стига средните стойности за интензитета на цвета да могат да бъдат разпознати от Камера Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) червен = среден (среден (imgb (:,:, 1))); g = средно (средно (imgb (:,:, 2))); b = средно (средно (imgb (:,:, 3)));

Това е проверката на интензивността. Това ще бъде използвано в следващия сегмент, за да реши какво иска да направи.

if red> g && red> b if pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img), ако R. Думи {1} == IMAGE || R. Думи {2} == ИЗОБРАЖЕНИЕ || R. Думи {3} == ИЗОБРАЖЕНИЕ t = часовник; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = пълен файл (папка, базово име); imwrite (img, fullFileName) пауза (2) elseif R. Words {1} == НАДЯСНО || R. Думи {2} == НАДЯСНО || R. Думи {3} == НАДЯСНО r.turnAngle (-75) иначе ако R. Думи {1} == НАЛЯВО || R. Думи {2} == НАЛЯВО || R. Думи {3} == НАЛЯВО r.turnAngle (75) иначе ако R. Думи {1} == НАЗАД || R. Думи {2} == НАЗАД || R. Думи {3} == НАЗАД r.turnAngle (110) end else r.turnAngle (110) end end

Този сегмент решава дали цветът, избран в първия диалогов прозорец, съответства на цвета, който вижда камерата. Ако го направи, той стартира разпознаване на текст. Изглежда коя дума (ИЗОБРАЖЕНИЕ, НАЗАД, НАДЯСНО или НАЛЯВО) се появява и след това или се обръща (за дясно и наляво), завърта се (за задна част) или прави снимка и я запазва по същия начин, както по -рано.

Предоставих само една част от кода за различните цветове

За да позволите на кода да разпознава синьо и зелено, просто копирайте кода и променете логическата проверка в горната част на сегмента и задайте „pathcolor == (число)“да съответства на избора на цвят от горния диалогов прозорец (за код, както се показва, синьото ще бъде 2, а зеленото ще бъде 3).

Стъпка 8: Готовият продукт

Готовият продукт
Готовият продукт

Сега робототехникът трябва да се приближи до модулите на мисията на Марс и да докладва на астронавтите, когато нещо не е на мястото си.

Не забравяйте, че всички стойности на сензора за скали и светлината на бронята трябва да бъдат променени до тези, които наблюдавате. Също така от опит открих, че е по-добре да тествам този проект върху под с тъмен цвят и е още по-добре, ако този под не отразява. Така контрастът се увеличава между пътеката и пода, което прави по-вероятно робототехникът да го следва правилно.

Надявам се да ви хареса да настроите малък помощник за мисията на Марс и да се забавлявате при изграждането.

Препоръчано: