Блок схема алгоритма полетного контроллера.
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 - 18:25
Нужно найти блок схему алгоритма полетного контроллера (любого). Все это нужно для понятия построения алгоритма управления квадрокоптера на ардуине.
if (лететь!) {вжжж!;}if (лететь!) {вжжж!;}чувствуется старый опытный квадрокоптец)))
Вот реализация самолёта на US. а чертить схемы мне лень.
var vector dest,initdir; var bool free=true; var float aleron[2],modvel; simulated function slope(var enum ESlopeDir{ SD_Left, // decrease aleron 0, inc 1 SD_Right, // dec 0, inc 1 SD_Down, // inc both SD_Up, // dec both } SlopeDir){ switch(SlopeDir){ case SD_Left: if(aleron[0]>0) aleron[0]-=1; if(aleron[1]<45) aleron[1]+=1; break; case SD_Right: if(aleron[0]<45) aleron[0]+=1; if(aleron[1]>0) aleron[1]-=1; break; case SD_Down: if(aleron[0]<45) aleron[0]+=1; if(aleron[1]<45) aleron[1]+=1; break; case SD_Up: if(aleron[0]>0) aleron[0]-=1; if(aleron[1]>0) aleron[1]-=1; break; } } simulated function postbeginplay(){ dest=self.location; initdir=vector(self.rotation); aleron[0]=0; aleron[1]=0; self.velocity=vector(self.rotation)*666; // set initial speed settimer(0.1,false); } simulated function timer(){ local vector newdir; local rotator dir; dir=rotator(dest-self.location); if(dir.yaw>65535) dir.yaw%=65536; dir.roll=0; if(dir.pitch<-16383) dir.pitch=16383; if(dir.pitch>18000) dir.pitch=18000; if(free) return; // plane-specific autopilot code /* if(dir.yaw>0) slope(SD_Left); if(dir.yaw<0) slope(SD_Right); if(dir.pitch>0) slope(SD_Down); if(dir.pitch<0) slope(SD_Up); */ // copter-specific autopilot code uses motor speeds modifying // instead of aleron slope modifting // U/UT movable actor native autopilot code /* newdir=normal(dest-self.location); if((newdir dot initdir)>0){ modvel=vsize(self.velocity); self.velocity=modvel*normal(newdir*modvel+self.velocity); setrotation(rotator(self.velocity)); } */ settimer(0.1,true); // autoexec } exec funciton enableautopilot(){ free=false; } exec funciton disableautopilot(){ free=true; } exec function enableRTH(){ free=false; dest=vector(322.0,228.0,1488.0); // home coords }Этот код работает в Unreal Engine любой версии. Чтобы испытать его, нужен любой нестатический актор, например родитель класса Actor или любые его субклассы кроме Decoration, короче любой актор у которого bStatic=false и bMovable=true.
Как написано в коммертарии, для коптера не крутим рули а замедляем/разгоняем двигатели. Существует два кода коптеров, один называется плюс (+), там один двигатель крутится медленнее всех, один быстрее всех, два других на оборотах посередине, обеспечивают высоту. Этот вариант проще реализуется но даёт меньшую скорость. Второй вариант называется крест (х), в нём два двигателя крутятся более медленно, два более быстро, плюс в зависимости от курса ещё есть разница в оборотах быстрых и медленных двигателей. Сложнее код но больше тяга, в соревнованиях используется именно этот вариант.
Если непонятно как это использовать и чем заменить тригонометрию normal(), rotator(), имеющуюся в коде U, то вот как это делается:
Пусть есть две точки, одна собсно самолет, другая пункт назначения. Проведем от самолёта прямую в сторону курса (вектор курса), не факт что пункт назначения на нем окажется. Теперь проведём прямую к пункту назначения, а на векторе курса в плоскости перпендикулярной этому вектору нарисуем "экран" с координатной осью (типа вектор курса это карандаш, который надо воткнуть в лист бумаги, лист будет координатной сеткой). Точка, в которой курс пересекает лист - ноль. Точка на векторе курса, точка самолёта и точка пункта назначения образуют с двумя этими векторами прямоугольный треугольник, угол в котором можно найти зная длину векторов; либо можно крутить рули просто до тех пор пока расстояние между точкой, пересекающей координатный лист и вектором проложенным к пунткту назначения не станет как можно ближе к точке нуля (точке пересечения вектора курса с координатным листом). Собственно, расстояние между нулем и точкой пересечения вектора к пункту назначения и есть третья сторона треугольника, из которого находится угол, на который надо повернуть курс чтобы лететь к объекту.
Фухх, надеюсь понятно.
Если вообще не доходит, то делайте просто систему, в которой 4 ручки управляют газом двигателей, тогда будет взлет - все 4 поднимаем, посадка опускаем, вперёд - две посередине добавляем, крайние убираем, назад наоборот, налево - правые не трогаем левые одну меньше другую больше, направо - то же самое но на правых, левые не трогаем. И фсё :)
Вот реализация самолёта на US. а чертить схемы мне лень.Этот код работает в Unreal Engine любой версии.
Оч познавательно. А на алголе нет аналогичного ;)
или алкоголе. это как esp. или как там называется в машинах на поворотах: или тормозить колеса все кроме..., или наоборот увеличивать крутящий момент всех кроме... конечно всех пропорционально, тригонометрия типа того. хотя наверно и так все знают
Пропорционально - главное. Тогда и Unreal Engine любой версии на квадрокоптер годится;)
Программисты из Анголы, программируют в Алголе, расслабляясь алкоголем.