Space engineers автоматическое строительство

Как я строил гексапод в 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# почти последней версии.

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Онлайн-книга своими руками на JavaScript

Деревянный робот, который умеет играть в шахматы

Отдача в хорошие руки: дисплеи с обратной тактильной связью становятся реальностью

Заказы

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 23

В это игре в этом нет смысла. Кроме случаев когда у вас какие-то экзотические настройки, из-за чего уран в жестком дефиците.

По сабжу — идея автора годная. Возникает только вопрос гексапод должен определять высоту постановки ноги, как он это делает? Насколько я помню (давно не играл, увы) реальных способов узнать где земля (без использования модов) в игре нет.

Landing gears?
Не подошли по следующим причинам:
1) Они повреждаются или разрушаются при столкновении с поверхностью. Я нашел только 2 модуля, которые могут служить подошвой ноги: колеса и дрель. Но дрель имеет слишком низкий коэффициент трения — робот скатывался вниз даже на слабом уклоне.
2) В процессе шага конец ноги поворачивается относительно поверхности — пришлось-бы добавить еще 2 ротора что-бы это компенсировать.

Проект уже есть в workshop, но я хочу дать на него ссылку вместе с объяснениями — что и как работает. То-есть в следующей статье.

Вроде все уже согласились что одним из самых оптимальных вариантов является летающая машина.

У колесной платформы есть существенный недостаток — неадкватно низкое трение скольжения (вообще выглядит как баг). Т.е. едет она вроде бы почти адекватно, а вот стоять на месте категорически не может. Как следствие такая платформа будет соскальзывать даже при минимальном уклоне.

Хотя как вариант поддамкрачивать ее — приехал, выставил Landing Gear на поршнях и все, типа база.

А вообще, в инжах выгоднее всего копать астероиды — затраты на перемещение минимальны — только разгон и торможение. Плюс возможность удаленного управления на любом расстоянии.

А вообще, в инжах выгоднее всего копать астероиды — затраты на перемещение минимальны — только разгон и торможение. Плюс возможность удаленного управления на любом расстоянии.

Я как-то эксперементировал с «ударной» посадкой — рассчет был на то, что капсула не может разогнаться более 100м/с (по-умолчанию) и не совсем адкватной модели подвреждений при ударе (по факту удар сильно гасит скорость, и повреждаются несколько наружних слоев блоков) — можно пожертвовать небольшим кол-вом металла для разрашаемой противоударной защиты контейнера (в виде моргенштерна) (примечание такая конструкция не выдержит падения на склон горы т.к. разрушится при качении)

А на счет подъема — зачем он вам? Ретрансляторы для копания + проекторы для сборки «дропподов» возволят вам кидаться в вашу базу ресурсами, без необходимости подниматься. К тому же, опять же, лед есть и на астероидах, так что можно и на взлет/посадку ресурсы собирать в космосе.

Интересно, все же, как будет реализовано в SE. Давно туда не заходил и не знал, что добавили язык программирования.

Ах, ностальгия… Лет 15 назад именно это было темой моего проекта по… компьютерной графике 🙂 Помню, тоже развлекался сначала с формулами вычисления координат «стопы» относительно крепления «бедра» для таких-то углов сочленений и длин «бедра» и «голени» вместе с обратными формулами — нахождения необходимых углов сочленений для такой-то координаты «стопы». Затем, как и Вы — перешел к следующему уровню абстракции: ходьбе. Тоже вначале чесал репу, а потом дошло, что все на самом деле просто: касающиеся земли ноги просто смещаются на Х назад, в то время как другие три ноги совершают движение на 2Х вперед, сопровождающееся подъемом по той или иной дуге. Затем пошли алгоритмы разворотов и поиска маршрута по неровной поверхности (правда, без обхода препятствий). Даже скриншоты остались:

А потом, в виду того, что это был проект не по роботике, а по компьютерной графике… препод попросил перенести алгоритм на нечто живое:

Было очень приятно перечитать статью, тем более, что проект был «из спортивного интереса». Я все хотел эти алгоритмы перенести в железо… на нечто, что можно пощупать руками… но потом как-то не срослось.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Источник

Строительство базы в Space Engineers: гайд по строительству

Основы строительства базы:

Главнейший элемент для строительства базы — блоки «Легкой брони». Не смущайтесь их названия — из них создается не только корпус корабля, но и фундамент базы, соединяя постройки в одну систему. Именно эти блоки передают энергию от производителя к потребителю. Например, вам нужно подключить «Базовый сборщик» к «Ветрогенератору». Для этого постройте два сооружения на одном фундаменте из блоков «Легкой брони».

Если вы все сделали как на скриншоте выше, то «Ветрогенератор» начнет крутиться. Подойдя к сборщику и открыв терминал (K), вы увидите, что объекты объединились в одну систему. Учитывайте, что сборщик будет работать, если его максимальное потребление ниже, чем вырабатывает «Ветрогенератор».

ВАЖНО: никогда не бойтесь разбирать объекты с помощью болгарки. Многие игры приучили нас к тому, что разбирая постройки, мы получаем лишь часть ресурсов. В Space Engineers вы полностью возместите убытки!

Как исправить баг с исчезновением объектов\сооружений?

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

  • Не оставляйте объекты недостроенными! Перед полетом в дальние края разберите постройку болгаркой.
  • Стройте сооружения на блоках «Легкой брони». Ваши объекты должны находится в общей системе!
  • При строительстве используйте выравнивание по гравитации (с помощью «B» можно изменить этот режим). Ваш объект должен автоматически прикрепляться к блоку.

Как разблокировать чертежи? Как перекинуть постройки и предметы на панель быстрого доступа?

Для начала ознакомьтесь с деревом чертежей, нажав на кнопку «G» и выбрав вкладку «прогресс». Чтобы открыть новую ветку чертежей, постройте что-то из предыдущей. Например, чтобы открыть чертеж «Лампы», вы должны создать «Базовый сборщик».

И именно из этого окна нужно перетаскивать чертежи на панель быстрого доступа. Чтобы переключать вкладки панели, нажмите «Ctrl + номер вкладки».

Что необходимо строить в начале?

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

Базовый сборщик. Позволяет создавать новые предметы. Также работает быстрее, чем «капсула возрождения». В общем, без этой постройки попросту не обойтись.

Ветрогенератор. Простейший источник энергии, работающий сам по себе и не требующий ресурсы. Главное стройте его на высоте. Чем выше он находится, тем больше электроэнергии вырабатывает. При этом начинает быстрее крутиться.

Базовый очиститель. Не затягивайте с его строительством, так как он в несколько раз быстрее производит слитки, чем переработка камня на «капсуле возрождения». При обширной застройке без очистителя обойтись никак нельзя.

Большой контейнер. Советуем строить именно его, а не более маленькие и быстро заполняющиеся варианты. Создается он быстро и вы получите хранилище с объемом в 421 000 литров, что примерно в 100 раз больше «Среднего контейнера».

У вас может возникнуть вопрос: а где на строительство добывать ресурсы? Ответом на этот вопрос — станет наш следующий гайд.

А на этом все, Инженеры. Мы надеемся, что гайд «Строительство базы в Space Engineers: гайд по строительству» был полезен для Вас. Ищите больше гайдов по всем играм на нашем сайте! Проектируйте собственные корабли и покоряйте новые планеты в Space Engineers. Приятной Вам игры!

Источник

admin
Оцените автора
Строительство: баня и сауна
Adblock
detector