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));