Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти
GPS-автопилот - алгоритъм
EDM electronics:
Алгоритъма е готов изцяло. Вече намира най-малката точка и адреса й - точката от маршрута. Допуснал съм очевидна грешка, чак сега я видях, затова не се получаваха нещата. Втората точка от маршрута от 5 точки е най-късото разстояние.
dist. 424.86 d_min 424.86 point 0 smal_point 0
dist. 424.86 d_min 424.86 point 1 smal_point 0
dist. 396.27 d_min 396.27 point 2 smal_point 2
dist. 809.99 d_min 396.27 point 3 smal_point 2
dist. 1085.41 d_min 396.27 point 4 smal_point 2
dist. 2133.37 d_min 396.27 point 5 smal_point 2
juliang:
Да, това ми е идеята, само можеш да почнеш цикъла от втора точка - първа вече си я сметнал извън него :). То се вижда и как повтаря резултата ..
for ( int i = 1; i < 60; i++) {
EDM electronics:
--- Цитат на: juliang в Март 01, 2020, 11:58:20 am ---Да, това ми е идеята, само можеш да почнеш цикъла от втора точка - първа вече си я сметнал извън него :). То се вижда и как повтаря резултата ..
for ( int i = 1; i < 60; i++) {
--- Край на цитат ---
juliang , вече го направих, работи идеално.
Изглежда така:
int j = 0;
while ( j < Route_1) {
addressW2 = j * 8;
addressL2 = addressW2 + 4;
if (d_min != 0) j++;
EEPROM.get(addressW2, W2);
EEPROM.get(addressL2, L2);
// point 2
W2 = W2 * pi / 180;
L2 = L2 * pi / 180;
d = 2 * r * sqrt(pow((W2 - W1) / 2, 2) + pow(cos((W2 + W1)/2), 2) * pow((L2 - L1) / 2, 2));
if ( j == 0) d_min = d;
if ( d < d_min ) {
d_min = d;
cPoint = j;
}
}
Записът if (d_min != 0) j++; кара цикъла да не брои, докато не се зареди първото уравнение d_min = d;. След това започва отново броене от нула и до края на цикъла. В предния пост е видно, нулата на j се повтаря два пъти заради първоначалното зареждане на стойност за сравнение на if ( d < d_min ) .
Продължавам нататък.
EDM electronics:
Доста напреднах с автопилота, почти е готов скеча. Остана ми само алгоритъма за котвата, но не съм го мислил още. Чакам и да ми пристигне компаса - датчика за абсолютна ориентация. Всичко останало - магнитометри не става. Само магнитометър за нищо не става, защото комбинирания датчик има компенсация от жироскопа при наклон, не се мени ъгъла на компаса и няма никакъв дрейф, кове.
За GPS използвах една стара библиотека и заема много малко ресурс, защото на мен ми трябват само 3-4 параметъра от приемника. Така мисля, че ще успея да кача абсолютно целия проект в едно Ардуино Нано. Но ще го дублирам и в STM32. Проблема с този процесор е, че няма апаратно ЕЕПРОМ, а трябва да се емулира от флаша. Не съм правил още такава гимнастика, но е голяма боза и после по-трудно се работи с ардуинската библиотека, става сложно.
Скеча досега е от 850 реда без библиотеките и заема около 70-80% от паметта. Ако не се събере, защото още не съм включвал компаса, може двата датчика да отидат на отделен контролер, т.е. да стане с два. Ако е само автопилота ще се събере на един, но с котвата е под въпрос.
Направих около 15 менюта, които се избират и програмират с многофункционален енкодер. Но той може да се замени и с 4 бутона.
EDM electronics:
,
Навигация
[0] Списък на темите
Премини на пълна версия