Симулятор для автопилота 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. Поскольку у меня проблемы с визуализацией результата, дальше дело не пошло. Написал в личку.