Перейти к содержимому


Свернуть чат Чат Открыть чат во всплывающем окне

lz : (2 недель назад) Оно там просто всё вместе лежит.
Folgen : (2 недель назад) Даже сам Товарищ Майор не нашел бы.
Folgen : (2 недель назад) Ого, ребусы.
lz : (2 недель назад) Я там постоянно.
lz : (2 недель назад) Можно початиться в реалтайме в телеге - https://t.me/joincha...j5MKUrxakTyCPwQ
lz : (2 недель назад) Тулзы качаются программой bootstrap_tools из бутстраппера (как скачать - у меня в подписи). Если хочется самим собирать, отпишитесь ещё, я инструкции по сборке допишу.
PA3UJIb : (2 недель назад) по ходу это из LLVM
PA3UJIb : (2 недель назад) cmake скрипты недописаны. А заголовочники сначала подумал, что из boost, но и там такого не нашел
Folgen : (2 недель назад) У меня вообще фигня с СиМэйк. Я уж подумал ну его. А там хедеры нужны от Полигона4.
Folgen : (2 недель назад) Вот-вот!
PA3UJIb : (2 недель назад) Не знаю, я не смог его "tools" собрать - многих заголовочных нету и хз где их брать.
Гость : (3 недель назад) У кого-нибудь есть полный пак инструментария от lz?
Yakim (Watco... : (14 Июль 2018 - 00:06) :D
Yakim (Watco... : (14 Июль 2018 - 00:06) nope
Yandersen : (13 Июль 2018 - 22:07) Айаяй. Поди Якимко заспамил чат стикерами. :)
Yandersen : (13 Июль 2018 - 22:06) Да лан, тут каждый день кто-нить из админов заглядывает. Как пропустили?
Nextovoy : (13 Июль 2018 - 01:04) Я писал
Гость : (10 Июль 2018 - 22:42) Сорьки, что так у нас. Чего три года так и не попытался в чат писнуть? :)
Nextovoy : (06 Июль 2018 - 16:15) Спасибо
lz : (04 Июль 2018 - 19:44) Активировал.
Гость : (03 Июль 2018 - 16:30) Активируйте его.
Гость : (03 Июль 2018 - 16:30) Мой профиль - Nextovoy
Гость : (03 Июль 2018 - 16:25) Написать в чат. Профиль в ручную админы активируют.
Гость : (03 Июль 2018 - 15:47) Ох уж эта дурацкая привычка писать всё раздельно засоряя чат. Это всё классно, конечно, но ребята, одменестраторы, так называемые. Третий год пытаюсь зарегистрироваться (буквально, третий) на этом форуме, но ПИСЬМО С ПОДТВЕРЖДЕНИЕМ НА ПОЧТУ ТАК И НЕ ПРИХОДИТ. Что делать?
Гость : (03 Июль 2018 - 15:46) Перешёл я всё же по ссылке Redoctor'a...
Гость : (03 Июль 2018 - 15:41) Пора уже M4
Гость : (29 Июнь 2018 - 00:18) итак м3
lz : (28 Июнь 2018 - 16:01) Мы тебе и тут передадим.
Гость : (28 Июнь 2018 - 13:13) Зачем в телеграмме делать?!Я вот например не могу зайти,написать в чат,подписаться и не только у меня это.
Redoctor : (24 Июнь 2018 - 19:35) https://vk.com/away....0_23001&cc_key=
Redoctor : (24 Июнь 2018 - 19:34) Тогда в телеграмме в поисковике набери Механоиды 3
Гость : (24 Июнь 2018 - 19:05) Не открывается.
Redoctor : (24 Июнь 2018 - 18:00) https://t.me/mechanoids3 Для тех кто в танке.
Yakim (Watco... : (15 Июнь 2018 - 01:33) КРУЗИИИС!!!11

Изображение
lz : (15 Июнь 2018 - 00:09) КРУЗИС!
lz : (15 Июнь 2018 - 00:09) ЗИС
lz : (15 Июнь 2018 - 00:09) КРУ
Yakim (Watco... : (14 Июнь 2018 - 14:50) Крузис и Королева тоже не в моем вкусе, а проигрывать нечего =D
lz : (14 Июнь 2018 - 13:55) Конечно, полюбить - так королеву, проиграть - так миллион, сделать - так крузис.
smt005 : (14 Июнь 2018 - 00:22) И от третьего лица тоже можно сделать простенькую игру. Простая игра это лучше чем ничего.
smt005 : (14 Июнь 2018 - 00:21) А, ты хочеш что-бы хит был, с "Crysis" графоном и контентом на 100500 часов игры?
Yakim (Watco... : (14 Июнь 2018 - 00:18) Ни топдовншутеры, ни стратежки)
Yakim (Watco... : (14 Июнь 2018 - 00:15) Не, спасибо, не в моем вкусе=)
smt005 : (13 Июнь 2018 - 23:13) Помнится за пару недель от скуки сделал. Делал по вечерам.
smt005 : (13 Июнь 2018 - 23:13)

Фотография
- - - - -

Механика глайдера


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 29

#21 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 30 Июль 2014 - 04:11

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

 

Общая картина ещё раз. Глайдер оснащён движками и гравиками. Оба типа силовых элементов характеризуются точкой крепления (точка приложения силы) и направлением действия (вектор силы). Количество устройств условно не ограничено (на практике - около десятка девайсов в различных точках глайда понаприлеплено). Посредством изменения мощности отдельных силовых агрегатов Антиграв приводит глайдер в движение.

 

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

 

Рассмотрим задачу на уровне одной точки. Как нам максимально быстро переместить точку из текущей позиции в желаемую, и чтобы точка там и осталась (а то глайдер будет болтаться туда-сюда из-за инерции)? Очевидно, часть пути нам нужно толкать точку в указанном направлении с максимально возможной силой, а часть пути - тормозить, опять же, максимально быстро, чтобы погасить скорость в ноль к моменту достижения желаемой позиции.

 

Чтобы такое перемещение обеспечить, общо говоря, Антиграв должен первую часть пути (разгон) держать включенными те движки, что обеспечат точке ускорение, сонаправленное с вектором перемещения в желаемую позицию, а вторую часть пути (торможение) нужно включить те движки, что обеспечат точке ускорение в противоположном направлении.

 

Очевидно, что вектор ускорения, приобретаемый точкой при включении каждого из движков в большинстве случаев не совпадает чётко с вектором желаемого перемещения. Поэтому мы говорим о проекции реального ускорения на желаемое направление (результат скалярного произведения этих векторов) - если проекция положительная, значит хоть какая-то часть от ускорения нам полезна. Эту часть мы и рассматриваем. Выбрав движки, дающие нам хоть сколько-то положительного ускорения, мы суммируем ускорения и получаем, скажем так, максимально возможное ускорение, которое Антиграв может нам обеспечить в данном направлении.

 

Однако чтобы определить, когда начать тормозить, нам нужно оценить максимум ускорения, который мы можем получить в данной точке в направлении, противоположном направлению желаемого перемещения. Ведь если не начать тормозить вовремя, мы не успеем погасить скорость к моменту достижения точкой желаемого положения и пролетим мимо. Зная текущую скорость и неизбежное ускорение (под действием сил нам не подвластных), а также оценочное значение максимально возможного отрицательного ускорения (которое Антиграв нам может обеспечить), мы легко можем предсказать, сколько минимум времени нам потребуется, чтобы остановиться, если мы начнём это делать прямо сейчас (подразумевая, что условия не изменятся). Если по прикидкам окажется, что остановиться мы сможем лишь пролетя мимо желаемой позиции, значит пора тормозить изо всех сил. А лучше начинать зарание - когда оценочная позиция остановки оказывается близка к желаемому положению.

 

Вторая проблема - другие точки. Легко решать задачу для одной точки, но если ресурсы общие, а требования по включению движков от разных точек поступают разные, мы получаем конфликт: одна точка требует выключить движок, а вторая - включить. Однозначно, обе опорные точки разом осчастливить не удастся (даже если на половинную мощность движок приспустить, это всё равно порушит планы обоих точек), а отдавать приоритет одной из точек необосновано - нельзя.

 

Очевидное следствие - нельзя при рассчётах максимального ускорения полагать, что Антиграв будет способен его обеспечить. А это значит, начинать тормозить нужно заранее. Также нечестно по отношению к интересам других опорных точек будет требовать от Антиграва обеспечить максимум тяги в нужном направлении (т.е. нельзя ресурсы на 100% использовать, поскольку они и другим нужны).

 

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

 

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

 

Итак, алгоритм мне видится следующий:

 

0) Находим вектор перемещения из текущей позиции в желаемую для каждой из опорных точек.

 

1) Для каждой из точек находим приоритет для разгона, который тем выше, чем точка дальше от своей желаемой позиции: расстояние, домноженное на константу нормирования мы умножаем на проекцию вектора ускорения, который Антиграв может обеспечить в направлении желаемого перемещения точки. Полученное значение есть требование ускорения в варианте разгона. Константа нормирования определяет расстояние, соответствующее 100% запрашиваемых моторесурсов.

 

2) Для каждой из точек оцениваем внешнее плюс максимально возможное ускорение в варианте торможения (т.е. проекция ускорения на вектор, противоположно направленный вектору желаемого перемещения). Если точка в данный момент удаляется от желаемой позиции (проекция вектора движения на вектор желаемого перемещения отрицательна), то приоритет торможения нулевой. Если же нет (приближаемся к желаемой позиции), то находим отношение длины тормозного пути (dS=0.5*v*v/a) к длине вектора перемещения до желаемой позиции и получаем приоритет для торможения - он будет возрастать по мере приближения оценочной позиции остановки к желаемой позиции. В частности, приоритет торможения будет равен 1 если оценочная позиция остановки совпадает с желаемой позицией. Умножаем это значение на проекцию вектора ускорения, который Антиграв может обеспечить в направлении, противоположном желаемому перемещению точки. Полученное значение есть требование ускорения в варианте торможения.

 

3) От требования разгона отнимаем требование торможения (оба ведь требовать бессмысленно, хотя математически возможно). Полученное значение - это проекция требуемого ускорения на вектор желаемого пермещения точки. Если приоритеты разгона и торможения были меньше 1, то требуемое ускорение Антиграв обеспечить способен, используя менее 100% своих моторесурсов.

 

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

 

5) Для каждой точки будем двигаться вниз по списку движков и обрабатывать по одному движку за раз. Для этого вычисляем проекцию ускорения, что придаёт рассматриваемый движок данной точке на максимуме мощности. Если это значение выше требуемого, пропорционально уменьшаем требуемую мощность. Отсылаем этот запрос желаемой мощности в общую копилку запросов для данного движка. Также в запросе указываем сонаправленность направления ускорения от данного движка с требуемым. Это значение будет служить весовым коэффициентом при смешивании запросов от разных точек для данного движка. Отослав запрос, вычитаем из требуемого ускорения то ускорение, что движок нам обеспечит. Если этого недостаточно, переходим к следующему движку в списке и делаем то же самое. И так двигаемся вниз по списку движков до тех пор, пока не раскидаем требуемое ускорение полностью.

 

6) По оканчании цикла в корзинах запросов всех движков оказывается от 0 до Х запросов (Х=количество опорных точек). Если запросов нет, движок выключается. Если запросы есть, смешиваем их пропорционально весовым коэффициентам: для каждого запроса умножаем значение запрашиваемой мощности на отношение веса запроса к сумарному весу всех запросов, после чего полученные значения суммируем и получаем требуемое значение мощности, на которое движок нужно установить.

 

Всё вроде бы.  :)



#22 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 30 Июль 2014 - 09:32

Так я не понял, если точек несколько, не приведет ли описанная модель к тому, что они всё будут стремиться в точку назначения. То есть глайд на финише сложится сам в себя?

 


#23 OFFLINE   SHW

SHW

    Разработчик

  • Создатель
  • 32 сообщений
  • Откуда:Самара
  • Настоящее имя:Слава

Отправлено 30 Июль 2014 - 11:15

Я смотрю, вы так и не осилили уравнение движения в общем виде, вот и придумываете какие-то опорные точки.

Собирался написать много умного, но не буду, вы всё равно меня не слушаете.

Так что пилите, хочется увидеть, что у вас получится.


Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.

#24 OFFLINE   Taugeshtu

Taugeshtu
  • Создатель
  • 36 сообщений

Отправлено 30 Июль 2014 - 12:29


Я смотрю, вы так и не осилили уравнение движения в общем виде, вот и придумываете какие-то опорные точки.

Собирался написать много умного, но не буду, вы всё равно меня не слушаете.

А ты возьми и напиши. "Опорные точки" - идея Шамана. Я колдую с коэффициентами движков на основе других данных.

С моей точки зрения, проблема сводится к следующей мат. задаче:
Есть множество векторов N, такое, что для каждого вектора ni существует коэффициент ki. Есть целевой вектор x. И нужно найти такие значения коэффициентов ki, что сумма y = k1n1 + k2n2 + k3n3 + ... kmnm максимально близка к "x".

Как решать эту задачку?)

 

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

 

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

 

Может, я как-то не так понимаю ТАУ, и её можно применять в пределах одного кадра?


, наверное...


#25 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 30 Июль 2014 - 14:03


Есть множество векторов N, такое, что для каждого вектора ni существует коэффициент ki. Есть целевой вектор x. И нужно найти такие значения коэффициентов ki, что сумма y = k1n1 + k2n2 + k3n3 + ... kmnm максимально близка к "x". Как решать эту задачку?)
У этой задачки может быть как бесконечное множество решений, так и ни одного. Сколько k, столько и уравнений у тебя должно быть.

#26 OFFLINE   SHW

SHW

    Разработчик

  • Создатель
  • 32 сообщений
  • Откуда:Самара
  • Настоящее имя:Слава

Отправлено 30 Июль 2014 - 18:42


А ты возьми и напиши.


Я и писал. Больше не буду.



Шаман правильно заметил, у вашей системы в зависимости от ранга матрицы будет 0, 1, или бесконечное количество решений. В большинстве случаев у вас будет бесконечное количество решений, какое из них выбирать - дело дополнительного критерия оптимизации. В физическом движке это похоже на проблему коллизий, когда ящик с четырьмя углами лежит на полу, силы по этим четырём точкам касания можно распределить бесконечным количеством способов. Обычно выбирают критерий, чтобы эти силы как можно меньше отличались друг от друга, после чего итеративно решают систему, проверяя критерий оптимизации.






Может, я как-то не так понимаю ТАУ, и её можно применять в пределах одного кадра?


Конечно можно. В ТАУ вы фактически и оперируете "кадром". У вас есть передаточная функция и регулятор в виде дифференциальных уравнений. И вы решаете это дифференциальное уравнение численно в каждом "кадре" (dt).



Чтобы пощупать "ближе к телу" можете глянуть статьи по управлению мультикоптерами. У них идея очень похожа на вашу. Есть n двигателей, 4 канала управления от пользователя (крен, тангаж, тяга, вращение вокруг вертикальной оси), акселерометры и гироскопы для измерения ориентации и скорости вращения коптера (вы можете читерить и получить их из физического движка без лишнего геморроя). Нужно написать программу управления скоростью вращения двигателями.
Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.

#27 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 30 Июль 2014 - 23:14

Я смотрю, вы так и не осилили уравнение движения в общем виде, вот и придумываете какие-то опорные точки.

В общем виде это будет вектор перемещения плюс угол вращения вокруг оси. Это две задачи для решения, причём разного типа (угловое вращение, измеряемой в градусах, и линейное перемещение - вектор). Но если интерпретировать Цель через 3 опорные точки, то задач уже 3, но все они одного типа (вектора перемещения для каждой точки). Поскольку все задачи решаются одним общим функционалом (набор движков), то неизбежно придётся варьировать приоритеты задач. Когда все задачи одного типа, то и коэффициенты приоритета распределять проще: чем дальше опорная точка от желаемого положения, тем больший приоритет имеет задача по перемещению именно этой точки. Если же у нас угол и вектор, то придётся вводить абстрактные коэффициенты - как интерпретировать отклонение угловое относительно разности векторной. Это как сравнивать стрингу с интом.

 

Ну и не забываем о второй задачи Антиграва - держать глайд над поверхностью. Как бы юзер не хотел переместить глайд, а касания корпуса с землёй допускать нельзя. Соответственно, на выступающих точках поверхности сенсоры нужны, дабы сигнализировать близость поверхности. В универсальной интерпретации опорных точек как задач для Антиграва мы переводим сигнал сенсора в требование ускорения в сторону, противоположную поверхности. Таким образом, универсальный контроллер движков, в моём понимании, это система, на вход которой каждый фрейм подаётся N опорных точек со своими требуемыми векторами ускорения, и контроллер должен обеспечить им всем эти ускорения.

 

Таким образом, Цель работы Антиграва - минимизировать сумму длин всех запрошенных векторов ускорения. Решение мне видится итерационным: берём каждый отдельный движок и смотрим, на какую мощность его нужно установить, чтобы сумма всех запрошенных ускорений стала как можно меньше (нужно столько-то, после включения движка остаётся столько-то - чем сильнее требование гасится, тем лучше). Для этого считаем вектор ускорения, приобретаемый каждой опорной точкой при включении этого движка на 100% мощности. Длины полученных векторов зависят от "оборотов" движка - если на 50% его врубить, то и длины всех векторочков будут в 2 раза меньше. Нам нужно выбрать такие обороты движка, при которых сумма разностей векторов ускорений желаемых с приобретёнными будет минимальной.

 

Ну вот допустим точка n хочет вектор ускорения A_requestedn, а включение движка на 100% придаёт ей ускорение A_addn. Таким образом, если тяга движка равна Power (скаляр), то получив ускорение от движка, желаемое ускорение точки измениться. Нам надо, чтобы оно уменьшилось:

A_errorn = A_requestedn + Power*A_addn;

Цель - найти такое значение Power, при котором сумма векторов A_error для всех опорных точек будет минимальной. Это уже уравнение с одной неизвестной. Итерационно обходим так все движки, пересчитывая A_requestedn в конце каждого цикла обсчёта движка и получаем в итоге для всех движков требуемые значения мощностей.  :)



#28 OFFLINE   SHW

SHW

    Разработчик

  • Создатель
  • 32 сообщений
  • Откуда:Самара
  • Настоящее имя:Слава

Отправлено 31 Июль 2014 - 14:23

Кстати, можно повтыкать в Robocraft. Там можно делать довольно сложных роботов. Банальные машинки, ховеры, самолёты, шагающих роботов. Может какие идеи оттуда почерпнёте.


Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.

#29 OFFLINE   SHW

SHW

    Разработчик

  • Создатель
  • 32 сообщений
  • Откуда:Самара
  • Настоящее имя:Слава

Отправлено 31 Июль 2014 - 19:35


Но если интерпретировать Цель через 3 опорные точки, то задач уже 3, но все они одного типа (вектора перемещения для каждой точки).

 

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


Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.

#30 OFFLINE   SHW

SHW

    Разработчик

  • Создатель
  • 32 сообщений
  • Откуда:Самара
  • Настоящее имя:Слава

Отправлено 03 Август 2014 - 07:23


Кстати, можно повтыкать в Robocraft.

Есть ещё RawBots. Он выглядит более продвинуто, там даже программировать роботов можно.


Your mind is software. Program it.
Your body is a shell. Change it.
Death is a disease. Cure it.




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных