Как я строил гексапод в Space Engineers. Часть 1
Здравствуйте. Я хочу рассказать про проектирование и программирование системы управления конечностями в гексаподе, построенном в Space Engineers.
Забегая вперед скажу, что всё, что касается программирования в Space Engineer, будет в следующей статье. В этой я расскажу про обратную кинематику и покажу прототип на HTML Canvas в котором я занимался отладкой алгоритмов.
Предыстория и постановка задачи.
Изначально было построено сочлененное шасси, а затем на нем копательный агрегат. Такая конфигурация обеспечивала контакт всх колес с поверхностью на больших неровностях, в том числе и при скручивании.
Но я столкнулся с невозожностью его точно разместить на месторождении, так-как колеса часто соскальзывали вниз (проблема физики — большинство блоков (в том числе и колеса) имеют слишком малый коэффициент трения). Колесная платформа с цельноповоротными колесными модулями оказалась слишком громоздкой и страдала от периодических physics explosion. В результате было решено строить шагающего робота — а именно — гексапод, как самую стабильную шагаюшую платфрому.
С чего начнет строить гексапод нормальный человек? Наверное зайдет в игру и начнет строить тело робота с конечностями, а потом думать как это всё оживлять. Но это не наш метод (ц)
Я начал с теории
Для строения ноги была выбрана следующая схема:
Inner joint — внутренний сустав, качающийся по оси рысканья (yaw)
Mid joint и outer joint — внешние суставы, качающиеся по оси тангажа (pitch). Направление отсчета — от основания ноги к концу ноги.
Угол 0 для всех суставов означает, что нога полностью выпрямлена (прямую ногу будет проще строить в игре).
Задача — при заданной целевой точке найти такие углы поворота сустовов, что-бы конец ноги оказался в заданной точке. Значит время вспоминать тригонометрию.
Угол внутреннего сустава можно найти через арктангенс горизонтальных координат цели.
С двумя другими суставами посложнее. У нас есть длина всех суставов. Можно найти угол к горизонту и расстояние между средним суставом и землей, а так-же расстояние до целевой точки.
Дальше через теорему косинусов нужно найти углы треугольника по известным сторонам.
Так это выглядит в коде:
Движение
Далее. Робот должен ходить, верно? То-есть мы должны передавать N раз в секунду каждой ноге координаты заданной позиции. С учетом того, что ног 6 и 3 из них двигаются в противофазе получается как-то сложно. Нужно ввести новый уровень абстракции.
А что если мы представим что нога движется по окружности и ей нужно передавать угол обозначающий позицию на этой окружности? Удаление в сторону становится постоянным и нужно передавать только один параметр, меняющийся циклично. Тогда целевые координыты находятся через синус и косинус.
Обдумывая как всё будет работать я понял, что задача слишком сложная для того, что-бы всё заработало с первого раза (с дебагом в Space Engineers всё плохо, но об этом в следующей части).
Поэтому я решил написать визуализатор. Мне хотелось его сделать без дополнительных библиотек и иметь возможность запускать его в один клик и без привязки к окружению.
Поэтому был выбран JS + HTML Canvas.
А сейчас нарисуем сову.
Шаг — структура данных для управления ногой:
Но для отрисовки понадобятся еще несколько классов:
Обертка над Canvas:
В классе Leg есть метод для получения текущих координат суставов. Вот эти координаты мы и будем отрисовывать.
Так-же я добавил отрисовку точек, в которых находилась нога в N последних тиков.
И наконец Worker, который будет запускать симуляцию:
Здесь видно, что траектория движения ног отличается от окружности. Движение по вертикали напоминает урезанную синусоиду, а движение по горизонтали линейно. Это должно уменьшить нагрузку на ноги.
Теперь несколько пояснений, что происходит в коде.
Как научить робота поворачивать?
Для поворота я рассмотрел 2 ситуации:
Если робот стоит — ноги двигаются по окружности.
Единственное но — движение именно по окружности сильно усложнило-бы код с текущей реализацией. Поэтому ноги двигаются по касательной к окружности.
Когда робот двигается нужно реализовать что-то вроде Ackermann steering geometry с дифференциалом.
То-есть длина шага ног, двигающихся по меньшему радиусу, — меньше. А угол поворота — больше.
Что-бы реализовать изменение угла поворота для каждой ноги я придумал следующий алгоритм:
1. Считаем угол от изначального положения ноги к центру робота:
2. Считаем угол от изначального положения ноги к (центру робота + смещение, которое отвечает за поворот — это изменяемый параметр):
3. Поворачиваем шаг на разницу этих углов:
Но это не всё. Еще нужно изменять длину шага. Реализация в лоб — домножать длину шага на изменение расстояния до центра — имело фатальный недостаток — внешние ноги слишком широко шагали и начинали задевать друг друга.
Поэтому пришлось усложнить реализацию:
1. Считаем изменение расстояния до центра для каждой ноги:
0.3 — магическое число
2. Находим отношение между минимальным и максимальным изменением
Этот множитель отражает разницу между минимальным и максимальным изменением расстояния до центра. Он всегда меньше 1 и если на него домножать длину шага — она при повороте не будет увеличиваться даже для внешних по отношению к направлению поворота ног.
Вот как это работает (gif 2 мегабайта):
→ Поиграться с результатом можно тут
Для более пристального изучения рекомендую сохранить содержимое в html файл и продолжить в любимом текстовом редакторе.
В следующей публикации я расскажу как заставил всё это работать в Space Engineers.
Спойлер: в Programmable Block можно писать на C# почти последней версии.
Как я строил гексапод в Space Engineers. Часть 1
Здравствуйте. Я хочу рассказать про проектирование и программирование системы управления конечностями в гексаподе, построенном в Space Engineers.
Забегая вперед скажу, что всё, что касается программирования в Space Engineer, будет в следующей статье. В этой я расскажу про обратную кинематику и покажу прототип на HTML Canvas в котором я занимался отладкой алгоритмов.
Предыстория и постановка задачи.
Изначально было построено сочлененное шасси, а затем на нем копательный агрегат. Такая конфигурация обеспечивала контакт всх колес с поверхностью на больших неровностях, в том числе и при скручивании.
Но я столкнулся с невозожностью его точно разместить на месторождении, так-как колеса часто соскальзывали вниз (проблема физики — большинство блоков (в том числе и колеса) имеют слишком малый коэффициент трения). Колесная платформа с цельноповоротными колесными модулями оказалась слишком громоздкой и страдала от периодических physics explosion. В результате было решено строить шагающего робота — а именно — гексапод, как самую стабильную шагаюшую платфрому.
С чего начнет строить гексапод нормальный человек? Наверное зайдет в игру и начнет строить тело робота с конечностями, а потом думать как это всё оживлять. Но это не наш метод (ц)
Я начал с теории
Для строения ноги была выбрана следующая схема:
Inner joint — внутренний сустав, качающийся по оси рысканья (yaw)
Mid joint и outer joint — внешние суставы, качающиеся по оси тангажа (pitch). Направление отсчета — от основания ноги к концу ноги.
Угол 0 для всех суставов означает, что нога полностью выпрямлена (прямую ногу будет проще строить в игре).
Задача — при заданной целевой точке найти такие углы поворота сустовов, что-бы конец ноги оказался в заданной точке. Значит время вспоминать тригонометрию.
Угол внутреннего сустава можно найти через арктангенс горизонтальных координат цели.
С двумя другими суставами посложнее. У нас есть длина всех суставов. Можно найти угол к горизонту и расстояние между средним суставом и землей, а так-же расстояние до целевой точки.
Дальше через теорему косинусов нужно найти углы треугольника по известным сторонам.
Так это выглядит в коде:
Движение
Далее. Робот должен ходить, верно? То-есть мы должны передавать N раз в секунду каждой ноге координаты заданной позиции. С учетом того, что ног 6 и 3 из них двигаются в противофазе получается как-то сложно. Нужно ввести новый уровень абстракции.
А что если мы представим что нога движется по окружности и ей нужно передавать угол обозначающий позицию на этой окружности? Удаление в сторону становится постоянным и нужно передавать только один параметр, меняющийся циклично. Тогда целевые координыты находятся через синус и косинус.
Обдумывая как всё будет работать я понял, что задача слишком сложная для того, что-бы всё заработало с первого раза (с дебагом в Space Engineers всё плохо, но об этом в следующей части).
Поэтому я решил написать визуализатор. Мне хотелось его сделать без дополнительных библиотек и иметь возможность запускать его в один клик и без привязки к окружению.
Поэтому был выбран JS + HTML Canvas.
А сейчас нарисуем сову.
Шаг — структура данных для управления ногой:
Но для отрисовки понадобятся еще несколько классов:
Обертка над Canvas:
В классе Leg есть метод для получения текущих координат суставов. Вот эти координаты мы и будем отрисовывать.
Так-же я добавил отрисовку точек, в которых находилась нога в N последних тиков.
И наконец Worker, который будет запускать симуляцию:
Здесь видно, что траектория движения ног отличается от окружности. Движение по вертикали напоминает урезанную синусоиду, а движение по горизонтали линейно. Это должно уменьшить нагрузку на ноги.
Теперь несколько пояснений, что происходит в коде.
Как научить робота поворачивать?
Для поворота я рассмотрел 2 ситуации:
Если робот стоит — ноги двигаются по окружности.
Единственное но — движение именно по окружности сильно усложнило-бы код с текущей реализацией. Поэтому ноги двигаются по касательной к окружности.
Когда робот двигается нужно реализовать что-то вроде Ackermann steering geometry с дифференциалом.
То-есть длина шага ног, двигающихся по меньшему радиусу, — меньше. А угол поворота — больше.
Что-бы реализовать изменение угла поворота для каждой ноги я придумал следующий алгоритм:
1. Считаем угол от изначального положения ноги к центру робота:
2. Считаем угол от изначального положения ноги к (центру робота + смещение, которое отвечает за поворот — это изменяемый параметр):
3. Поворачиваем шаг на разницу этих углов:
Но это не всё. Еще нужно изменять длину шага. Реализация в лоб — домножать длину шага на изменение расстояния до центра — имело фатальный недостаток — внешние ноги слишком широко шагали и начинали задевать друг друга.
Поэтому пришлось усложнить реализацию:
1. Считаем изменение расстояния до центра для каждой ноги:
0.3 — магическое число
2. Находим отношение между минимальным и максимальным изменением
Этот множитель отражает разницу между минимальным и максимальным изменением расстояния до центра. Он всегда меньше 1 и если на него домножать длину шага — она при повороте не будет увеличиваться даже для внешних по отношению к направлению поворота ног.
Вот как это работает (gif 2 мегабайта):
→ Поиграться с результатом можно тут
Для более пристального изучения рекомендую сохранить содержимое в html файл и продолжить в любимом текстовом редакторе.
В следующей публикации я расскажу как заставил всё это работать в Space Engineers.
Спойлер: в Programmable Block можно писать на C# почти последней версии.
Глава 9: Строительство большого материнского модульного корабля. Фаза 2. Перестройка
***
Все переделав многократно,
Мне идеала не достичь.
Продолжу делать аккуратно,
Стараясь истину постичь.
Теперь у меня не было проблем с добычей руды. Возможности в плане бурения возросли многократно. Тем не менее, строительство корабля немного затянулось, и тому было две причины.
Первое, что я изменил — увеличил размер стандартного модуля, сделав его симметричным и более универсальным в плане крепления. Две параллельные конвейерные линии повысили живучесть корабля.
Модуль-хранилище
Теперь модуль хранения несет на борту 6 больших контейнеров и оборонительные турели на броне, совместив в себе две функции.
Модуль-завод
Модуль завода расширился до четырёх перерабатывающих очистителей и двух сборщиков.
Вторая возложенная на него функция весьма своеобразна. На внешней поверхности брони расположились четыре нароста, состоящие из блоков тяжелой брони и приманки по центру.
Непосредственно под этими наростами разместились утопленные в корпус сварщики, подключенные к конвейеру.
Внутри модуля установлен проектор, который выводит проекцию четырех приманок с тяжелой броней.
Таким образом при попытке уничтожить приманки, происходит очень быстрое восстановление. Креативные испытания показали, что множественные ракетные залпы неспособны повредить спрятанный сварщик, хотя легкая броня корпуса вокруг приманки серьезно деформируется. Конечно, ее уже придется чинить вручную. Можно было бы применить и тут тяжелую броню, но уж очень она дорогая в производстве. Позже посмотрим. А пока и так выглядит неплохо. От автоматических турелей должно помочь.
Модуль-бур
Хотя ширина модуля увеличилась, я сократил количество буров. Не хочу больше залезать корпусом корабля в астероиды. Увеличил число поршней до трех на каждый бур, потому что двух часто не хватало для глубокого бурения. Широкую часть справа и слева от буров проварил тяжелой броней, чтобы не повредить корабль, если немного промахнусь при бурении. Колеса, для гашения ударов, в космосе смотрятся не очень уместно.
Главный модуль
Тут разместились два больших реактора, гравитационный двигатель, генераторы кислорода и кресло пилота. Дизайнер из меня не очень хороший, поэтому пока что интерьер вообще не проработан. Но обзор из кабины хороший. Планирую добавить еще точки управления, разделив функции управления кораблем при дальних перелетах, бурении и ведении боевых действий. Причем для боя, скорее всего, установлю кабину для обеспечения дополнительной защиты, так как купол выглядит слишком хрупким.
Двигательные модули не претерпели изменений. По сути, они используются как гасители инерции и маневровые двигатели. Разгон и торможение осуществляет гравитационный двигатель. При наборе скорости корабль немного задирает нос, а при торможении его тянет вниз. Но я согласен мириться с этим незначительным отклонением курса.
В планах еще построить модуль для стыковки кораблей и автоматический сборочный цех. Но, в целом, промышленный корабль уже смотрится очень неплохо. Можно задуматься о посещении других планет. Теперь это не выглядит безрассудной авантюрой. Я определённо готов к путешествиям.
Автор: Svarog
Стараюсь думать прежде чем стрелять
Поддержите ММОзговед через Patreon
Ближайшая цель: Спасибо за вашу поддержку! Чем больше денег будет собрано, тем больше будет ежемесячный фонд вознаграждения авторов и наши возможности по развитию проекта. 500 — это важное достижение для нас.
Читайте также
19 комментариев
Ммм… Это работа дизайнера. А я инженер. Мои творения не так красивы. Смотря на этот корабль, знаете о чем я думаю? Зачем мне за собой таскать столько выступающей во все стороны брони? Как эти все красивые детальки начнут отваливаться в бою? Зачем мне такие огромные движки с вектором тяги назад, если гравитационная установка и места меньше занимает и энергии жрет куда меньше.
Вот такие вот мысли. А уж потом я вижу что это действительно красиво.
На самом деле, не вижу больше смысла увеличивать этот концепт. Для игры соло такого агрегата хватит за глаза. А на сервере его разнесут за пару минут.
Так на картинках все есть. Для экскурсии можно просто выложить чертеж.
На самом деле это не та работа, которую можно и нужно показывать. Вот если бы дизайнер над этим поработал… Экстрерьер, интерьер, освещение. Тогда да.
Я бы лучше поучаствовал в совместном проекте. В мозговедческом штурме 🙂
Колеса, для гашения ударов, в космосе смотрятся не очень уместно.
О! Я не намеревался кидать камни или что-то еще. Просто мне не кажется это логичным, хотя и, наверняка, работает отменно. Я видел картинки в сети буровиков с колесами. Каждый строит как ему удобно и нравится.
Каждый строит как ему удобно и нравится.
Для большого бура, наверно, быстрее.
SE игра весьма своеобразная. Я в нее наиграл 35 часов, но так и не понял: это выживалка, конструктор, или ничего из этого. Все ИМХО конечно. Как выживалка она ужасна — шансы выжить первый час в космосе равны примерно нулю (если конечно вам не повезет и уран будет прям в соседнем астероиде). Как конструктор она интересна, и обладает кучей всяких интересных штук, но зачем конструировать сложную штуку в творческом режиме? Никакой цели.
Интерфейс игры не особенно удобен. Некоторые вещи — типа сменить колеса машины не сломав раму требуют фантастических усилий. В космосе этой проблемы нет, но утешает слабо. Добыча ресурсов сделана максимально неудобно, особенно для новичков. Как сделать сканер — гуглите сами, подсказок не будет. Да и радиус сканера такой себе. Может быть это реалистично, но крайне неудобно. Дичайшие системные требования (возможно оправданные — графика приятная) и резкий их скачок без предупреждения — однажды игра просто не запустилась, сказав: «упс ваш GeForce 750 уже отстой». 80% времени вы смотрите на сварку (да, глазам не вредит, но все равно раздражает). Еще крайне субъективный минус — меня укачивает до тошноты — причем даже на планете.
Из плюсов — совершенно фантастическая работа с гравитацией. Я не знаю легко ли это реализовать в коде, но в самой игре это просто прекрасно. Грамотная система крафта с сырами ресурсами, переработаннными ресурсами, промежуточными запчастями. Отличная физика разрушений и ремонта (сначала ломается корпус — его починить дешево, потом внутренности — дорого). Отличные возможности по механике всякого — вплоть до скриптов, сенсоров и камер. В теории можно и звездный разрушитель построить и даже управлять им толпой, но как это чудо будет лагать неизвестно даже разработчикам.
Поиграть стоит, но сначала ознакомьтесь с демоверсией с известных ресурсов, хотя бы для проверки на укачивание и соответствие компа системным требованиям :).
Space Engineers
Прямой эфир
Beholder · 1 декабря 2021, 23:34
Eley · 1 декабря 2021, 22:47
Reketell · 1 декабря 2021, 21:47
Новости
ММОзговед
На ММОзговеде принципиально нет рекламы в явном или скрытом виде. Только честные впечатления и мысли настоящих игроков. Работу и развитие проекта поддерживают авторы и читатели через краудфандинг.
Space engineers постройка машины
Небольшая нотация от новичка в дизайне. Это тема не для бородатых дизайнеров которые собаку съели на постройке красивых кораблей.
Это тема для тех ребят которые ни разу не слышали «красивый у тебя корабль»
Если мы не строим и не модернизируем корабль, то большую часть времени мы проводим внутри корабля. И это является ни чуть не менее важной частью дизайна чем экстерьер.
Красиво выполненный интерьер позволяет нам получать больше удоволствия от своего корабля чем его корпус, который больше ориентирован впечатлить других игроков.
Расположив те части интерьера которые считаете самыми важными, (вроде реакторной, трюма, ангара или кают) можно приступить к установке остальных структур необходимых в вашем проекте.
Не раз наблюдал как игроки начинают строительство своего корабля с создания ровной платформы на которой поочерёдно располагают какие-то компоненты наращивая высоту или ширину. Но при этом совершенно забыают про днище корабля, В результате корабль получается похожим на бошмак.
Избавиться от этой болячки поможет предварительное создание интерьера и размещение внутренних частей корабля перед созданием корпуса, как я уже описал выше.
Вот вы создали коридоры, комнаты, трюмы и прочее. Теперь можно обшивать ваш корабль.
Тут самое главное опять не наступить на грабли и не сделать его кубиком.
Не надо при обшивке корабля делать ровную стеночку от края до края. Попробуйте огибать корпусом каждый реактор, каждый контейнер, каждый коридор, этим вы предадите кораблю особую форму.
НО не обязательно при обшивке корабля каждый-каждый блок покрыть бронёй. Особенно, если вы не планируете на этом корабле идти в бой.
Броня бывает лишней.
Броня в любом случае выступает только сдерживающим эффектом, чтоб дать вам больше времени на выведения противника из строя или побег. А корабль который в принципе не будет встречать других игроков и вступать в бой как мне кажется нуждается в броне только для декорации.
Поэтому не стесняйтесь сделать на половину выглядывающим из корпуса очистительный завод или генератор кислорода. Или тому-подобные элементы, которые позволят вам разнообразиться экстерьер корабля и сделать его более детализированным.
Не храните все яйца в одной корзине:
Если корабль строится с расчетом на встречу в бою.
Как бы вы не старались защитить компоненты, как бы не обкладывали их бронёй это не спасёт их от повреждения в бою. Ракеты успешно разрывают корпус и повреждают всё что под ним находится. Поэтому:
И старайтесь не распологать в непосредственной близости к взрывоопасным компонентам важные системы.
Не стесняйтесь копировать в чертежи удачно получившиеся части своих кораблей.
Допустим у вас получилось создать кокпит вашей мечты, всё расположено именно так, как вы хотели, и удобно и красиво и вообще классный со всех сторон.
Сделайте простое действие
— Скопируйте корабль в чертёж
— зайдите в творческий режим
— вырежьте ту часть корабля, которая вам очень хорошо понравилась
— скопируйте эту часть корабля в чертёж
В дальнейшем, при помощи проектора вы сможете подставлять ваши готовые части друг к другу и соединять их в готовый корабль. Это значительно упростит создание корабля и эксперименты с дизайнами без необходимости перестраивать всё вручную.
Не надо изобретать колесо.
Если нет большого опыта и художественного начала, то не надо сидеть-высиживыть часами над кораблём возьмите уже готовое. Оттолкнитесь от того дизайна, который вам нравится, возьмите в пример корабль из любимой вселенной.
В силу ограничения формы теми блоками, которые есть в игре, вы не сможете повторить дизайн эталонного корабля полностью. Вам каждый раз надо будет придумывать как загладить угол, или как скруглить форму.
Построив несколько кораблей из примеров и других вселенных, вы наберёте достаточное количество опыта по использованию строительных хитростей, чтоб построить собственный корабль.







