- Как я строил гексапод в Space Engineers. Часть 1
- Предыстория и постановка задачи.
- Я начал с теории
- Движение
- Как научить робота поворачивать?
- Редакторский дайджест
- Похожие публикации
- Онлайн-книга своими руками на JavaScript
- Деревянный робот, который умеет играть в шахматы
- Отдача в хорошие руки: дисплеи с обратной тактильной связью становятся реальностью
- Заказы
- Комментарии 23
- Строительство базы в 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. Приятной Вам игры!