Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти
GPS-автопилот - алгоритъм
Радико:
Инжинера от притчата по горе би постъпил по малко по различен начин.
Той щеше да напише една инструкция за използване в която да е упоменато, че преди включването на устройството е необходимо да позиционирате съда със носа срещу вятъра. Мисля че е доста прост алгоритъм такава инструкция.
EDM electronics:
--- Цитат на: Радико в Февруари 07, 2020, 11:46:59 pm ---Инжинера от притчата по горе би постъпил по малко по различен начин.
Той щеше да напише една инструкция за използване в която да е упоменато, че преди включването на устройството е необходимо да позиционирате съда със носа срещу вятъра. Мисля че е доста прост алгоритъм такава инструкция.
--- Край на цитат ---
Радико, добре си ти, отиде там на най-хубавото място на света, да живееш царски, да печелиш 10-пъти повече от нас тук в блатото, скоро и къща ще си вземеш за 20 000 марки, лесно ти е да говориш с притчи - постигнал си абсолютното щастие, за разлика от нашите мъки и безпаричие. :D
В Германия автопилотите под път и над път, не е нужно сам да ги конструираш.
Тук клетниците, като нямаме пари и западен стандарт, търсим щастието чрез творбите си - какво друго ни остава на тоя свят :D, нищо че изглеждат първобитно и нескопосано. ;)
EDM electronics:
--- Цитат на: ndm в Февруари 07, 2020, 05:05:10 pm ---Възможно ли е да допуснем и следната ситуация? Написан е възможно най-добрия код, всичко е изпробвано в градски условия и работи безотказно. Вече сме в голям источнородопски язовир, слънчево и безоблачно време. Но как и не странно, десетките сателити кръжащи над главата ни не могат да ни открият и съответно не можем да пуснем автопилота. Това не навсякъде е така в 40 километровия воден басейн, има и много места на проблясъци от страна на сателитите. Не знам защо, но такива ситуации се случват не само по язовирите. Та въпроса е какво правим при това положение, и не е ли язък за хубавия алгоритъм?
С тези писания вече съм в друга графа, но кво да правя юнашко сърце не трае….
--- Край на цитат ---
Сигналът ви изчезва по три възможни причини:
Първо лош GPS-приемник, има голямо разнообразие на точност, опресняване, чувствителност, работа и с други спътници, като ГЛОНАС, Гелелео и т.н. Евтините GPS имат и евтини параметри общо взето.
Втората е, ако антената е разположена близо до водата там сигнала се разсейва - шунтира се по-лесно в земята, един вид екранира се. Трябва антената да се изведе по-нависоко.
Трета причина е специфичния релеф в който се получават отражения на сигнала от сгради, скали, дървета, метални конструкции, баири и т.н., получава се нещо, като фадинг, приемника приема несъвместими сигнали и когато те не са валидни въобще не ги извежда - така е дори при евтините - китайски модули.
Съществуват GPS-приемници с много висока точност до 1-2 см., а при специални условия ги дават дори в мм. Но такива приемници струват около 200$. Има ги дори за гражданска употреба. За военни цели има още по-добри модули, но те не се продават. При тях изискванията са още по-големи.
Мога да покажа такъв модул, но е на домашния ми компютър, сега не мога. Дават го в мм точност.
EDM electronics:
juliang, изключено е да поставям втори двигател. Нямам яхта, лодката е много малка, но най-вече задачата е по-малка хамалогия при оборудване. Затова и правя двигател, който ще се поставя само с един болт за 10 сек. - пълен автомат: актуаторно сваляне, качване, серво управление - никакви жила, Ви-Фи управление - дистанционно, вградена батерия - никакви кабели и мнооого екстри и т.н.
Не ме бърка, че при настройка на позицията ще прави леки чупки при маневрата и ще варира с няколко метра. Така работят и фабричните. Дори има някакъв предел, защото, ако е по-силно течението или вятъра точността на позицията се променя, затова и има бутони за корекция с +,- 10 гр и метра също.
Мен най-малко ме притеснява алгоритъма за управление на руля и мотора, което ще е смесица и като казваш компромис между двете коректирофки - позиция и направление. По ме притеснява датчиците да работят коректно и стабилно, защото от тях зависи всичко. Алгоритъма за управление на руля, скоростта на мотора и посоката му - реверса ще направя много по-лесно. Няма да стане от първия път, но ще стане. Още повече имам на разположение фабричен и мога да проследя алгоритъма му визуално в реални условия, т.е. да открадна нещичко от него.
По отношение на обратните връзки рул, обороти, реверс:
Първо такива има. Тава са потенциометъра на сервото, който показва в каква позиция е руля, управляващото напрежение на двигателя, което показва оборотите, а реверса е един тригер.
Но тези обратни връзка не са ми необходими в кода, защото управлението ще се състои в именно управление на тези параметри в зависимост от датчиците, т.е. аз още при управлението - командата знам в какво положение са руля, оборотите и реверса. Т.е. ако програмата е изпълнила едно условие и нещата не се получават, тя преминава на следващото условие - условен оператор switch...case.
Главния момент - формулата за изчисление на GPS-азимута и разстоянието между 2 точки:
Доста се рових по разни англоезични форуми, не точно за автопилот, защото няма, а за измерване на разстояние между 2 точки. Навсякъде използват в кода формулата на Хаверсин: https://en.wikipedia.org/wiki/Haversine_formula.
Много програмисти са правили опит да я приложат на практика, но получават задоволителен резултат. Оказа се, че библиотеката TinyGPS++ има и двете търсени от мен функции: ъгъл -азимут /направление/ на две GPS-точки и разстоянието между тях.
Като почетох още малко обаче, разбрах, че тези функции също не са съвсем коректни, но ставаше въпрос за доста големи разстояния и щели да уведомят разработчика за проблема в библиотеката.
Намерих код - формулата на Хаверсин от някакъв, който твърди, че работил съвсем коректно и дори изчислява закръглението на земята. Проблема е, че е написан на първообраза С и за мен е частично неразбираем.
Ще видя докъде ще я докарам и ще търся помощ за преобразуване на кода в ардуински.
TinyGPS++ : http://arduiniana.org/libraries/tinygpsplus/
Разстояние и курс
Ако приложението ви има някаква представа за „пътна точка“ или местоназначение, понякога е полезно да можете да изчислите разстоянието до тази пътна точка и посоката, или „курса“, трябва да пътувате, за да стигнете до там. TinyGPS ++ предоставя два метода за получаване на тази информация и трети ( кардинал () ) за показване на курса в приятелски, четими за човека направления за компас.
const double EIFFEL_TOWER_LAT = 48.85826;
const double EIFFEL_TOWER_LNG = 2.294516;
double distanceKm =
TinyGPSPlus.distanceBetween(
gps.location.lat(),
gps.location.lng(),
EIFFEL_TOWER_LAT,
EIFFEL_TOWER_LNG) / 1000.0;
double courseTo =
TinyGPSPlus.courseTo(
gps.location.lat(),
gps.location.lng(),
EIFFEL_TOWER_LAT,
EIFFEL_TOWER_LNG);
Serial.print("Distance (km) to Eiffel Tower: ");
Serial.println(distanceKm);
Serial.print("Course to Eiffel Tower: ");
Serial.println(courseTo);
Serial.print("Human directions: ");
Serial.println(TinyGPSPlus.cardinal(courseTo));
juliang:
--- Цитат на: EDM electronics в Февруари 10, 2020, 09:46:16 am ---Не ме бърка, че при настройка на позицията ще прави леки чупки при маневрата и ще варира с няколко метра. Така работят и фабричните. Дори има някакъв предел, защото, ако е по-силно течението или вятъра точността на позицията се променя, затова и има бутони за корекция с +,- 10 гр и метра също.
--- Край на цитат ---
Значи нямаш никакъв проблем. Задаваш някакво допустимо отклонение по разстояние и ъгъл. Ако отклонението по разстояние е по-голямо от допустимото, то лодката се завърта докато носа й почне да сочи точката където искаш да отидеш и двигателя се пуска. Точката се достига и лодката на минимален ход и пълно завъртане на руля се завърта до достигане на положението на носа в желаната посока.
Най-простия алгоритъм е лодката винага да завива надясно (примерно). По-сложния ще изисква сметка накъде да се завърти за да се върти по-малко.
Най-простия алгоритъм ще спира мотора докато отклонението не превиши зададения параметър, и чак тогава ще го включва за да го коригира. По-сложния ще се опитва да включва мотора още преди отклонението да е достигнало граничното.
--- Цитат на: EDM electronics в Февруари 10, 2020, 09:46:16 am ---Мен най-малко ме притеснява алгоритъма за управление на руля и мотора, което ще е смесица и като казваш компромис между двете коректирофки - позиция и направление. ...
Алгоритъма за управление на руля, скоростта на мотора и посоката му - реверса ще направя много по-лесно.
--- Край на цитат ---
А на бас че това ще е едно огромно предизвикателство. Идея си нямаш колко сложна е всъщност тази задача. Това ще е най-големото ти предзивикателство, ако не вярваш попитай приятелите ти, които се занимават професионално с програмиране и ти отказват помощ. Не че са лоши приятели - задачата е изключително сложна. И става още по-сложна защото възложителя (ти) идея си нямаш какво искаш.
За мен "компромис" примерно може да означава лодката да се мести със 100-200 метра, но за теб това вероятно ще е недопустимо. За мен "компромис" може да е лодката постоянно да прави някакви корекции с двигателя и руля, но за теб вероятно ще е проблем това, че батерията на лодката ще се изтощи доста бързо.
Ти като възложител е ясно какво искаш - възможно най-малко преместване и възможно най-малко въртене, възможно най-кратко време за работа на руля и двигателя, възможно най-бързо коригиране на отклонението.
Е това всичкото е невъзможно да го получиш. Трябва да се откажеш от нещо. Такава задача е неизпълнима, поне докато не се дефинира в цифри всичкото това "възможно най-малко".
Хубаво е поне че има обратна връзка. Това малко ще улесни задачата, макар че не е съвем ясно какво е въздействието на руля и двигателя върху лодката. Това че е на 30% мощност двигателя ... с колко м/сек ще придвижва лодката... т.е. колко секунди ще трябва да работи за да я придвижи с 5 метра примерно... Да, може алгоритъма да се адаптира динамично, но ... това са още редове код, доста сложна логика... най-малкото тоя PID дето го постнах вече ще е задължително да присъства (и вероятно няма да е само един).
Навигация
[0] Списък на темите
Премини на пълна версия