Симулятор для автопилота SmallTim
Вот тут предлагал сделать минисимулятор. Там же изложил назначение сего ПО.
Добрались таки руки до осуществления. Выкладываю первоначальный набросок проги.
С отображением особо не заморачивался, все элементы прорисовываю плоскими. Сх, Су и фокус для всех элементов заданы по одинаковым законам (некий симметричный профиль с критическим углом атаки 30 гр.), но можно сделать разные.
Фюзеляж на картинке и в расчете не одно и тоже. На картинке просто для понимания прямоугольник рисую, а в расчете - лобовое сопротивление.
Моделька настраивается, подсказки пока не делал, т.ч. чтобы были понятны значения настроек (кроме первого столбца) нажмите паузу в удобном ракурсе и меняйте настройки. На картинке будут отображаться изменения.
Хотелось бы получить советы и конструктивную критику…
Упс… Исправил косячек с ветром… (в последний момент добавил)… Сорри!..
Подписался.
Посмотрел, прикольно. Когда сорвал модель в штопор и попытался выйти, оно несколько нереално работает. Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо. Короче летит в горизонте и вращается по roll как ракета. Так не бывает.
Я так понимаю сейчас чисто сим по управлению в мануале. А вариант со стабилизатором предвидится?
Еще вопрос, а как насчет довести физику и сделать программные интерфейсы для подключения реальных автопилотов. То есть я отдаю свои воздействия, ты отдаешь roll, pitch, yaw, высоту, скорость по земле, скорость по воздуху? Ну протокольчик стандартный организовать. А автопилоты подтянутся под этот протокол? потом ввести специфические искажения для roll, pitch, yaw так чтобы реальности соответствовало.
Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо.
Пока ломаю голову над этим. У меня прописана составляющая скорости для каждого элемента вызванная вращением. Единственно только, в чем упрощение, это то, что эта составляющая есть угловая скорость на радиус вектор положения элемента (векторно)… На самом то деле для разных участков элемента она должна быть своей, а с учетом квадрата скорости реально должна быть эффективнее… Подумаю как без усложнения модели этот эффект реализовать… Можно конечно ввести некое “трение” на вращении, но это уже подгонка, а хотелось бы максимально законами физики отыграть…
Вращение не прерывает, несмотря на то, что вышло в горизонт и все рули прямо.
Пока ломаю голову над этим. У меня прописана составляющая скорости для каждого элемента вызванная вращением. Единственно только, в чем упрощение, это то, что эта составляющая есть угловая скорость на радиус вектор положения элемента (векторно)… На самом то деле для разных участков элемента она должна быть своей, а с учетом квадрата скорости реально должна быть эффективнее… Подумаю как без усложнения модели этот эффект реализовать… Можно конечно ввести некое “трение” на вращении, но это уже подгонка, а хотелось бы максимально законами физики отыграть…
Добавил временно небольшое замедление угловой скорости, обратно пропорциональное ее квадрату… Для нормальной отработки данного эффекта по физике необходимо более подробно описывать геометрию модели…
Что-то не так накомпилялось. Floating Point Operation Exception и куча окон. Запускаю прямо из архива без ini фала. но первая версия заработала и без ini.
без ini не заработает!.. в этом файлике параметры модели и настройки пульта… Если без пульта обойтись можно, то без модели ну никак!..
Экзешник с инишкой должны быть в одном каталоге!..
Я ini не вложил, чтобы Ваши настройки (если Вы их меняли) не сбить…
Надо заняться и сохранение/загрузку моделей сделать будет…
Клево! Из штопора выходит.
Открой TCP сокет на прослушку, чтобы можно было подключиться и скидывать структуру текущих органов управления, а в обратку кидай структуру положения тела в пространстве. Давай законнектим твой симулятор с реальной платой АП.
Добавил временно небольшое замедление угловой скорости, обратно пропорциональное ее квадрату…
Исправил аэродинамику (ошибся немного с углами атаки), соответственно все заработало и без искусственного “торможения”.
Пока разбирался где косяк, пришлось сделать еще одно окошко (вид в самолетной СИ), а так же пошаговое отображение.
На этом виде для каждого элемента следующие линии:
- светло серая - радиус вектор от цт к носику САХ
- темно серая - САХ
- фиалетовая - скорость воздуха в точке носика
- зеленая - аэродинамическая сила. Начало в центре давления. ЦД “плавает” только по САХ. Смещение ЦД от скольжения не реализовывал (упрощенка).
Отдельно от элементов:
- красная пунктирная - скорость воздуха (в связной системе отчета)
- синяя - тяга двигателя
Добавил влияние напора от двигателя на элементы. Теперь можно и висеть и лифтить и на ноже полетать…
Так же сделал сохранение/загрузку моделек.
Что то активности маловато в ветке… Возможно из за непонятности. Поэтому добавил подсказок…
Форму настроек пульта не менял (пульта рядом нет чтобы тестировать). Но если не понятно чего, то:
- подключаете пульт через шнурок обычного симулятора.
- Если он определился, то в окошке появится его индитификатор.
- кликаете по нему и дергаете ручки, чтобы увидеть какой канал чему соответствует.
- В соответствующее поле вводите номер нужного канала
- Калибровка стандартная…
- Тычем “Save” и он запомнится.
Теперь, если пульт подключен, то управление будет с него, а если нет то ползунками “виртуального пульта”.
В папке “Model” сохранил пару моделек для примера. Можете сами создавать свои с нуля или на основе их.
Меня сейчас интересует степень реалистичности поведения. Давайте уж подсказывайте, пожалуйста, что добавить / изменить!..
Открой TCP сокет на прослушку
Я далеко не профессиональный программист… Ни разу не делал. Для того, чтобы пульт подцепить просто накопал в инете компонентку для HID-устройств… С внешними девайсами сам только Com портами работал (я имею ввиду программировал)…
по поводу TCP посмотрел… Вроде бы ничего сложного…
Только протокол согласовать надо. Какие данные и в каком формате выдавать?
для правильной связки нужно чтобы я отдавал тебе: roll, pitch, yaw, throttle. Можно в микросекундах 1000 - 2000. Середина - ноль по рулям.
от тебя: в градусах качение, тангаж, рыск. Затем в км/ч (или в м/с) скорость наземная, скорость воздушная. И до кучи высота в метрах.
Обмениваться примерно с частотой 20-25 Гц. Чаще смысла нет.
В пакете первый байт признак того, что за пакет + символизирует начало. Второй байт длина всего пакета. А дальше по 2 байта друг за другом все те значения, что я выше описал.
Тебе открыть сокет на прослушку и ждать соединения. Как соединение пришло начинаешь читать по одному байту. Если признак пакета совпал, читаешь второй байт. Понимаешь сколько еще придет, читаешь их в се в буфер. Как прочитал, начинаешь разбирать значения рулей. по 2 байта на руль. После того как разобрал формируешь в буфере аналогично в обратную сторону признак + длина + значения друг за другом по 2 байта.
Сокет надо не блокирующий и таймаут поставить на 1 секунду на всякий случай, чтобы не виснуть. АП не будет присылать чаще чем 20-25 Гц. то есть ты просто работаешь по факту. Если тебе что-то пришло, то ты в ответ шлешь. Если ничего не пришло, то и не шлешь ничего.
Вот как-то так. Контрольных сумм вводить не надо, все же не модем 😃
Я в понедельник в командировке в Москве. А как приеду смогу тебе пример сокета организовать в Делфе, если хочешь.
В делфе юзайте TNMUDP, там еще проще: заслал на порт, ждешь с другого. Одна датаграмма в буфере за один вызов процедуры. Один компонент - один порт. Есть ограничение: только текстовые ASCII-символы, иначе глючит. Т.е. inttostr(), или хекс-кодом передавать: DBC7EA19FF…
Я так линкуюсь с flightgear и между своими утилитками - через TNMUDP.
Все ж с UDP народу как-то сложнее 😃 Не привыкли люди.
Я за TCP/IP. Компонет в делфе заюзать с закладки Indy. Активировать прослушку на каком-то порту и просто написать обработку callback вызова, когда данные пришли. В той же процедуре кинуть в ответ.
Порт выбери любой выше 1024. Можно его в конфигах настроить.
Я вчера вечером с indy компонентами поигрался (впервые)… Все интуитивно понятно. Обмен идет…
На самом то деле я ветку создал не по программированию, а по аэродинамики.
Только видать никому не интересно… Вопросов нет…
Описывать всю логику сил нет, думал будут вопросы - дам ответы. Но то ли все так хорошо, то ли наоборот все очень плохо - вот и нет вопросов…
Упс… Alex про инди опередил…
Думаешь кто-то тут в аэродинамике шарит? Я так точно не на том уровне чтобы что-то умное сказать. Мне симулятор интересен с точки зрения прикладной пользы.
а по аэродинамики.
Дык если симулятор для автопилота Смолтима, то и вопросы должны поступать “оттуда” 😃 Куда нам, мозголетчикам да пиратовцам, до высоких материй 😁
Мне вот лично интересно заиметь адекватный симулятор для мультироторных аппаратов. Практически все симы классической аэродинамики моделируют висение на тяге некорректно, когда оно в таких малых объемах - не хватает разрядности, т.к. пытаются просчитать реальную аэродинамику лопасти 8-дюймового винта. Движки в них также реагируют, как ДВСные, т.е. на полную тягу минимум за секунду.
JSBsim пробовал, врет зараза.
По поводу тяги… Я пока не продумывал как имитировать тягу именно винта. У меня просто тяга пропорциональна ручке газа и крутящий момент относительно оси винта не дает… Эт конечно же не совсем верно. По номальному надо и скорость воздуха учитывать и шаг и диаметр. Для коптеров особенно…
По номальному надо и скорость воздуха учитывать и шаг и диаметр.
В том-то и прикол, что эти зависимости просты: есть средняя эффективность ВМГ. На 20% газа она от 8 до 12 г/Вт тяги в статике, на 90% газа падает до 6-8. Цифра 8 - это пропы 8 дюймов, 12 - для 14-15 дюймов. Есть огромная матрица наборов ВМГ, но сюрпризов она не несет и “победители” давно просчитаны. Скорость потока вычисляется таблично из шага винтов. от меньших к бОльшим диаметрам она падает, но в среднем около 50-60 кмч.
Сам коптер можно представить как полую сферу радиусом 1/2 длины луча, и все расчеты сводятся к определению проекций векторов тяги и приложению соответствующих сил к сфере.
Фактически, набор входных параметров такой (для квадро):
длина луча
макс. мощность(В*А) мотора
диаметр винта - для грубой прикидки тяговой эффективности г/Вт
взлетный вес
постоянная времени ВМГ, секунд.
Рабочие входные параметры - проценты тяги от 0 до 100 для каждой ВМГ. Линейно связаны с мощностью для простоты.
Последний параметр - самый важный и влияет на всю цепочку управления внутри самого автопилота. Определяет, за сколько мс винтомоторная разовьет полную тягу с нуля. Тут и внутренние тормоза регулятора, и масса пропов, и эффективность мотора, и его мощность. Влияет на маневренность и появление осцилляций в полете.
Аэродинамикой можно пренебречь. На крайняк, ввести простую составляющую сопротивления от скорости по квадратичному закону. Для любых комбинаций ВМГ, массы и проч есть одна закономерность: больше 120 кмч мультиротор просто не разгоняется.
Крутящий момент к тянущему моменту берем как отношение шага винта к диаметру - опять же грубо, для упрощения. Квадрики действительно тормозные на поворот.
===
Забыл про исходящие параметры на автопилот. Нужно:
- угловые скорости по крену, тангажу и курсу в рад/с в бодифрейме самого пепелаца - имитация 3-осевой гиры
- крен, курс, тангаж по отношению к земле
- координаты XYZ в метрах относительно точки запуска
Все это смоделировать несложно. Сформулируйте подробное ТЗ. Заодно и в своем симе по нормальному тягу сделаю…
Олег, именно твои допущения не позволят создать достоверную модель. Посоветуйся с Hiker- ом, он также пытался делать мультикоптеры в JSBsim-e и в результате переплевавшись от него переполз на какой-то платный симулятор.
Дело в том , (насколько я понимаю) что аэродинамикой принебрегать никак нельзя, если только квадр не на импеллерах 😃 потому что эффективный шаг сильно зависит от скорости набегающего потока- пропы то малошаговые везде. Также тяга совсем не линейна от мощности, и квадратичный характер уровня энергии ,(запасаемой и поглощаемой пропеллером ) от оборотов учитывать надо…
не позволят создать достоверную модель.
Сейчас нет вообще никакой и нигде. Поделки “типа квадрик” в некоторых модельных симуляторах - это “шкурка” квадрика, натянутая на грубую модель вертолета.
Квадрик от верта отличается тем, что у него инерция по крену-тангажу - как у вертоля по рысканию, т.е. почти никакой. Реагирует моментально. И наоборот: по рысканию мультироторы очень инертны. Особый случай у трикоптера, где хвост поворачивается, но для простоты не будем его рассматривать.
Кирилл, фактически, все формулы и обсчет я уже делал для quad X. Поскольку у меня проблемы с визуализацией результата, дальше дело не пошло. Написал в личку.
Блин, тоже поддержу Олега. Сим самоль + квадр очень нужен. Мне тоже на квадр в будущем придется апгрейдиться, но собирать реальную дуру я точно не хочу. А для смолтима, пирата или мозголета изначально задумано - так то по фиг. Был бы протокол взаимодействия открыт, а мы тут же подтянемся.