Симулятор для автопилота SmallTim

Llirik

Вот тут предлагал сделать минисимулятор. Там же изложил назначение сего ПО.

Добрались таки руки до осуществления. Выкладываю первоначальный набросок проги.

С отображением особо не заморачивался, все элементы прорисовываю плоскими. Сх, Су и фокус для всех элементов заданы по одинаковым законам (некий симметричный профиль с критическим углом атаки 30 гр.), но можно сделать разные.

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

Моделька настраивается, подсказки пока не делал, т.ч. чтобы были понятны значения настроек (кроме первого столбца) нажмите паузу в удобном ракурсе и меняйте настройки. На картинке будут отображаться изменения.
Хотелось бы получить советы и конструктивную критику…

Упс… Исправил косячек с ветром… (в последний момент добавил)… Сорри!..

27-11-rev1.rar

AlexSneg

Подписался.
Посмотрел, прикольно. Когда сорвал модель в штопор и попытался выйти, оно несколько нереално работает. Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо. Короче летит в горизонте и вращается по roll как ракета. Так не бывает.

Я так понимаю сейчас чисто сим по управлению в мануале. А вариант со стабилизатором предвидится?

Еще вопрос, а как насчет довести физику и сделать программные интерфейсы для подключения реальных автопилотов. То есть я отдаю свои воздействия, ты отдаешь roll, pitch, yaw, высоту, скорость по земле, скорость по воздуху? Ну протокольчик стандартный организовать. А автопилоты подтянутся под этот протокол? потом ввести специфические искажения для roll, pitch, yaw так чтобы реальности соответствовало.

Llirik
AlexSneg:

Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо.

Пока ломаю голову над этим. У меня прописана составляющая скорости для каждого элемента вызванная вращением. Единственно только, в чем упрощение, это то, что эта составляющая есть угловая скорость на радиус вектор положения элемента (векторно)… На самом то деле для разных участков элемента она должна быть своей, а с учетом квадрата скорости реально должна быть эффективнее… Подумаю как без усложнения модели этот эффект реализовать… Можно конечно ввести некое “трение” на вращении, но это уже подгонка, а хотелось бы максимально законами физики отыграть…

AlexSneg:

Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо.

Пока ломаю голову над этим. У меня прописана составляющая скорости для каждого элемента вызванная вращением. Единственно только, в чем упрощение, это то, что эта составляющая есть угловая скорость на радиус вектор положения элемента (векторно)… На самом то деле для разных участков элемента она должна быть своей, а с учетом квадрата скорости реально должна быть эффективнее… Подумаю как без усложнения модели этот эффект реализовать… Можно конечно ввести некое “трение” на вращении, но это уже подгонка, а хотелось бы максимально законами физики отыграть…

Добавил временно небольшое замедление угловой скорости, обратно пропорциональное ее квадрату… Для нормальной отработки данного эффекта по физике необходимо более подробно описывать геометрию модели…

Sim2-rev2.rar

AlexSneg

Что-то не так накомпилялось. Floating Point Operation Exception и куча окон. Запускаю прямо из архива без ini фала. но первая версия заработала и без ini.

Llirik

без ini не заработает!.. в этом файлике параметры модели и настройки пульта… Если без пульта обойтись можно, то без модели ну никак!..
Экзешник с инишкой должны быть в одном каталоге!..

Я ini не вложил, чтобы Ваши настройки (если Вы их меняли) не сбить…

Надо заняться и сохранение/загрузку моделей сделать будет…

AlexSneg

Клево! Из штопора выходит.
Открой TCP сокет на прослушку, чтобы можно было подключиться и скидывать структуру текущих органов управления, а в обратку кидай структуру положения тела в пространстве. Давай законнектим твой симулятор с реальной платой АП.

Llirik
Llirik:

Добавил временно небольшое замедление угловой скорости, обратно пропорциональное ее квадрату…

Исправил аэродинамику (ошибся немного с углами атаки), соответственно все заработало и без искусственного “торможения”.
Пока разбирался где косяк, пришлось сделать еще одно окошко (вид в самолетной СИ), а так же пошаговое отображение.
На этом виде для каждого элемента следующие линии:

  1. светло серая - радиус вектор от цт к носику САХ
  2. темно серая - САХ
  3. фиалетовая - скорость воздуха в точке носика
  4. зеленая - аэродинамическая сила. Начало в центре давления. ЦД “плавает” только по САХ. Смещение ЦД от скольжения не реализовывал (упрощенка).

Отдельно от элементов:

  1. красная пунктирная - скорость воздуха (в связной системе отчета)
  2. синяя - тяга двигателя

Добавил влияние напора от двигателя на элементы. Теперь можно и висеть и лифтить и на ноже полетать…

Так же сделал сохранение/загрузку моделек.

Что то активности маловато в ветке… Возможно из за непонятности. Поэтому добавил подсказок…

Форму настроек пульта не менял (пульта рядом нет чтобы тестировать). Но если не понятно чего, то:

  1. подключаете пульт через шнурок обычного симулятора.
  2. Если он определился, то в окошке появится его индитификатор.
  3. кликаете по нему и дергаете ручки, чтобы увидеть какой канал чему соответствует.
  4. В соответствующее поле вводите номер нужного канала
  5. Калибровка стандартная…
  6. Тычем “Save” и он запомнится.

Теперь, если пульт подключен, то управление будет с него, а если нет то ползунками “виртуального пульта”.

В папке “Model” сохранил пару моделек для примера. Можете сами создавать свои с нуля или на основе их.

Меня сейчас интересует степень реалистичности поведения. Давайте уж подсказывайте, пожалуйста, что добавить / изменить!..

AlexSneg:

Открой TCP сокет на прослушку

Я далеко не профессиональный программист… Ни разу не делал. Для того, чтобы пульт подцепить просто накопал в инете компонентку для HID-устройств… С внешними девайсами сам только Com портами работал (я имею ввиду программировал)…

30-11-12.rar

Llirik

по поводу TCP посмотрел… Вроде бы ничего сложного…
Только протокол согласовать надо. Какие данные и в каком формате выдавать?

AlexSneg

для правильной связки нужно чтобы я отдавал тебе: roll, pitch, yaw, throttle. Можно в микросекундах 1000 - 2000. Середина - ноль по рулям.
от тебя: в градусах качение, тангаж, рыск. Затем в км/ч (или в м/с) скорость наземная, скорость воздушная. И до кучи высота в метрах.

Обмениваться примерно с частотой 20-25 Гц. Чаще смысла нет.
В пакете первый байт признак того, что за пакет + символизирует начало. Второй байт длина всего пакета. А дальше по 2 байта друг за другом все те значения, что я выше описал.

Тебе открыть сокет на прослушку и ждать соединения. Как соединение пришло начинаешь читать по одному байту. Если признак пакета совпал, читаешь второй байт. Понимаешь сколько еще придет, читаешь их в се в буфер. Как прочитал, начинаешь разбирать значения рулей. по 2 байта на руль. После того как разобрал формируешь в буфере аналогично в обратную сторону признак + длина + значения друг за другом по 2 байта.

Сокет надо не блокирующий и таймаут поставить на 1 секунду на всякий случай, чтобы не виснуть. АП не будет присылать чаще чем 20-25 Гц. то есть ты просто работаешь по факту. Если тебе что-то пришло, то ты в ответ шлешь. Если ничего не пришло, то и не шлешь ничего.

Вот как-то так. Контрольных сумм вводить не надо, все же не модем 😃
Я в понедельник в командировке в Москве. А как приеду смогу тебе пример сокета организовать в Делфе, если хочешь.

Syberian

В делфе юзайте TNMUDP, там еще проще: заслал на порт, ждешь с другого. Одна датаграмма в буфере за один вызов процедуры. Один компонент - один порт. Есть ограничение: только текстовые ASCII-символы, иначе глючит. Т.е. inttostr(), или хекс-кодом передавать: DBC7EA19FF…
Я так линкуюсь с flightgear и между своими утилитками - через TNMUDP.

AlexSneg

Все ж с UDP народу как-то сложнее 😃 Не привыкли люди.
Я за TCP/IP. Компонет в делфе заюзать с закладки Indy. Активировать прослушку на каком-то порту и просто написать обработку callback вызова, когда данные пришли. В той же процедуре кинуть в ответ.
Порт выбери любой выше 1024. Можно его в конфигах настроить.

Llirik

Я вчера вечером с indy компонентами поигрался (впервые)… Все интуитивно понятно. Обмен идет…

На самом то деле я ветку создал не по программированию, а по аэродинамики.

Только видать никому не интересно… Вопросов нет…
Описывать всю логику сил нет, думал будут вопросы - дам ответы. Но то ли все так хорошо, то ли наоборот все очень плохо - вот и нет вопросов…

Упс… Alex про инди опередил…

AlexSneg

Думаешь кто-то тут в аэродинамике шарит? Я так точно не на том уровне чтобы что-то умное сказать. Мне симулятор интересен с точки зрения прикладной пользы.

Syberian
Llirik:

а по аэродинамики.

Дык если симулятор для автопилота Смолтима, то и вопросы должны поступать “оттуда” 😃 Куда нам, мозголетчикам да пиратовцам, до высоких материй 😁
Мне вот лично интересно заиметь адекватный симулятор для мультироторных аппаратов. Практически все симы классической аэродинамики моделируют висение на тяге некорректно, когда оно в таких малых объемах - не хватает разрядности, т.к. пытаются просчитать реальную аэродинамику лопасти 8-дюймового винта. Движки в них также реагируют, как ДВСные, т.е. на полную тягу минимум за секунду.
JSBsim пробовал, врет зараза.

Llirik

По поводу тяги… Я пока не продумывал как имитировать тягу именно винта. У меня просто тяга пропорциональна ручке газа и крутящий момент относительно оси винта не дает… Эт конечно же не совсем верно. По номальному надо и скорость воздуха учитывать и шаг и диаметр. Для коптеров особенно…

Syberian
Llirik:

По номальному надо и скорость воздуха учитывать и шаг и диаметр.

В том-то и прикол, что эти зависимости просты: есть средняя эффективность ВМГ. На 20% газа она от 8 до 12 г/Вт тяги в статике, на 90% газа падает до 6-8. Цифра 8 - это пропы 8 дюймов, 12 - для 14-15 дюймов. Есть огромная матрица наборов ВМГ, но сюрпризов она не несет и “победители” давно просчитаны. Скорость потока вычисляется таблично из шага винтов. от меньших к бОльшим диаметрам она падает, но в среднем около 50-60 кмч.
Сам коптер можно представить как полую сферу радиусом 1/2 длины луча, и все расчеты сводятся к определению проекций векторов тяги и приложению соответствующих сил к сфере.
Фактически, набор входных параметров такой (для квадро):
длина луча
макс. мощность(В*А) мотора
диаметр винта - для грубой прикидки тяговой эффективности г/Вт
взлетный вес
постоянная времени ВМГ, секунд.

Рабочие входные параметры - проценты тяги от 0 до 100 для каждой ВМГ. Линейно связаны с мощностью для простоты.

Последний параметр - самый важный и влияет на всю цепочку управления внутри самого автопилота. Определяет, за сколько мс винтомоторная разовьет полную тягу с нуля. Тут и внутренние тормоза регулятора, и масса пропов, и эффективность мотора, и его мощность. Влияет на маневренность и появление осцилляций в полете.

Аэродинамикой можно пренебречь. На крайняк, ввести простую составляющую сопротивления от скорости по квадратичному закону. Для любых комбинаций ВМГ, массы и проч есть одна закономерность: больше 120 кмч мультиротор просто не разгоняется.

Крутящий момент к тянущему моменту берем как отношение шага винта к диаметру - опять же грубо, для упрощения. Квадрики действительно тормозные на поворот.

===
Забыл про исходящие параметры на автопилот. Нужно:

  • угловые скорости по крену, тангажу и курсу в рад/с в бодифрейме самого пепелаца - имитация 3-осевой гиры
  • крен, курс, тангаж по отношению к земле
  • координаты XYZ в метрах относительно точки запуска
Llirik

Все это смоделировать несложно. Сформулируйте подробное ТЗ. Заодно и в своем симе по нормальному тягу сделаю…

serj

Олег, именно твои допущения не позволят создать достоверную модель. Посоветуйся с Hiker- ом, он также пытался делать мультикоптеры в JSBsim-e и в результате переплевавшись от него переполз на какой-то платный симулятор.

Дело в том , (насколько я понимаю) что аэродинамикой принебрегать никак нельзя, если только квадр не на импеллерах 😃 потому что эффективный шаг сильно зависит от скорости набегающего потока- пропы то малошаговые везде. Также тяга совсем не линейна от мощности, и квадратичный характер уровня энергии ,(запасаемой и поглощаемой пропеллером ) от оборотов учитывать надо…

Syberian
serj:

не позволят создать достоверную модель.

Сейчас нет вообще никакой и нигде. Поделки “типа квадрик” в некоторых модельных симуляторах - это “шкурка” квадрика, натянутая на грубую модель вертолета.
Квадрик от верта отличается тем, что у него инерция по крену-тангажу - как у вертоля по рысканию, т.е. почти никакой. Реагирует моментально. И наоборот: по рысканию мультироторы очень инертны. Особый случай у трикоптера, где хвост поворачивается, но для простоты не будем его рассматривать.

Кирилл, фактически, все формулы и обсчет я уже делал для quad X. Поскольку у меня проблемы с визуализацией результата, дальше дело не пошло. Написал в личку.

AlexSneg

Блин, тоже поддержу Олега. Сим самоль + квадр очень нужен. Мне тоже на квадр в будущем придется апгрейдиться, но собирать реальную дуру я точно не хочу. А для смолтима, пирата или мозголета изначально задумано - так то по фиг. Был бы протокол взаимодействия открыт, а мы тут же подтянемся.

EHOT
Llirik:

Давайте уж подсказывайте, пожалуйста, что добавить / изменить!.

Размещение компонентов растянуто по горизонтали. У кого Wide screen - не заметят, что не все элементы управления помещаются на экране без скролла.

У меня ноут с 1024х768. в новой ревизии нужно скроллом двигать вправо-влево. Плз, разместите компоненты компактней по горизонтали?

Например, если “Начальные условия”, кнопки “пуск-пауза”, “Шаг вперед” разместить ниже, между задатчиком ветра и имитатором пульта и освободившееся пространство занять, то должно получиться.

Llirik

AlexSneg, Syberian, Вы тоже, как и SmallTim, автопилотами занимаетесь?! Если да, то ссылочки можно увидеть на Ваши системы? (Просто любопытство)

Llirik

По поводу тяги и крутящего момента:

Если пренебречь завихрениями, трениями, боковыми составляющими скорости набегающего потока и т.п., то можно представить силы как на картинке (лень было описание делать путевое просто набросал на листочке и отсканировал). Единственно только для тяги забыл у-ковую оставляющую Х-а отнять, а для крутящего момента х-овую составляющую Y-ка прибавить. Но не суть важно (в голове добавить можно), тем более, что подобные интегралы даже с учетом этой забывчивости раскрывать лень (Если только не совсем упрощать, к примеру “оттангенсоподобить” аэродинамические коэффициенты).

Внизу то же самое для статичиекой тяги. Тут попроще, а с учетом упрощения коэффициентов до линейности и сделанной подгонки контура лопасти совсем все упрощается. Т.ч. реакцию винтов в статике можно так сымитировать, для не быстро летящих вверх/вниз коптеров подойдет, но для самолета (когда существенна скорость набегающего потока) это не реалистично будет.

Шаг винта постоянный. Забыл омегу нарисовать, но можно догадаться, что она направлена по оси y.

P.S. Простите за мой корявый почерк!.. 😃

Упс!.. Только что заметил!.. R- конечно же радиус винта, а не диаметр!..

В принципе можно еще так упростить : Принять, что у винта есть некий эффективный диаметр, на котором вся его площадь лопастей сконцентрирована. Тогда интегралы идут отдыхать и можно свободно Су и Сх любые задать (тип лопастей)… Тогда вообще все можно имитировать!..

Горе я математик!.. Угол таки немного не совсем тот арктангенс, а arctg(H/(2*Pi*r)-arctg(Vm/(r*w)… Спешка, однако…