Вериги

Как да изградим самонавиващ се робот: 7 стъпки

игра на гармони Тиче вода в ярок

игра на гармони Тиче вода в ярок

Съдържание:

Anonim

Това е подробен урок за това как да реализирате робот, започвайки от нулата, и давайки му възможност да се движите автономно в непозната среда.
Всички типични аргументи, свързани с роботиката, ще бъдат обхванати: механика , електроника и програмиране .
Целият робот е проектиран да бъде направен от всеки вкъщи без професионални (т.е. скъпи) инструменти и оборудване.
Мозъчната дъска (dsNav ) се основава на Microchip dsPIC33 DSC с възможности на енкодера и контролера на мотора. Позицията се изчислява чрез одометрия (енкодер) без никаква външна референция (мъртво възнаграждение).
В крайната версия се използват някои други контролери за управление на сензори (Arduino) и за управление на аналогови сензори (PSoC).

градина:

Стъпка 1: Основна платформа

Пример за това как да се изгради много проста платформа с компоненти и части, които лесно могат да се намерят навсякъде, без нуждите от професионални инструменти или оборудване и без специално умение за механични работи.
Размерът на базата позволява използването му в много различни категории роботизирани конкурси: Explorer, Line Follower, Can Collector и др.

Стъпка 2: Какво искаме да получим? и как?

Този робот, както повечето от роботите, построени от хобисти, се основава на диференциална система за управление, която ни позволява да знаем координатите на позицията на робота във всеки един момент, просто да познаваме пространството, покрито от всяко колело, периодично с достатъчна точност.
Тази навигационна навигационна система е засегната от кумулативна грешка; точността на измерване трябва да е висока, за да се гарантира малък кръг на грешка след дълъг път. Така че, след някои добри резултати с домашно създадени енкодери, реших да използвам нещо по-добро: няколко мотор-редуктора с 12V-200 rpm, свързани с няколко 300 Enc Perfor (cpr) енкодери, които са налични в много магазини за интернет роботи.
Основни принципи
За да се улавят всички импулси, генерирани от 300 cpr енкодер на 3000 об / мин мотор в 4x метод на декодиране (120 kHz), ние се нуждаем от специален хардуер за всеки енкодер (QEI = Quadrature Encoder Interface). След няколко експерименти с двойно PIC18F2431, установих, че правилното ъпгрейд е към dsPIC. В началото те бяха два контролера на двигателя dsPIC30F4012, за да контролират позицията и скоростта на колелата, да извършват одометрия и да предоставят данни за двата двигателя на dsPIC30F3013. Тази DSC с общо предназначение е достатъчно мощна, за да получи данни, да направи някаква тригонометрия, за да изчисли координатите на местоположението и да съхрани данните, свързани с пътя, за да получи карта на полето, всички с много висока скорост.
Когато платката и програмите бяха почти завършени, Microchip извади нов, мощен 28-пинов SPDIP в серията dsPIC33F както за контролера на мотора, така и за моделите с общо предназначение (GP). Те са значително по-бързи от dsPIC30F, разполагат с много повече налична оперативна памет и RAM (полезно за картографиране на поле), те изискват по-малко енергия (добро за робот с батерия), а техните DMA възможности опростяват много I / O операции.
Най-важното е, че това са първите контролери на Microchip с два QEI на един и същи чип. Нека отново да започнем ново пристанище! Най- логическата блокова диаграма е подобна на тази за предишната дъска , но хардуерът и софтуерът са много по-прости оттогава Мога да използвам един DSC само за три , Няма нужда от високоскоростна комуникация между надзорния и моторния контролери за обмен на навигационни параметри. Всеки процес е лесен за синхронизиране, защото е на същия чип. Възможността за избор на периферни щифтове на серията dsPIC33F допълнително опростява печатната платка, позволявайки вътрешна връзка на периферните устройства и по-голяма гъвкавост.
Това ни отвежда до "dsPIC базиран борд за навигация" или dsNavCon на кратко. Тази платка е проектирана като част от по-сложна система. В пълен изследователски робот, други дъски ще контролират звука, светлината, газовите сензори, както и брони и ултразвукови далекомери, за да намерят цели и да избегнат препятствия.
Като самостоятелен съвет, dsNavCon може да се използва и за обикновен робот за "последовател", нещо по-сложно като робот за одометрия и състезание с мъртва оценка, или т.нар. "може да робот" (за състезания за събиране на билети). Все още има много свободна програмна памет за добавяне на код за такива задачи. С малки или никакви промени в софтуера, той може да се използва самостоятелно за дистанционно управлявано превозно средство, като се използва двупосочен RF модем с някакъв вид интелигентно дистанционно управление. Това дистанционно управление може да изпраща сложни команди като „преместване на FWD 1m“, „завъртане на 15 ° наляво“, „управление на FWD на 50 cm / s“, „преминаване към X, Y координати“ или нещо подобно.
Бордът и роботът също са проектирани да бъдат направени от всеки у дома без професионални инструменти и оборудване.

Стъпка 3: Хардуерът с отворен код

Блокова диаграма
Подсистемата за управление на навигацията се състои от dsNav като "интелигентна" дъска на системата и L298-базирана двойна мостова платка H-мост за управление на мотор-редуктори с 12V (Hsiang Neng HN-GH12-1634TR). Обратната връзка за движение идва от няколко 300 cpr кодера (US digital e4p-300-079-ht).
Комуникацията с външния свят се осъществява чрез двата UART серийни интерфейса; един за телеметрия, а другият за данни от борда на датчиците. Модулът XBee може да бъде свързан към UART1 или UART2 през джъмперите JP1 и JP2. J1 и J16 гнездата са достъпни за други видове връзки. COMM1 порт (J16) може да се използва и за I2C комуникация благодарение на способността за избор на периферни щифтове на dsPIC33F серията.
Оригиналната диаграма в Eagle формат може да се намери тук:
http://www.guiott.com/Rino/dsNavCon33/dsNavCon33_Eagle_project/DsPid33sch.zip
Както можете да видите схематично е толкова просто, че може да се прилага на perfboard, както аз направих. Ако не искате да използвате тази система и не искате да реализирате своя собствена печатна платка, търговска дъска, базирана на моята оригинална работа и напълно съвместима с моя софтуер с отворен код, можете да намерите на: http: //www.robot-italy .com / product_info.php? products_id = 1564

Стъпка 4: Софтуер с отворен код

Софтуерът е разработен с MPLAB® свободна IDE и написан с MPLAB® C30 компилатор (дори в безплатна или студентска версия), и двете (разбира се) от Microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=81
Целият проект е достъпен като отворен код в Google Code
http://code.google.com/p/dspid33/
Моля, вижте последната версия, коментар, описания и т.н.
Програмата е описана стъпка по стъпка вътре в кода. За да има високо ниво на коментиране и по-разбираем код, във всяка значима точка има число в скоби (например: 7) като препратка към външен файл (т.е.: descrEng.txt) в проекта MPLAB ,
Диаграмата показва цялостната архитектура на контролните процедури на dsNav борда и навигационните стратегии, прилагани в основата на проекта.
Контролерите на мотора могат да се разглеждат като черни кутии, които се грижат за скоростта на колелата. Надзорната част на програмата им изпраща референтната скорост (VeldDesX: желаната скорост). Модулите за входен захват на микроконтролера получават импулси от енкодерите, свързани към оста на двигателя, и извличат скоростта на въртене на двигателите (VelMesX: измерена скорост). Комбинирайки всеки 1ms тези стойности в PID контрола "Speed ​​PID" получаваме правилната PWM стойност, за да запазим желаната скорост на всяко едно колело.
Модулите QEI (Quadrature Encoder Interface) получават и двата А и В импулса от енкодерите и връщат обратно на контролната функция посоката на движение и броя на импулсите в режим 4x (преброяване на нарастващите и падащите ръбове на сигнал А и сигнал В: 2 х 2 = 4).
Умножавайки броя на импулсите с К, което показва пространството, пропътувано за всеки импулс на един енкодер, получаваме изминатото разстояние от дясното и лявото колело на всеки 10ms. Надзорният орган комбинира тази информация за пътуване и прилага процедурата за отчитане на смъртта, за да получи измерените координати на позицията на бота: Xmes, Ymes, θMes (ъгъл на ориентация).
Надзорният орган получава команда за навигация отвън по сериен интерфейс (телеметрия).
Могат да се прилагат различни стратегии:
А - движение с определена скорост в дадена посока (VelDes, θDes).
B - пътуване към дадена точка с координати XDes, YDes.
° С - пътуване за дадено разстояние в дадена посока (DistDes, θDes).
Режим А : с "логически контролни превключватели" в позиция 1, само PID контрола "Ъглов PID" се използва от надзорните функции. Този комбинира желания ъгъл θDes с измерения ъгъл θMes, изчислен чрез одометрична процедура, за да се получи стойността на ъгловата скорост на въртене ω на превозното средство около неговата вертикална ос, необходима за коригиране на грешката на ориентацията.
Стойността на DeltaV е пропорционална на ω. Добавя се към VelDes, за да се получи скоростта на лявото колело и да се извади VelDes, за да се получи скоростта на дясното колело, за да се запази заглавието, съответстващо на стойността на θDes, докато центърът на робота продължава да се движи със скорост VelDes.
Режим Б : с "логически контролни превключватели" в позиция 2, желаната скорост VelDes се изчислява от PID контрола "Dist PID" и се използва както в режим A. Измереният вход за този PID (DistMes) се изчислява като функция на текущите координати и координатите на местоназначението. Желаният θDes ъгъл на ориентация също идва от същата процедура и се използва като референтен вход за "Ъглов PID". Референтният вход за "Dist PID" е 0, което означава, че дестинацията е достигната. При наличието на ω и VelDes управлението на скоростта на колелата работи както в режим А.
Режим C : с "логически контролни превключватели" в позиция 2, координатните дестинации Xdes, Ydes се изчисляват веднъж в началото като функция на входните параметри DistDes, θDes. След това всичко върви както в режим B

Стъпка 5: Подробности за софтуера: контрол на скоростта и други основни функции

Програмата е пълна прекъсване , При стартирането, след инициализацията, програмата влиза в много проста основна верига, действайки като държавна машина. В main-loop програмата проверява флаговете, разрешени от външни събития, и влиза в относителното им състояние според техните стойности.
Тъй като това е един много прост кооператив "Операционна система в реално време , "всяка рутина трябва да бъде изпълнена в най-кратки срокове, освобождавайки системата, за да се погрижи за много честите прекъсвания."
Няма "изчакване до" и няма забавяне в кода. Когато е възможно, се използват прекъсвания, по-специално за бавни операции като предаване или приемане на низове от символи. UART комуникацията се възползва от предимствата на DMA възможностите на dsPIC33F, за да спести време на процесора, което прави цялата "мръсна" работа в хардуера.
Периферните устройства, използвани на dsPIC33FJ128MC802:
- QEIs за изчисляване на изминатия път.
- Input Capture (IC) за изчисляване на скоростта.
- A / D преобразуватели за отчитане на тока на двигателя.
- Подобрени ШИМ за задвижване на двигателите.
- UARTs да общуват с външния свят
QEI модули се използват, за да се знае колко колела са изминали и в каква посока. Тази стойност се натрупва алгебрично в променлива на всеки 1ms и се изпраща на надзорните функции по нейно искане. След изпращането на стойността променливите се нулират.
Скоростта се измерва при всеки импулс на енкодера, както е описано по-долу. Всеки 1ms изчислява средната скорост чрез осредняване на проби, изпълнява PID алгоритъм и коригира скоростта на двигателя съобразно своя резултат, променяйки работния цикъл на PWM. За подробно описание на приложението на C30 PID библиотека вижте Пример за микрочип Пример: CE019 - Използване на пропорционални интегрални производни (PID) контролери в затворени системи за управление. http://ww1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Вариациите на скоростта на двигателите се изпълняват плавно, ускорява се или намалява с нарастваща или падаща наклонена рампа, за да се избегне тежка механична деформация и приплъзване на колелата, което може да доведе до грешки в одометрията. Забавянето е по-бързо от ускорението, за да се избегнат неравности с препятствия по време на спиране.
интегрална схема входните модули за заснемане се използват за измерване на времето, изминало между два импулса, генерирани от значението на енкодера, когато колелата са изминали за добре известното фиксирано пространство (постоянно SPACE_ENC ). Свързани паралелно с QEA (вътрешно за DSC благодарение на възможностите на dsPIC33F за избор на периферни щифтове), те улавят изминалото време на нарастващия ръб на сигналите на енкодерите. TIMER2 се използва в режим на свободно движение. При всяко прекъсване на IC се запаметява текущата стойност на TMR2 и нейната предишна стойност се изважда от нея; това е периодът на пулса. Тогава текущата стойност се превръща в предишна стойност, чакаща следващото прекъсване. Флагът на TMR2 трябва да се провери, за да се знае дали в 16-битовия регистър се е случило препълване. Ако отговорът е да, разликата между 0xFFFF и предишната проба трябва да бъде добавена към текущата стойност. Пробите се добавят алгебрично IcPeriod променлива според _UPDN бита, за да се определи и посоката на скоростта. Това е един от предложените методи в Бележка за приложение на микрочип AN545 .
Променливата IcIndx съдържа броя на добавените проби IcPeriod .
На всеки 1 мс се изчислява средната скорост V = Space / Час
където Space = SPACE_ENC • IcIndx
(= пространство, обхванато от един импулс на енкодера • брой импулси)
и Време = TCY • IcPeriod
(= единичен период на TMR • натрупване на настъпили периоди).
Single_TMR_period = TCY = 1 / FCY (тактова честота).
Така V = КВЕЛ • (IcIndx / IcPeriod)
където КВЕЛ = SPACE_ENC • чужда валута да има скорост в m / s.
Преместването остави 15 бита КВЕЛ const ( KvelLong = КВЕЛ << 15 ) скоростта се изчислява вече във фракционен формат (също и ако се използват само целочислени променливи), готови за използване в рутината на PID. Вижте “descrEng.txt” файла в MPLAB проекта за по-подробно описание.
A / D преобразуватели непрекъснато измерва тока на мотори, съхранява стойности в буферите ADCBUF на 16 позиции. Когато буферите са пълни, възниква прекъсване и средната стойност се изчислява приблизително на всеки 1ms.
UARTs се използват за получаване на команди отвън и за връщане на резултатите от измерванията. Комуникационната част на програмата работи като държавна машина. Променливите за състояние се използват за изпълнение на действия в последователност. Много прости и бързи операции за прекъсване (ISR) получават или поставят всеки един байт от или към буфер и задават правилните флагове, за да позволят на правилната функция да бъде изпълнена.
Ако по време на приемане възникне някаква грешка (UART, контролна сума, грешки при анализ), променливата на състоянието е зададена на отрицателно число и червеният светодиод се захранва, за да комуникира външно това състояние на повреда. Вижте “descrEng.txt” файла в MPLAB проекта за пълен списък на възможните грешки.
Използваният протокол за ръкостискане е физически слой независим , и може да се използва с I2C или RS485 шина, както и за комуникация.
Най- първи слой се контролира от dsPIC периферен интерфейс. Грешките в рамката или превишаването (UART) или сблъсъците (I2C) се откриват от хардуера, като се поставя съответния флаг.
Най- втори слой се обработва от процедурите на ISR. Те запълват RX буфера с байтовете, получени от интерфейсите. Те също така откриват препълване на буфера и претоварване на командите.
Функциите на UartRx или UartRx2 управляват трети слой , Както вече беше описано (виж също диаграмите) тези рутинни действия действат като държавна машина, като получават байтове от буфера и декодират командния низ.
Байтовете се обменят между втори и трети слой (ISR и UartRx функция) чрез кръгов буфер. ISR получава байт, съхранява го в масив и увеличава показалеца към масива, ако показалецът достигне края на масива, той се рестартира в началото. Функцията UartRx има свой собствен указател за четене на същия масив, нарастващ (също така и кръгъл), веднага щом байтът се декодира в текущия RX статус. Основният цикъл извиква функцията UartRx, когато показалеца "в" се различава от показалеца "навън".
Всеки пакет от команди се състои от:
0 - Заглавие @
1 - ID 0-9 ASCII
2 - Cmd A-Z ASCII
3 - CmdLen N = 1-MAX_RX_BUFF # от следващите байтове (включена контролна сума)
4 - Данни …

N-1 - Данни
N - Контролна сума 0-255, получена чрез просто добавяне в променлива с 8 бита, като всички байтове съставят съобщението (самата контролна сума е изключена).
Този слой контролира грешките във времето на изчакване и контролната сума, както и последователността на пакетите (правилна глава, правилна дължина). Ако всичко е наред, то позволява рутината на Parser (четвърти слой ) да декодира съобщението и да изпълни изискваното действие. Тази процедура задава подходящия флаг за грешка, ако полученият код на съобщението не е известен.
TMR1 генерира часовник с таймер за 1000 Hz - пулса на програмата. При всяко прекъсване на всеки TMR1 се актуализират вътрешните таймери, наблюдателят се изчиства и се поставя флаг, за да се даде възможност на функцията, която иска стойност на изминатото пространство. Всяка 10ms функция "All_Parameters_Ask" (скорост, позиция, ток) е активирана.

Стъпка 6: Подробности за софтуера: одометрия и картографиране на полета = Къде съм?

Оптимизиране на общия алгоритъм за използване в DSC или MCU базирана система
След като веднъж получим информация за изминатото от всяко колело разстояние в обновяването на дискретно време (одометрия), можем да изчислим координатите на позицията на робота със същата периодичност без външна референция (мъртво отчитане).
Някои теоретични основи за смятане на мъртви чрез одометрия могат да бъдат намерени в книгата на Йохан Боренщайн:
"Къде съм? - сензори и методи за позициониране на мобилни роботи"
и на следните уеб страници:
http://www.seattlerobotics.org/encoder/200010/dead_reckoning_article.html
Математическият фон и дълбокото обяснение на използвания общ метод могат да бъдат намерени на G.W. Документът на Лукас и моделът на елементарна траектория за системата за диференциално управление на задвижващите колела на роботи, налични в интернет:
http://rossum.sourceforge.net/papers/DiffSteer/DiffSteer.html
Някои опростени алгоритми също могат да бъдат намерени в същата документация, така че е възможно да се получи правилен компромис между точност и скорост на изработване, като се използва математическата (тригонометрична) способност на dsPIC33F серията.
Описание на математиката, използвана за изчисляване на позицията, може да бъде намерено на снимките, приложени към тази стъпка. Първата показва значението на символите, а втората показва формулите, използвани с тези символи. Кликвайки върху полетата до всяка изчислителна стъпка, се показва кратко описание.
Накрая знаем колко много робот се е преместил в този интервал от време като делта на ориентацията, делта на оста X и делта на Y-ос в полето на carthesian референция.
Натрупвайки всяка делта-стойност в собствената си променлива, ние знаем текущите координати (позиция и ориентация) на платформата.
За да се избегнат изчислителни грешки (разделяне с нула) и загуба на времето на контролера, трябва предварително да се извърши проверка на Sr и Sl променливите. Определяйки квази-нулева стойност, която се грижи за минималните механични и изчислителни приближения, можем да опростим формулите, ако роботът се движи по права линия (пространството, покрито с дясното колело, е почти същото като пространството, пропътувано от лявото колело) или ако се върти около своята вертикална ос (пространството, покрито от дясното колело, е почти същото като пространството, пресичано от лявото колело, но в обратна посока), както е описано подробно в диаграмата, показана на последната снимка.

Този видеоклип показва пример за точност, която можем да получим:
http://www.youtube.com/watch?v=d7KZDPJW5n8


Съпоставяне на полето
С данните, изчислени по предишни функции, се извършва картографиране на полето.
Всяко Xms, след изработването на текущата позиция, се извършва картографиране на поле, разделящо неизвестното поле в клетъчна мрежа 10 x 10 cm. Като дефинираме максимално поле от 5 x 5m, получаваме матрица от 50 x 50 = 2500 клетки. Всяка клетка е дефинирана с кълчи, с обща памет от 1250 байта. На всяка клетка могат да бъдат присвоени 16 различни стойности:
n = 00 неизвестна клетка
n = 01 - 10 клетки, посетени n пъти
n = 11 намерено препятствие
n = 12 намерена газова мишена
n = 13 намерена лека мишена
n = 14 намерен звук
Роботът може да започне от всяка позиция в полето; те ще бъдат референтните координати (0,0) в нейната референтна система.
Полевото картографиране е полезно за намиране на най-добрата стратегия за проучване в неизвестно поле. Роботът може да се насочи към по-малко изследваната част от полето (по-ниска “n” стойност), може да спести време, като не спира два пъти в вече открита цел, може да намери най-добрия път за достигане на дадена координата и още.

Стъпка 7: Отдалечена конзола

Това е приложението, което дистанционно контролира dsNavCon борда от Mac / PC чрез серийна комуникация чрез няколко XBee устройства, както е описано в блоковата диаграма.
За да бъде лесно да се развие и да се работи добре във всяка операционна система, тя е написана с обработване език:
http://www.processing.org/
Изходният код на тази програма също е налице като отворен код в Google Code:
http://code.google.com/p/dsnavconconsole/
С основен панел (Първи снимки) можем да извършим телеметрия, като погледнем в решетката пътя, следван от робота (както е оценено чрез одометрия) в поле за конфигуриране на размера и някои други важни стойности, прочетени на dsNav .
Устройствата показват измерените стойности:
- MesSpeed ​​в диапазон +/- 500 mm / s, средната стойност на скоростта на двете колела (скоростта на центъра на платформата).
- Измерен ток в mA (сумата на тока от двата двигателя).
- измерен ъгъл, измерен чрез одометрия.
Други панели се използват за конфигуриране на параметрите на робота и за съхраняване в робота на определен път, който да следва (ако е необходимо). Важен панел, поне по време на разработването на робота, е панел с подробности (втора снимка), която показва скоростта на всяко колело в реално време, много полезна за калибриране на всички параметри.
Централният изглед на мрежата може да бъде превключен с оглед на уеб камера, която да контролира, дори и от гледна точка, пътя на робота.
На този видеоклип е показан практически пример за използване на тази конзола:
http://www.youtube.com/watch?v=OPiaMkCJ-r0