OSD на ATmega1281

lis713
ubd:

Нас уже двое…

C какого двоя? Сергей, опять считать разучился?

msv

Сергей Dacor, у тебя вроде же есть другие АП? В них есть точки? Часто ими пользуешься?
Вспоминаю как Тимофея уламывали… Ну сделал он в конце концов ( у него бизнес, пришлось). Ну и что? Так… кое-кто побаловался и на этом все закончилось…
ПОЧЕМУ, вы не хотите управлять вашими моделями? Ведь в FBW это так просто и ненапряжно… Сознательные вылеты за зону действия РУ/видео имхо не аргумент, а верх расп безалаберного отношения к полетам…
Лучше помогите решить задачку для 8-го класса:
Есть прямая через начало координат, определенная точкой x1y1.
Есть точка с координатами x2y2 в общем случае не на этой прямой.
Найти координаты точек на этой прямой, удаленные от x2y2 на расстояние L…
Желательно не использовать тригонометрию и оптимизировать по количеству умножений/делений.

alexmx
msv:

Лучше помогите решить задачку для 8-го класса:
Есть прямая через начало координат, определенная точкой x1y1.
Есть точка с координатами x2y2 в общем случае не на этой прямой.
Найти координаты точек на этой прямой, удаленные от x2y2 на расстояние L…
Желательно не использовать тригонометрию и оптимизировать по количеству умножений/делений.

Сергей посмотрите библиотеку WildMagic по этой ссылке www.geometrictools.com/Downloads/Downloads.html (файл Wm5IntrLine2Circle2.cpp)
Она с исходниками и код написан очень оптимально.
И плюс есть теоретические выкладки, что тоже полезно для понимания.
bool IntrLine2Circle2::Find (const Vector2& origin, const Vector2& direction, const Vector2& center, Real radius, int& rootCount, Real t[2])
{
// Intersection of a the line P+t*D and the circle |X-C| = R. The line
// direction is unit length. The t value is a root to the quadratic
// equation:
// 0 = |t*D+P-C|^2 - R^2
// = t^2 + 2*Dot(D,P-C)*t + |P-C|^2-R^2
// = t^2 + 2*a1*t + a0
// If two roots are returned, the order is T[0] < T[1].

Vector2 diff = origin - center;
Real a0 = diff.SquaredLength() - radius*radius;
Real a1 = direction.Dot(diff);
Real discr = a1*a1 - a0;
if (discr > ZERO_TOLERANCE) {
rootCount = 2;
discr = Sqrt(discr);
t[0] = -a1 - discr;
t[1] = -a1 + discr;
} else if (discr < -ZERO_TOLERANCE) {
rootCount = 0;
} else // discr == 0
{
rootCount = 1;
t[0] = -a1;
}

return rootCount != 0;
}

Dacor
msv:

Сергей Dacor, у тебя вроде же есть другие АП? В них есть точки? Часто ими пользуешься?

Во всех имеющихся АП нет функции полета по точкам (((. А попробовать хотелось бы.

Да и как звучит:" А я сам себе АП спаял. С возвратом, авто взлетом и посадкой. Да, кстати, он и по точкам летать может. Правда прошивка и разработка не моя, но сделал то все своими руками…"

Это все конечно шутка ))).

ubd

Во всех имеющихся АП нет функции полета по точкам

А в Смалтиме старом разве нет?

Dacor

А у меня нет СмалТима - я не в курсе.

Frr
msv:

Лучше помогите решить задачку для 8-го класса:

Для 8-го наверно так:
Решаем систему равнений {1-е: (x2-x)^2+(y2-y)^2=L^2; и 2-е: x/x1=y/y1; } относительно x,y.
Получаем: x = (±sqrt((y1^2+x1^2)*L^2-(x1*y2-x2*y1)^2) + y1*y2+x1*x2)*x1/(y1^2+x1^2);
соответствующий y=x*y1/x1;
На С:
float x1, x2, y1, y2, L; //на входе
float xy[2 + 2]; //результат
int zad() { //возвр. кол-во решений
float r1, d, a, b;
r1 = x1 * x1 + y1 * y1;
if (r1 <= 0.0)
return -1; // прямая не определена
d = x1 * y2 - x2 * y1;
d = r1 * L * L - d * d; // детерминант
if (d < 0.0)
return 0; //нет решений
a = y1 * y2 + x1 * x2;
if (d == 0.0) { //одно решение
b = a / r1;
xy[0] = b * x1;
xy[1] = b * y1;
return 1; //кол-во решений =1
}
//иначе два решения, d>0
d = sqrt(d);
b = (a + d) / r1; //первое решение
xy[0] = b * x1; //это x
xy[1] = b * y1; //это y
b = (a - d) / r1; //второе решение
xy[2] = b * x1; //это x
xy[3] = b * y1; //это y
return 2; // кол-во реш.=2
}
Подходит?

Иван

Всех с прошедшими!!!
по поводу полёта по точкам, моё мнение - согласен с Сергеем игрушки это, либо спец техника. Самое важное от АП - нужно чтобы “домой” правильно возвращался, причём с вероятностью максимально близкой к 100%

msv
Frr:

Для 8-го наверно так:

Систему уравнений составил такую же. Решение немного другое получилось, наверное где-то ошибся.
Хотел использовать такой подход для последней фазы посадки: курс держать на точку, находящейся на прямой взлета на некотором отдалении от текущей позиции самолета. Что-то слишком навороченная математика получается (ведь почти все придется в long-ах считать, это в меге довольно затратно по времени). Поэтому пока буду делать все в углах: изначальный нужный угол посадки через точку старта считается один раз после старта, текущий угол на точку старта тоже уже считается (для OSD). Осталось найти разницу этих углов и по расстоянию до точки старта (тоже уже считается) элементарно вычислить расстояние (отклонение) до прямой, по которой должен лететь самолет. По этому отклонению простой пропорцией корректировать курс.
В любом случае, спасибо за работу, возможно еще где-то пригодится…

Иван:

по поводу полёта по точкам, моё мнение - согласен с Сергеем игрушки это

Автопосадка в принципе то же баловство… Просто интересная задачка… 😃

ubd

Автопосадка в принципе то же баловство…

Для некоторых не баловство. Есть те кто вообще сажать самолёт не умеет, они то и пользуются посадкой, всегда в автомате. Т.к. вероятность что он его грохнет, меньше…
Ну а взёт, это вообще тема. Просто удобно, когда один в поле.

msv

Ну кто сажать не умеет, не успеет настроить АП…😃

Хочу посоветоваться… Сделал форсирование газа по мин скорости. Реализация пока такая:
В конфигураторе задаются две мин. скорости (GPS и баро).
Если соответствующая текущая скорость (баро, для предотвращения сваливания, или GPS, для движения против ветра) оказывается меньше этих уставок, газ начинает возрастать со скоростью, задаваемой в конфигураторе. До какого значения увеличивать, до абсолютного максимума или максимальной в конфигураторе?
Если скорость становится больше уставок, газ уменьшается до нормального значения. Нужен гистерезис (скока?), или пусть играет газом пытаясь удерживать желанную скорость?
В случае если самолет упадет, к сожалению сначала врубится форсаж, и только через 4сек получения нулевой GPS-скорости, двигатель будет остановлен (если еще будет что останавливать…)… И вообще… что-то, как-то все не нравится мне это…

ubd

Я думаю так:

максимальной в конфигураторе?

Если скорость становится больше уставок, газ уменьшается до нормального значения. Нужен гистерезис (скока?), или пусть играет газом пытаясь удерживать желанную скорость?

Как у старого Смалтима интересно. У него по моему он играет. У него вообще, если упал то будет по потери сознания пытаться взлететь и набрать скорость. У него режима автоматического взлёта и нет. У него режим автовозврата, это и есть автоматический влёт. Т.е. включаешь его он сразу включает двигатель, и пытается лететь.

Я думаю не гистерезис нужно а временную задержку. Не важно какую скорость он наберёт, а то получается режим удержания скорости.

И вообще… что-то, как-то все не нравится мне это…

Нужно пробовать в реале. Сейчас ложно сказать как лучше. Ну и в конфигураторе что бы была возможность, отключать это хозяйство.
Конечно сложно настраивать теперь это всё. Проще как сейчас.

Иван
msv:

Ну кто сажать не умеет, не успеет настроить АП…

Факт!! 😃)

Мне бы хотелось видеть обороты двигуна, к ним наверное можно как то и общее управление прицепить, думаю этим можно переходные процессы облегчить.

lis713
ubd:

У него вообще, если упал то будет по потери сознания пытаться взлететь и набрать скорость

Если ты имеешь ввиду- упал на землю- то смолтим вырубает двигатель и ни куда он не стремится взлететь.

ubd

то смолтим вырубает двигатель и ни куда он не стремится взлететь.

А ну значит у него это есть. Просто я думал, если он при включении режима RTH на земле, пытается взлететь, то он это будет делать и если упадёт. Значит в алгоритме реализован флаг полёта и флаг падения при полёте, значит АП определяет что он встретился с землёй.

Сергей, спроси у baychi, он должен знать как у Смалтима реализован алгоритм добавления газа если скорость GPS меньше минимальной.
И по какому фактору он вырубает двиг на земле, если с ней случайно встретиться.

msv
ubd:

Нужно пробовать в реале.

Это по сути аварийные ситуации… Вряд ли кто захочет специально в них залазить, дабы посмотреть что будет…

Иван:

Мне бы хотелось видеть обороты двигуна, к ним наверное можно как то и общее управление прицепить

Тахометр пока не готов делать, может позже. Кстати была мысль управлять газом не просто значением PPM, а мощностью (имхо это даже правильнее, чем оборотами). Ведь скажем 50% PPM для 11.5В и 9.5В большая разница, квадратичная зависимость мощности от напряжения. Запугался сложностью настройки устойчивого контура регулирования. Для оборотов будет та же проблема.

ubd:

… как у Смалтима реализован алгоритм добавления газа если скорость GPS меньше минимальной.
И по какому фактору он вырубает двиг на земле, если с ней случайно встретиться.

Иногда лишнии знания вредны… 😃 Газ там вроде функция только от скорости (во всяком случае было вроде так). Ну и вряд ли какой волшебный алгоритм можно придумать. Cобытие “сел/упал” на основе имеющихся данных, вероятностное:
Скорость GPS=0- зависли против ветра, не факт что не летим.
Бароскорость не 0- задувает ветер, не факт что летим.
Высота=0, вообще ничего не означает, обсуждали. итп…
Конечно можно накрутить кучу конфигурационных параметров, и благополучно с ними окончательно запутаться…
Пока для определения сделал возможность задавать время, если в течении которого GPS-скорость больше минимальной, значит “полет”.
И время, если GPS скорость равна 0, значит на дереве. Для любителей летать против ветра можно поставить побольше… Но понимать, что при аварии это время двигатель будет еще крутиться. А если еще форсаж включен, тем более…

Иван
msv:

Тахометр пока не готов делать, может позже. Кстати была мысль управлять газом не просто значением PPM, а мощностью (имхо это даже правильнее, чем оборотами). Ведь скажем 50% PPM для 11.5В и 9.5В большая разница, квадратичная зависимость мощности от напряжения. Запугался сложностью настройки устойчивого контура регулирования. Для оборотов будет та же проблема.

это уже очень круто:))

Frr
msv:

Хотел использовать такой подход для последней фазы посадки: курс держать на точку, находящейся на прямой взлета на некотором отдалении от текущей позиции самолета.

Без корней решается такая задача: Найти точку на прямой {(0,0);(x1,y1)}, равноудаленную от (x2,y2) и (0,0).
Решаем: { (x-x2)^2+(y-y2)^2=x^2+y^2; x/x1=y/y1; } относительно x,y.
Получаем: x=x1*(y2^2+x2^2)/(y1*y2+x1*x2)/2; y=y1*(y2^2+x2^2)/(y1*y2+x1*x2)/2;
Кмк. тут хватит char-ов и short-ов из сектора ±60град. от пос.напр.
Точность пос.напр. - пол градуса, положение - 1бит=1м.(удаление 100м.) (или 10м., тогда 1км.)
char x1,y1,x2,y2; short x,y;
int zad2() { short t,z;
t=(y2*y2+x2*x2)/2;z=y1*y2+x1*x2;
x=(x1*t)/z; y=(y1*t)/z;
return 1; }
Траектория - дуга окружности, касательной к ВПП. С изрядной высоты, по маленькой окружности будет похоже на “Баграмский заход”.