Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти
GPS-автопилот - алгоритъм
EDM electronics:
Аз мисля, че това зависи от компилатора. Т.е. така се компилира, че едно 4-байтово число се чете на 4 такта по 1 байт. Double трябва да го чете на 8 такта на генератора, защото процесора е 8-битов. Ардуино Дуо или сега съм поръчал Мега са също 8-битови. Ама щом казват, може и да е така, не съм задълбавал.
Като правя пробите с GPS-а, последните две цифри от координатите на числото float с точност до 8 знака или 6 след запетаята, та тия 5-ти и 6-ти ми дават сантиметрите 0-99.
Направих друга функция за запис във външна EEPROM на число float на "С" и ми дава голяма точност, закръгля в рамките на 1-ца. Това ще рече 1 см точност - напълно ненужно е да търся повече. А загубих доста време, докато направя коректен запис и четене в паметта. Сега е ОК.
GPS-а и той играе леко, точността има дрейф от порядъка на 20-30 см. Ако някой прояви интерес, ще публикувам функциите - запис и четене.
Неточността обаче ще се появи не от електрониката, защото при мен тя е без компромис, а от това че GPS-навигацията за граждански цели се прави умишлено с код-дрейф на времената на приемане, за да варира постоянно точността, за де не се ползва за военни цели или терористични актове в рамките на 2-10 м. Т.е. запомням днес една точа, а утре тя е на 10 м вляво, вдругиден е на 7 м северозапад. Затова и има специални точни геодезични GPS-приемници, но те се водят на отчет, там няма дрейф.
Та малко дълго стана, но float е пре-пре-пре достатъчен за моя проект. Наното го запълних на 80% и не знам дали ще ми стигне памет. Имам още работа по компаса. Най-много памет ми отне дисплея, имам 25 екран-менюта.
EDM electronics:
--- Цитат на: juliang в Февруари 06, 2020, 01:42:35 pm ---Не ти трябват тангенси и разни сложни сметки.
Има точка 1 с координати X1 и Y1. Имаш т. 2 с X2 и Y2. Съотношението (x2 - x1) / (y2 - y1) ти дава ... абе наклона на правата която следва да поддържаш.
Тръгваш от т.1, стигаш до точка n и смяташ това съотношение - (Xn - X1) / (Yn - Y1). Ако полученото число е по-голямо, значи се движиш повече по X отколкото трябва, т.е. движиш се по-полегато, трябва да завиеш леко наляво. Правиш още едно замерване след определено време и виждаш колко е числото. Пак правиш корекциите ако е необходимо.
Нещата малко трябва да се усложнят в зависимост от това в каква посока се движиш, вероятно ще трябват 2 или дори 4 алогритъма в зависимост в кой квадрант става придвижването, но общо-всето се променят само знаците + и -. т.е. в единия случай завоя ще трябва да е наляво, в другия - надясно.
Ще е хубаво да сложиш един PID който да прави корекцията с малко изпреварване, щото иначе ще кривуличиш леко. Прилагам един PID регулатор който го писах сам за Данфоските контролери. Входа е 0-1000, изхода е 0-1000, изчислява I и D коефициентите въз основа на измерванията до 50 стъпки назад...
--- Край на цитат ---
Почти съм готов с автопилота - маршрутизатор. За котвата на по-късен етап, защото там ще ми трябва действащ прототип на серво-мотор, а и алгоритъма ще е доста по-сложен. Но все пак ще ползвам вече готовите данни от автопилота.
Много време се играх с компаса - датчика за абсолютна ориентация. Ползвам BN 055 на BOSCH и мисля, че няма по-добро засега на любителско ниво. ;).
Датчика има вграден 32-битов STM-контролер и реално изкарва готови данни по шина I2C. Лесно се свързва и има автоматична настройка по всички оси и компаса, която става непрекъснато, независимо от релефа на местността и мястото на земното кълбо, дава много точни и филтрирани - спокойни стойности. Проблема беше, че като се пусне първоначално без да се разклати не може да се самонастрои. Затова си играх да правя код, с който снемам при ръчна настройка данни за корекциите, това са 8 променливи и или се записват в ЕЕПРОМ и се четат при всеки старт, или сега ги направих на константи във флаша. Така още при запускане датчика е грубо настроен, а само след леко разклащане контролера му си знае работа и точността му "кове".
Оказа се обаче, че без ПИД-регулатор не мога да мина. В противен случай руля ми ще се движи постоянно, при най-малката разлика на посоката от маршрута и ще има зигзагообразно движение.
Не бях запознат с ПИД-а, но след малко теория и стана ясно, че е много ценна "вещ" и няма как да мина без нея. Долу давам един клип с превод от английски за принципа на работа - отлично обяснено.
juliang поразгледах твоя код на ПИД, но не се ориентирам лесно. Пишеш дълги имена на променливите и се обърквам. Няма и коментари кода. Интересува ме, кои са 3-те константи, които задаваш за Пропорционалната /настояща/, Интегралната /минала/ и Дефиренциална /бъдеща/ регулировка?
Ще търся някакъв готов код, няма да откривам топлата вода на ПИД. Трябва ми вход-изход и регулировка на 3-те параметъра. Дори ще ги изведа на енкодера и дисплея със запис в ЕЕПРОМ, да може да се програмират ръчно.
https://www.youtube.com/v/NbEhtZlSa6A&feature=emb_logo
Altium:
На какъв компилатор пишеш STM-a?
valex:
https://github.com/br3ttb/Arduino-PID-Library
https://playground.arduino.cc/Code/PIDLibrary/
https://hackaday.com/2018/04/14/pid-control-with-arduino/
Може да помогнат.
dmitarp:
Дори и да ползваш готов код, гореспоменатите коефиценти, трябва сам да си ги определиш защото зависят само от твоята система. Затова ориентирай се да се запознаеш малко с информация за настройка на ПИД регулаторите.
Навигация
[0] Списък на темите
Премини на пълна версия