Програмен код - направи си сам ъгъл

Тази публикация е посветена на изучаването на Ardupilot 2.8 код (и наследени недостатъци от предишни)

  • Изучаване на кода, за да се опишат характеристиките на използването на устройството
  • Идентифициране и отстраняване на грешки
  • Изчистване на остарялата функционалност, за да освободите място в паметта

За да проверите направените изводи,

  • Десктоп XPLANE 9 с модел PT60RC
  • ArdupilotSim - за комуникация на симулатора и usb-сериала
  • arduino duemilanove - като usb-сериен адаптер
  • Дъска ArduPilot-v15 с допълнителни дроселни и кормилни връзки
  • Ardupilot 2.8 бета фърмуер

Идентифицирани недостатъци:

  1. Значителна грешка в навигацията, водеща до движение „по дъга“ по точки (фиксирана в бета 4)
  2. Рязко хвърляне на модела в режим на кацане при достигане на координатите на точката, посочена като точка на кацане (елиминиран в бета 5 чрез постепенно увеличаване на ъгъла)
  3. Грешка при спирането на газа от канала за ръчно управление в последния етап на автоматичното кацане (фиксирана в бета 5)
  4. Грешка при навигация по надморска височина от около -20 m (фиксирана в бета 5, въведен PID коефициент в зависимост от разстоянието от точката)
  5. Грешка при навигация в посока от порядъка на +/- 5 градуса (фиксирана в бета 5, въведен PID коефициент в зависимост от разстоянието от точката)
  6. Рязки маневри в близост до точки (елиминиран в бета 5, въведен PID коефициент в зависимост от разстоянието от точка)
  7. Преминаващи неточни точки (не фиксирани)
  8. Откриване на загуба на сигнал от предавател за аналогов приемник, който не е оборудван с Failsafe (не е разрешен)
  9. Изчисляването на курса спрямо положението на фюзелажа на самолета (жироскопа) не отчита масата на модела, скоростта, т.е. момент на инерция (това е особено забележимо, ако зададете голям коефициент на усилване в канала на руля без изглаждане) (не елиминиран)
  10. Без да се взема предвид изместването на домашната точка. (не елиминиран)

Кодови алгоритми

Основни принципи.

Особеностите на хардуерната платформа на arduino са, че процесорът има едно ядро, нито средата за разработка, нито хардуерната платформа поддържат многопоточност, вместо това се прекъсват и се използват два основни цикъла за настройка и цикъл. В този случай езикът за програмиране C ++, ако не разбирате конструкцията на езика, отговорът трябва да се намери в ръководствата и форумите за този език.

Основният модул се счита за pde файл с име, което съвпада с името на папката, в която е вложен, в началото на този файл има декларация за библиотеки и глобални променливи в съответствие с изискванията на C + +, след това две процедури за настройка и цикъл, след всяко нулиране се изпълнява първо веднъж
програмен код, записан в процедурата за настройка и след това безкраен брой пъти (или докато увисне поради грешка в кода) цикъл на процедурен код.

Кодът на ardupilot (както и сензорните платки) се прави на принципа на няколко цикъла, изпълнявани последователно, един цикъл (бърз цикъл) се изпълнява 50 пъти в секунда, вторият (среден контур) 10, функции, които трябва да се изпълняват с необходимата честота се поставят в клоновете на тези цикли

Ръчно управление
каналът на асансьора е свързан с arduino порт No. .
Каналът се чете автоматично чрез прекъсвания и е достъпен в променлива. Тип .
tudu: добавяне на алгоритми

Отстраняване на дефекти.

ong get_distance (struct Location * loc1, struct Location * loc2)
<
float pRad = 0.00000000174527777777;
float lat2 = loc2-> lat * pRad;
float lon2 = loc2-> lng * pRad;
float lat = loc1-> lat * pRad;
float lon = loc1-> lng * pRad;

float dlx = 6371000 * (lon-lon2);
float dly = 6371000 * дневник (тен (lat/2 + M_PI_4)) - 6371000 * дневник (tan (lat2/2 + M_PI_4));
връщане sqrt (dlx * dlx + dly * dly) * cos (lat);
>

long get_bearing (struct Location * loc1, struct Location * loc2)
<
float pRad = 0.00000000174527777777;
float lat2 = loc2-> lat * pRad;
float lon2 = loc2-> lng * pRad;
float lat = loc1-> lat * pRad;
float lon = loc1-> lng * pRad;


float dlx = 6371000 * (lon-lon2);
float dly = 6371000 * дневник (тен (lat/2 + M_PI_4)) - 6371000 * дневник (tan (lat2/2 + M_PI_4));
дълъг лагер = (atan2 (dlx, dly) * 180/M_PI + 180) * 100.00;
връщащ лагер;
>

2. Рязко хвърляне на модела в режим на кацане при достигане на координатите на точката, посочена като точка на кацане.
Алгоритъмът на ардупилот осигурява ъгъл на подаване по време на кацане, зададен от константа

и съответно опитите за задаване на други стойности в навигацията не осигуряват необходимите стойности на всички етапи на кацане. Като решение този ред беше премахнат от процедурата read_radio () и поставен в съответните секции update_current_flight_mode () в тези режими, при които се изисква ръчна корекция на дроселната клапа.

4. Грешка при навигация по височина - причината за грешката все още не е локализирана и вероятно е в изчислението на PID, но тя се изравнява от функцията, в която се намира речта в параграф 6. Вероятно една от причините е, че те дават отклонение за коригиране на съществуващата грешка, но реакцията на модела се забавя и до В следващия момент, въпреки че съществуващата грешка е отстранена, се появява нова. Укрепването на стойностите на pid чрез задаване на вградените параметри води до колебания на модела по време на остри маневри и точки

5. Грешка в навигацията на курса - причината за грешката все още не е локализирана и вероятно се намира при изчисляването на PID, но тя се изравнява от функцията, в която речта е в параграф 6

6. Резки маневри в близост до точки. за да се избегне това, в зависимост от близостта до точката на пътя, са въведени коефициенти на тежест, които позволяват силно маневриране на голямо разстояние от точките и ограничаване на остри маневри, когато са близо до точката

функция за изчисляване на коефициента. корекция на грешка надморска височина

float K_nav_by_wp_distance ()
<
ако (wp_distance> 100)
<
ако abs (error_error> 60)
< return 1.0f; >друго
>
иначе ако (wp_distance> 22)
< return 1.0f;>
друго
< return 0.1f;>// деактивиране naw близо до точка

7. В ardupilot точка се счита за достигната, ако разстоянието до нея е wp_radius - радиусът, посочен от помощната програма configtoolglobal, заедно с координатите на точките, тоест след достигане на радиуса на точката автопилотът започва да навигира до следващ, не достигащ най-близкото разстояние до точката, ако е възможно, грешката е значителна, ако зададете радиус 20м и го използвате за кацане, логично е да промените кода по такъв начин, че да се счита, че точката е достигната в този момент, след преминаване на радиуса, когато разстоянието от точката започва да се увеличава.

8. по този въпрос, макар че няма какво да се каже, не е изпълнено.

9. Без разглеждане на момента на инерция на модела.
Следващата екранна снимка показва траекторията на излитане на модела до точката на излитане, след това трябва да има спускане до височината на първата пътна точка, но моделът се спуска под необходимата траектория и след това се опитва отново да набере височина