Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти
GPS-автопилот - алгоритъм
juliang:
--- Цитат на: EDM electronics в Февруари 24, 2020, 07:19:27 pm ---...
В ардуино езикът има една много хубава функцийка:
sensVal = min(sensVal, 100); // проверяем если sensVal больше 100, то senseVal будет присвоено 100
Та ще се пусне един цикъл - четене от паметта на съответния запаметен маршрут, което ще започне от 1-ва точка и стигне до последна по броя записи - максимално 60. Последователно по горната функция ще отхвърля по-дългата "клечка" и остатакъ ще заема мястото на цифрата 100. После цикъла продължава, докато накрая остане най-късата клечка. Но на всеки прочит ще се следи номера на точката, а той отговаря на съответния адрес. Като знаем номера ще се дава команда да започне четенето от паметта от тази точка напред или назад, т.е. опция реверс.
--- Край на цитат ---
пиша на нещо като си-шарп, надявам се да схванеш идеята:
arr_of_points[100]; //точки от маршрута ти
nearest_point_index = 0;
smallest_distance = distance(current_point, arr_of_points[0]); // функция за пресмятане на разстоянието
for ( i = 0, i < 100, i++)
{
current_distance = distance(current_point, arr_of_points [ i] );
if (current_distance < smallest_distance) // ако дистанцията е най-малката досега
{
smallest_distance = current_distance; / записваме си я като най-малка
nearest_point_index = i; // и запомняме индекса на точката до която разстоянието е най-малко
}
}
Така само с едно минаване през масива ще имаш най-малкот оразстояние и номера на точката, която е най-близо.
EDM electronics:
juliang, написах ти кода малко по-четимо, че с тия дълги редове на променливите се бърках.
Направих нещо подобно, но има проблем, все още не работи. Ще го направя, но целта ми е да стане по-най-краткия и сбит код, затова реших да пробвам и твоята идея, макар че това което направих е почти същото.
Там където е в червено, в първата функция е първата точка от маршрута с адрес 0. Следващата червена е променливата от брояча на цикъла. Правилен ли е този запис? Т.е. първата функция distance ( Point, Route_1 [ 0 ] ) е да намери число d_min за d_cur < d_min, за да тръгне да работи, след това започва да сравнява.
Записа Point_min = i обаче ще показва винаги докъде е стигнал брояча, а не номера на най-малката точка.
Хвърли един поглед и ако може коригирай.
byte Route_1 [ 60 ]; // маршрут от 60 запаметени точки
byte Point = 0; // текуща точката от маршрута
byte Point_min = 0; // точката от маршрута с най-кратко разстояние
word d_min = 0; // най-краткото разстояние
word d_cur = 0; // текущо разстояние
d_min = distance ( Point, Route_1 [ 0 ] ); // функция за дистанцията от първата
точка в маршрута
for ( int i = 0; i < 60; i++) { // цикъл
d_cur = distance ( Point, Route_1 [ i ] ); // функция за текущата дистанция сменя
се от цикъла
if ( d_cur < d_min ) { // условие, ако текущата дистанция е по-
малка от най-малката досега
d_min = d_cur; // минималната е равна на текущата дист.
Point_min = i; // точката на минималната дистанция
}
}
valex:
EDM electronics
Помисли как ще въвеждаш точките. И като въвеждаш няма винаги да са 60!
От там и ограничението на проверката в FOR.
Ползвай while до края на въведения масив.
Записвай в еепром колко са броя на въведените точки.
EDM electronics:
--- Цитат на: valex в Февруари 28, 2020, 07:19:53 pm ---EDM electronics
Помисли как ще въвеждаш точките. И като въвеждаш няма винаги да са 60!
От там и ограничението на проверката в FOR.
Ползвай while до края на въведения масив.
Записвай в еепром колко са броя на въведените точки.
--- Край на цитат ---
valex да, ще ползвам while - прекъснат цикъл, защото променливата му е външна а точно нея смятам да ползвам при запускане на цикъла. for е непрекъснат цикъл и ползвам просто за пробата.
Маршрутите ще са с 3 отделни променливи и с въвеждане на точките в паметта ще се увеличава стойността на съответния маршрут ++. После тази стойност също отива в епрома. Същата стойност ще се ползва и за условието на цикъла. Ще се ползва и за началото на адресите на паметта за следващия маршрут. Така ще мога да ползвам оптимално цялата памет, като всеки маршрут ще започва веднага след предходния без да губя клетки от паметта. Всичко това съм направил. Остана функцията за определяне на най-късото разстояние от точките на избрания маршрут и текущата позиция.
Мога да я направя по няколко начина, но търся най-краткия запис.
EDM electronics:
Ето как работи скеча за намиране на най-късото разстояние на точка от маршрута до текущата позиция:
Нулевата точка всъщност е един такт за запис на първата точка от маршрута, която после влиза в условието за сравнение със следващата, така, че тя не влиза в сметката. Броенето на точките започва от 1-ца. Засега определям най-кратката точка, но мисля по въпроса как да намеря и точката. Точките в 5-те примера са в метри. Това е запис от порт-монитора.
dist. 424.86 d_min 424.86 point 0
dist. 424.86 d_min 424.86 point 1
dist. 396.27 d_min 396.27 point 2
dist. 809.99 d_min 396.27 point 3
dist. 1085.41 d_min 396.27 point 4
dist. 2133.37 d_min 396.27 point 5
Навигация
[0] Списък на темите
Премини на пълна версия