Съдържание:

Rpibot - За изучаване на роботиката: 9 стъпки
Rpibot - За изучаване на роботиката: 9 стъпки

Видео: Rpibot - За изучаване на роботиката: 9 стъпки

Видео: Rpibot - За изучаване на роботиката: 9 стъпки
Видео: Робототехника Lego education 9 июня 2023 Видео 3 2024, Юли
Anonim
Rpibot - За изучаване на роботиката
Rpibot - За изучаване на роботиката

Аз съм вграден софтуерен инженер в немска автомобилна компания. Започнах този проект като платформа за обучение за вградени системи. Проектът беше отменен рано, но толкова ми хареса, че продължих в свободното си време. Това е резултатът…

Имах следните изисквания:

  • Прост хардуер (фокусът е върху софтуера)
  • Евтин хардуер (около 100 €)
  • Разширяем (някои опции вече са част от описанието)
  • Захранващо напрежение за всички компоненти от един 5V източник (powerbank)

Всъщност нямаше цел освен ученето. Платформата може да се използва за учене, наблюдение, роботизирани състезания, …

Това не е урок за начинаещи. Имате нужда от основни познания за:

  • Програмиране (Python)
  • Основна електроника (за свързване на модули заедно с правилното напрежение)
  • Основна теория на управлението (PID)

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

Пълният изходен код и файловете са достъпни тук:

Консумативи:

Механика

  • 1x шперплат (размер А4, дебелина 4 мм)
  • 3x M4 x 80 Винт и гайка
  • 2x редукторни двигатели с вторичен изходен вал за енкодер. Колела.
  • 1x свободно колело

1x монтаж на камера за накланяне и накланяне (по избор)

Електроника

  • 1x Raspberry Pi Zero с заглавка и камера
  • 1x серво управление PCA 9685
  • 2x Оптичен енкодер и верига
  • 1x Женски джъмперни проводници
  • 1x USB захранваща банка
  • 1x DRV8833 драйвер с двоен двигател
  • 2x микро сервомотора SG90 за панорама и накланяне на камерата (по избор)
  • 1x MPU9250 IMU (по избор)
  • 1x HC-SR04 ултразвуков сензор за разстояние (по избор)
  • 1x перфорирана дъска и запояваща тел, хедери,…

Стъпка 1: Изградете шасито

Изградете шасито
Изградете шасито
Изградете шасито
Изградете шасито
Изградете шасито
Изградете шасито

Не съм добър механик дизайнер. Също така целта на проектите не е да прекарвате твърде много време в шасито. Във всеки случай дефинирах следните изисквания:

  • Евтини материали
  • Бързо сглобяване и разглобяване
  • Разширяемо (напр. Място за допълнителни сензори)
  • Леки материали за пестене на енергия за електрониката

Лесно и евтино шаси може да бъде направено от шперплат. Лесно се обработва с фреза и ръчна бормашина. Можете да залепите малки дървени части, за да създадете холдинги за сензори и двигатели.

Помислете за подмяна на дефектни компоненти или електрическо отстраняване на грешки. Основните части трябва да бъдат фиксирани с винтове, за да бъдат сменяеми. Пистолет за горещо лепило може да е прост, но вероятно не е най -добрият начин за изграждане на шаси … Имах нужда от много време, за да помисля за лесна концепция за лесно разглобяване на частите. 3D печатът е добра алтернатива, но може да бъде доста скъп или отнема много време.

Свободното колело най -накрая е много леко и лесно за монтиране. Всички алтернативи бяха тежки или пълни с триене (опитах няколко от тях, преди да намеря последния). Трябваше само да отрежа дървен дистанционер, за да изравня колелото без опашката, след като монтирах основните колела.

Свойства на колелата (за софтуерни изчисления)

Обиколка: 21, 5 см Импулси: 20 импулса/об. Резолюция: 1, 075 см (накрая 1 импулс е около 1 см, което е лесно за софтуерни изчисления)

Стъпка 2: Електроника и окабеляване

Електроника и окабеляване
Електроника и окабеляване
Електроника и окабеляване
Електроника и окабеляване
Електроника и окабеляване
Електроника и окабеляване

Проектът използва различни модули, както е показано на диаграмата.

Raspberry Pi Zero е основният контролер. Той чете сензорите и управлява двигателите чрез ШИМ сигнал. Той е свързан към отдалечен компютър чрез wifi.

DRV8833 е H-мост с двоен двигател. Той осигурява достатъчен ток на двигателите (което Raspberry Pi не може да направи, тъй като изходите могат да доставят само някои mA).

Оптичният енкодер осигурява сигнал с квадратна форма всеки път, когато светлината преминава през колелата на енкодера. Ще използваме HW прекъсванията на Raspberry Pi, за да получим информацията всеки път, когато сигналът се превключва.

Pca9695 е серво контролна платка. Той комуникира чрез I2C серийна шина. Тази платка осигурява PWM сигнали и захранващо напрежение, които контролират сервомоторите за панорама и наклон на гърбицата.

MPU9265 е 3-осно ускорение, 3-осна ъглова скорост на въртене и 3-осен сензор за магнитен поток. Ще го използваме главно за получаване на заглавието на компаса.

Различните модули са свързани заедно с джъмпер проводник. Макетът действа като диспечер и осигурява захранващи напрежения (5V и 3.3V) и основания. Всички връзки са описани в таблицата за свързване (вижте приложението). Свързването на 5V към 3.3V вход вероятно ще унищожи вашия чип. Внимавайте и проверете всичките си проводници два пъти, преди да ги доставите (тук специално трябва да се има предвид енкодерът). Преди да свържете всички платки, трябва да измерите основните захранващи напрежения на диспечерската платка с мултицет. Модулите бяха фиксирани с найлонови винтове в шасито. Също така тук бях щастлив да ги поправя, но и да се свалят в случай на неизправност.

Единственото запояване най -накрая бяха двигателите, макетът и хедерите. Честно казано, харесвам джъмперните проводници, но те могат да доведат до разхлабена връзка. В някои ситуации някои софтуерни мониторинги могат да ви помогнат при анализа на връзките.

Стъпка 3: Софтуерна инфраструктура

Софтуерна инфраструктура
Софтуерна инфраструктура
Софтуерна инфраструктура
Софтуерна инфраструктура

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

Git

Това е безплатна система за контрол на версиите с отворен код. Използва се за управление на големи проекти като Linux, но може лесно да се използва и за малки проекти (вижте Github и Bitbucket).

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

Основните използвани команди са:

git clone https://github.com/makerobotics/RPIbot.git [Вземете изходния код и конфигурацията на git]

git pull origin master [вземете най -новото от отдалеченото хранилище]

git status [получете статуса на локалното хранилище. Има ли променени файлове?] Git log [вземете списъка с ангажименти] git add. [добавете всички променени файлове към етапа, който да бъде разгледан за следващия ангажимент] git commit -m "коментар за коммит"

Дневник

Python предоставя някои вградени функции за регистриране. Софтуерната структура трябва да дефинира вече цялата рамка за регистриране, преди да започне по -нататъшното развитие.

Регистраторът може да бъде конфигуриран да регистрира с определен формат в терминала или в лог файл. В нашия пример регистраторът е конфигуриран от класа webserver, но ние също можем да го направим сами. Тук задаваме само нивото на регистриране на DEBUG:

logger = logging.getLogger (_ име_)

logger.setLevel (logging. DEBUG)

Измерване и начертаване

За да анализирате сигналите във времето, най -добре е да ги начертаете в диаграма. Тъй като Raspberry Pi има само конзолен терминал, ние ще проследим данните в csv файл, разделен с точка и запетая, и ще ги начертаем от отдалечения компютър.

Файлът за проследяване, разделен с точка и запетая, се генерира от нашия основен код на python и трябва да има заглавки като този:

времева марка; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eYaw

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Първата колона съдържа времевата отметка. Следните колони са безплатни. Графичният скрипт се извиква със списък със колони, които трябва да бъдат нанесени:

отдалечен@компютър: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Сценарият за график е достъпен в папката с инструменти:

Плотерът използва mathplotlib в Python. Трябва да го копирате в компютъра си.

За повече комфорт, скриптът на python се извиква от bash скрипт (plot.sh), който се използва за копиране на Raspberry Pi файл за проследяване на отдалечения компютър и извикване на плотера с избор на сигнал. Баш скриптът "plot.sh" пита ако файлът трябва да бъде копиран. Това беше по -удобно за мен, вместо да копирам ръчно всеки път. "sshpass" се използва за копиране на файла от Raspberry Pi към отдалечения компютър чрез scp. Той може да копира файл, без да иска паролата (той се предава като параметър).

Накрая се отваря прозорец с графиката, както е показано на снимката.

Комуникация от разстояние

Интерфейсът за разработка на Raspberry Pi е SSH. Файловете могат да се редактират директно на целта или да се копират от scp.

За да управлява робота, на Pi работи уеб сървър, осигуряващ управление чрез Websockets. Този интерфейс е описан в следващата стъпка.

Настройте Raspberry Pi

Има файл, описващ настройката на Raspberry Pi в папката "doc" на изходния код (setup_rpi.txt). Няма много обяснения, но много полезни команди и връзки.

Стъпка 4: Потребителският интерфейс

Потребителският интерфейс
Потребителският интерфейс

Ние използваме лекия уеб сървър Tornado, за да хостваме потребителския интерфейс. Това е модул на Python, който наричаме, когато стартираме софтуера за управление на робота.

Софтуерна архитектура

Потребителският интерфейс е изграден от следните файлове: gui.html [Описване на контролите и оформлението на уеб страницата] gui.js [Съдържа кода на javascript за обработка на контролите и отваряне на websocket връзка с нашия робот] gui.css [Съдържа стиловете на html контролите. Позициите на контролите са дефинирани тук]

Комуникацията с websocket

Потребителският интерфейс не е най -готиният, но върши работата. Тук се фокусирах върху нови за мен технологии като Websockets.

Уеб сайтът комуникира с уеб сървъра на робота чрез Websockets. Това е двупосочен комуникационен канал, който ще остане отворен, когато връзката е била инициирана. Изпращаме командите на робота чрез Websocket до Raspberry Pi и получаваме информация (скорост, позиция, поток от камера) обратно за показване.

Оформление на интерфейса

Потребителският интерфейс има ръчно въвеждане на командите. Това беше използвано в началото за изпращане на команди до робота. Едно квадратче за включване и изключване на потока от камера. Двата плъзгача контролират панорамата и наклона на камерата. Горната дясна част на потребителския интерфейс контролира движението на роботите. Можете да контролирате скоростта и целевото разстояние. Основната телеметрична информация се показва на чертежа на робота.

Стъпка 5: Програмиране на роботната платформа

Програмиране на роботната платформа
Програмиране на роботната платформа
Програмиране на роботната платформа
Програмиране на роботната платформа
Програмиране на роботната платформа
Програмиране на роботната платформа

Тази част беше основната цел на проекта. Преработих голяма част от софтуера, когато въведох новото шаси с DC двигателите. Използвах Python като език за програмиране по различни причини:

  • Това е основният език на Raspberry Pi
  • Това е език на високо ниво с много вградени функции и разширения
  • Той е обектно ориентиран, но може да се използва и за последователно програмиране
  • Не са необходими компилация или верига от инструменти. Редактирайте кода и го стартирайте.

Основна софтуерна архитектура

Софтуерът е обектно ориентиран, разделен на няколко обекта. Идеята ми беше да разделя кода на 3 функционални блока:

Sense Think Actuate

Sense.py

Придобиване и обработка на основен сензор. Данните се съхраняват в речник, който да се използва на следващия етап.

Control.py

Подклас за задействане управлява двигателите и сервомоторите след известна абстракция. Основният обект на управление обработва командите на високо ниво, а също и алгоритмите за управление (PID) за двигателя.

rpibot.py

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

Всеки модул може да се изпълнява самостоятелно или като част от целия проект. Можете да усетите само и да отпечатате информацията за сензора, за да проверите дали сензорите са свързани правилно и да предоставят правилната информация.

PID контролът

Първата задача е да разберем какво искаме да контролираме. Започнах с опит да контролирам позицията, която беше много сложна и не помагаше много.

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

За да се увеличи сложността стъпка по стъпка, роботът трябва да се контролира:

отворен контур (с постоянна мощност)

pwm = K

след това добавете алгоритъма за затваряне

pwm = Kp.speedError+Ki. Integration (speedError)

и накрая добавете контрола на посоката като последна стъпка.

За контрол на скоростта използвах контрол "PI" и "P" само за криволичене. Ръчно зададох параметрите, като експериментирах. Вероятно тук биха могли да се използват много по -добри параметри. Целта ми беше само права линия и почти я постигнах. Създадох интерфейс в софтуера, за да напиша някои променливи от потребителския интерфейс. Задаването на параметъра Kp на 1.0 изисква следната команда в потребителския интерфейс:

SET; Kp; 1.0

Бих могъл да задам параметъра P достатъчно нисък, за да избегна превишаване. Останалата грешка се коригира с параметъра I (интегрирана грешка)

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

Използваната схема за управление е приложена. Той показва само лявата страна на управлението на робота.

Стъпка 6: Калибриране на сензора

Калибриране на сензора
Калибриране на сензора
Калибриране на сензора
Калибриране на сензора
Калибриране на сензора
Калибриране на сензора

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

Сигналите на IMU сензора трябва да бъдат калибрирани, преди да се използват. Някои сигнали на сензора зависят от монтажния ъгъл и позиция.

Калибриране на скоростта на ускорение и въртене

Най -лесното калибриране е за надлъжното ускорение (A_x). В застой трябва да има около 0 m/s². Ако завъртите сензора правилно, можете да измерите гравитацията (около 9, 8 m/s²). За да калибрирате a_x, просто трябва да го монтирате правилно и след това да определите отместването, за да получите 0 m/s² в покой. Сега A_x е калибриран. Можете да получите отклоненията за скоростите на въртене по подобен начин при застой.

Калибрирането на магнитометъра за компаса

Необходимо е по -сложно калибриране за сензорите за магнитно поле. Ще използваме m_x и m_y, за да поставим магнитното поле в хоризонтално ниво. Наличието на m_x и m_y ще ни даде възможност да изчислим заглавие на компас.

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

Записваме m_x и m_y, докато завъртаме робота около оста z. Начертаваме m_x срещу m_y в XY диаграма. Резултатът е елипса, както е показано на снимката. Елипсата трябва да бъде центрирана към началото. Тук разглеждаме максималните и минималните стойности на m_x и m_y, за да получим отместванията в двете посоки. Накрая проверяваме калибрирането и виждаме, че елипсата сега е центрирана.

Калибрирането на меко желязо би означавало, че променяме картината от елипса в кръг. Това може да се направи чрез добавяне на коефициент към всяка сензорна стойност.

Вече може да се кодира програма за изпитване за повторно калибриране или поне за проверка дали сензорите са все още калибрирани.

Заглавието на компаса

Данните от магнитометъра вече ще се използват за изчисляване на курса на компаса. За това трябва да преобразуваме сигналите m_x и m_y в ъгъл. Python директно предоставя функцията math.atan2, която има тази цел. Пълното изчисление е дефинирано във файла mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Стъпка 7: Алтернативни дизайни

Алтернативни дизайни
Алтернативни дизайни
Алтернативни дизайни
Алтернативни дизайни
Алтернативни дизайни
Алтернативни дизайни

Проектът отне много време, тъй като дизайнът беше напълно отворен. За всеки компонент направих някаква прототипна реализация и изпитах границите на системата.

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

Серво за непрекъснато въртене, свързано към pca 9695

За да избегна допълнителен H-мост за двигател с постоянен ток, първо започнах със сервомотори с непрекъснато въртене. Те бяха задвижвани от вече присъстващия серво драйвер pca 9695. Цялата задвижваща механика и съответната електроника бяха много по -прости. Този дизайн има два недостатъка:

  • Лошият диапазон на управление на сервомоторите.
  • Липсващото местоположение на енкодера

Сервомоторите започват да се движат с 50% pwm и имат пълна скорост на около 55%. Това е много лош диапазон на контрол.

Без задържане на енкодер беше много трудно да се намери готов за работа енкодер. Тествах 3 различни кодера на отражение, които бяха монтирани на шасито. Залепих самостоятелно направено енкодерно колело от външната страна на колелото с черно -бели секции. Използвах сензорите QTR-1RC, които се нуждаят от много обработка на сигнал, за да получат правилния сигнал. Raspberry Pi не успя да извърши такъв вид обработка в реално време. Затова реших да добавя NodeMCU D1 mini като контролер в реално време към робота. Той беше свързан към малиновия Pi чрез сериен UART, за да достави обработените сензорни данни. NodeMCU също управлява сензора HC-SR04. Механиката беше трудна и не много здрава, серийната линия получаваше шум от линията I2C и двигателите, така че накрая изградих втората версия на шасито с прости двигатели с постоянен ток, задвижвани от H-мост. Тези двигатели имат вторичен изходен вал за поставяне на оптичен енкодер.

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

Обработка на изображение
Обработка на изображение
Обработка на изображение
Обработка на изображение
Обработка на изображение
Обработка на изображение
Обработка на изображение
Обработка на изображение

За да подобрим автономното шофиране, можем да направим известна обработка на изображения.

Библиотеката на opencv е справка за това. Може да се използва от Python за бързо прилагане на откриване на препятствия.

Заснемаме изображение и прилагаме някои задачи за обработка на изображения:

Първите тестове бяха направени с трансформациите на Canny и Sobel. Кани може да бъде добър кандидат, но не е достатъчно разумен. Sobel е твърде разумен (открити са твърде много обекти).

Накрая направих свой собствен филтър за смесване на всички хоризонтални и вертикални наклони (откриване на мебели):

  • Преобразувайте цветното изображение в изображение на ниво сиво
  • Размажете изображението, за да премахнете малкия шум
  • Праг на изображението към черно -бяло изображение
  • Сега откриваме хоризонтални и вертикални наклони за откриване на обекти като стени и мебели
  • Филтрираме само останалите големи контури (вижте цветни контури на снимката)

Сега можем да използваме тази нова информация за откриване на пречки …

Стъпка 9: Следващи стъпки …

Следващи стъпки…
Следващи стъпки…
Следващи стъпки…
Следващи стъпки…

Сега имаме проста робот платформа със сензори, задвижващи механизми и камера. Целта ми е да се придвижвам автономно и да се върна на станцията, без да добавям допълнителни сензори. За това ще ми трябват следните стъпки:

  • Сливане на сензора на сигнали за отклонение и магнитни курсове
  • Обработка на изображения от камерата (само нисък процесор е наличен за това)
  • Откриване на сблъсък (ултразвуково разстояние и камера)
  • Изграждане на карта или ориентация

Сега отидете и създайте свои собствени предизвикателства или цели …

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