Блок схема алгоритма полетного контроллера.

Quadrobot
Offline
Зарегистрирован: 22.12.2016

Нужно найти блок схему алгоритма полетного контроллера (любого). Все это нужно для понятия построения алгоритма управления квадрокоптера на ардуине. 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017
if (лететь!) {вжжж!;}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Клапауций 823 пишет:

if (лететь!) {вжжж!;}

 

чувствуется старый опытный квадрокоптец)))

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Вот реализация самолёта на 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 поднимаем, посадка опускаем, вперёд - две посередине добавляем, крайние убираем, назад наоборот, налево - правые не трогаем левые одну меньше другую больше, направо - то же самое но на правых, левые не трогаем. И фсё :)

Logik
Offline
Зарегистрирован: 05.08.2014

Voodoo Doll пишет:

Вот реализация самолёта на US. а чертить схемы мне лень.Этот код работает в Unreal Engine любой версии. 

Оч познавательно. А на алголе нет аналогичного ;)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

или алкоголе. это как esp. или как там называется в машинах на поворотах: или тормозить колеса все кроме..., или наоборот увеличивать крутящий момент всех кроме... конечно всех пропорционально, тригонометрия типа того. хотя наверно и так все знают

Logik
Offline
Зарегистрирован: 05.08.2014

Пропорционально - главное. Тогда и  Unreal Engine любой версии на квадрокоптер годится;)

 

gena
Offline
Зарегистрирован: 04.11.2012

  Программисты из Анголы, программируют в Алголе, расслабляясь алкоголем.