IT-команда «Северстали» постоянно находится в поиске новых способов обучения сотрудников. Особенный интерес вызывают иммерсивные технологии — методы с эффектом присутствия, максимального погружения в виртуальную реальность. Мы уже давно применяем VR, но в этот раз попробовали поиграть с подвижными платформами, добавляющими реалистичности ощущениям. Такие штуки дают потрясающий эффект на тренировках! Расскажем о том, как мы разрабатывали прототип программно-аппаратного тренажёра с подвижной платформой и виртуальной реальностью.
![](https://habrastorage.org/getpro/habr/upload_files/fc7/12e/6ce/fc712e6cea325013f0a65f02cd7749f4.png)
Что такое подвижные платформы
Подвижной платформой в сфере виртуальной реальности называют такое место пользователя VR, которое приводится в движение от электрического привода и воздействует на тело вибрацией, рывками, наклонами и т. д. В мире развлечений и обучения подвижные платформы применяются уже давно и разнообразно: от простого кресла геймера до полноценной кабины пилота с набором интерактивного окружения, как в профессиональных авиасимуляторах.
Всех их объединяет то, что цифровой мир выводится на мониторы или экран проектора. А с распространением VR-гарнитур подвижные платформы стали использовать совместно с VR-шлемами. Совмещение этих технологий позволяет выйти на совершенно иной уровень иммерсивности в симуляциях, а в нашем случае — улучшить и разнообразить обучение рабочих на производстве.
Кто хоть раз пробовал VR, знает, что движущаяся картинка в очках легко вводит мозг в заблуждение, создавая обманчивое ощущение движения. Особенно ярко это можно ощутить при виртуальном падении с высоты. При этом физически пользователь очков не двигается. А теперь представьте, какой эффект создаёт настоящее движение, если вы находитесь на подвижной платформе и видите признаки реалистичного перемещения в VR-очках. Забегая вперёд, скажем, что тестирование подвижной платформы вызвало настоящий фейерверк эмоций в нашем офисе, даже несмотря на то, что все испытатели уже имели крепкий иммунитет к эффекту погружения в VR. Вот как мы его делали.
Создаём интерактивный симулятор работы горняков
Идея заключалась в том, чтобы создать полноценную интерактивную симуляцию работы на какой-нибудь горнодобывающей машине. Для этого нам были нужны: подвижная платформа, элементы управления, движок и VR-гарнитура.
Железо, элементы управления и движок
Раньше мы никогда не занимались созданием физического оборудования. Понимая сложность разработки и поиска компетентных специалистов, мы выбрали готовую платформу. С элементами управления мы тоже решили не изобретать велосипед и взять уже готовое решение. Выбор пал на комплект от Logitech. Руль у этого набора имеет обратную связь (отдачу), поэтому нам он понравился. Также в комплект входят блоки с тремя педалями и рычагом коробки переключения передач (КПП). На его основе вполне можно собрать полноценный прототип.
В ожидании доставки платформы и руля мы начали подготовительные процессы. Сначала нужно было определиться, что именно будем симулировать. Решили, что это будет фронтальный погрузчик. Во-первых, это близко к горнодобывающей тематике. Во-вторых, выбранное железо позволит сделать если не полноценное управление, то максимально приближенное к реальности. Движком для реализации стал наш любимый Unreal Engine (UE).
Железо всё ещё не приехало, поэтому пока мы занимаемся настройкой сцены в движке. Используя красивые игровые ассеты (Game Asset, игровой ресурс), создаём визуальное подобие горного карьера: разбрасываем песок и камни, настраиваем освещение… Так и хочется сказать: «Да будет свет!» Немного подизайнив, получаем виртуальный испытательный полигон, где и будет происходить всё действо.
![виртуальный испытательный полигон виртуальный испытательный полигон](https://habrastorage.org/getpro/habr/upload_files/353/2b9/011/3532b9011d3e3c1682d1def6272ff4f0.png)
Главный действующий персонаж — фронтальный погрузчик, а точнее его машинист. Мы хотели бы подробно рассказать про создание полноценной действующей модели погрузчика, но это материал для нескольких статей. Обязательно расскажем об этом позже. А на тот момент у нас имелся ещё и прекрасный ассет с готовым погрузчиком, который отлично подходил под нашу задачу. Мы разместили его на сцене и приступили к программированию.
![](https://habrastorage.org/getpro/habr/upload_files/160/450/506/160450506d42dc67c54f7004ac9f469b.png)
Подготовка ассета погрузчика
Признаться, тут и рассказывать особо не о чем, потому что в ассете уже прописаны анимации и код управления. Единственное, что было нужно, это сделать из экскаватора pawn’а (англ. pawn, пешка). В понятиях движка Unreal Engine «pawn» — это объект, которым управляет игрок, то есть персонаж игры. Размещаем камеру на месте, где будет располагаться игрок, и на этом настройки экскаватора закончены. Теперь можно надеть VR-шлем, запустить симуляцию и покататься по карьеру, используя управление с клавиатуры.
![](https://habrastorage.org/getpro/habr/upload_files/4e7/c72/35c/4e7c7235c3cdeddf322d4e7d0aa7d68a.png)
Внезапно прилетела фея доставки и даже расставила и подключила всё оборудование, которое мы заказали. Потирая руки, переходим к самому интересному.
Готовая платформа и элементы управления: изучаем оборудование
В первую очередь разберёмся с рулём и педалями. Это стандартный геймерский набор, а значит, и распознаётся он как стандартный контроллер, стоит только поставить в систему официальные драйверы. После этого подключить элементы управления к движку не составит труда. Запускаем симуляцию и получаем полноценное управление погрузчиком с рулём и педалями. Вот в чём прелесть готового решения!
Конечно, оно максимально аркадное в сравнении с настоящим погрузчиком: педаль газа отвечает за движение вперёд, педаль тормоза — за остановку и движение назад, а переключение передач происходит автоматически.
Можно сделать его более реалистичным, и мы уже работаем над этим, создавая свои кастомные контроллеры, о чём и постараемся рассказать в будущем.
Добавим управление ковшом. Ковш имеет две степени свободы: поднятие и опускание ковша. Ещё есть поворот. Можно сделать управление этими элементами на кнопке руля, но это не так интересно. Воспользуемся рычагом КПП. Первое и второе положения передачи будут отвечать за поднятие и опускание ковша, третье и четвёртое — за его поворот. Настраиваем соответствующие инпуты в настройках движка и подключаем их в коде погрузчика.
Теперь можем сесть в кресло и попробовать управлять погрузчиком с помощью руля, педалей и рычагов в VR. Всё уже выглядит довольно неплохо, почти ощущаешь себя машинистом. Приступим к разработке управления платформой.
Разрабатываем управление подвижной платформой
Вначале разберёмся в том, как работает управление платформой с ПК. Для этого установим программу от производителя. Она позволяет настраивать платформу вручную с помощью ползунков.
![](https://habrastorage.org/getpro/habr/upload_files/700/c85/491/700c85491d311db9528014526ba75dfe.png)
На этом этапе уже было сложно удержаться от того, чтобы покатать коллег на движущемся кресле. Да, это весело, но пока ничего не даёт, кроме уверенности в работоспособности платформы. А нам хочется максимального эффекта.
Мы предположили, что нутро может быть реализовано на чём-то, похожем на Ардуино, и воспользовались монитором COM-портов. При подключении платформы к ПК видно, что в устройствах появляется Ардуино. Бинго! Устройство угадано с первой попытки. Теперь включаем мониторинг и крутим ползунки в приложении, наблюдая за тем, как изменяются значения, передаваемые в COM-порт. Изменяя значения разных ползунков от минимального до максимального, обращаем внимание на изменение столбца с данными.
![](https://habrastorage.org/getpro/habr/upload_files/56f/397/845/56f397845d3ef4922cb830648f31055d.png)
Видно, что формат данных, отправляемых на контроллер платформы, выглядит следующим образом:
L7FR7FZ7FY7F
Биты 0, 3, 6, 9 не меняются — предположительно они обозначают имена осей (приводов) платформы. Биты 1 и 2 описывают значение в шестнадцатеричной системе счисления от 00 до FE. При переводе в десятичную это даст значение от 0 до 254 — количество возможных положений одного привода платформы. Оставшиеся биты 4, 5, 7, 8, 10, 11 также хранят значения соответствующих осей.
Бит | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Описание | Ось L | Ось R | Ось Z | Ось Y | ||||||||
Значения | L | 7 | F | R | 7 | F | Z | 7 | F | Y | 7 | F |
Теперь для формирования полученного набора данных надо написать код в Unreal Engine.
Пишем код в движке для формирования набора данных
Для передачи данных на платформу воспользуемся UE-плагином для коммуникации с COM-портом. Базовых функций этого плагина будет достаточно для работы прототипа. Нам понадобятся функции открытия COM-порта и отправки массива байтов.
![](https://habrastorage.org/getpro/habr/upload_files/e37/a26/4bf/e37a264bfff1e8d26f4384a0649d180d.png)
Необходимо сформировать входной сигнал. Для этого создадим функцию, которая будет переводить значения осей в требуемую последовательность байтов. В нашем случае платформа имеет две степени свободы — приводы L и R соответственно, поэтому остальные значения по умолчанию будут 00.
![](https://habrastorage.org/getpro/habr/upload_files/969/9eb/918/9699eb9185daa3baa9d90bee25f02e6b.png)
Теперь мы можем управлять платформой, передавая значения L и R в диапазоне от 0 до 254. Но для понимания того, какое значение за что отвечает, такой формат не очень удобен. Для управления платформой хотелось бы использовать Vector2D, где X отвечал бы за наклон вправо и влево, Y — за наклон вперёд и назад, а точка (0, 0) будет центральным положением.
Напишем небольшой конвертер:
![](https://habrastorage.org/getpro/habr/upload_files/bf5/8a5/556/bf58a555644c4e43b1118ecd6ae092ed.png)
Теперь можем управлять движением платформы с помощью удобного вектора. Передадим (1, 0) и увидим, что она отклонилась назад и влево, как если бы мы отправили значение (-1, -1).
![](https://habrastorage.org/getpro/habr/upload_files/8d0/62e/0d4/8d062e0d45f185153a663382eca3d53e.png)
Если мы попробуем отправить значение (0, 1), платформа отклонится назад и вправо, как при значении (1, -1). Это явно не тот результат, которого мы добивались. Вооружившись бумагой и карандашом, нарисуем эти векторы на плоскости.
![](https://habrastorage.org/getpro/habr/upload_files/e20/691/714/e2069171424dc5f89d454a0f3cb3fc65.png)
Сразу становится понятно, что вектор наклона повёрнут на 135°. Это происходит из-за особенности конструкции приводов платформы. Чтобы это исправить, добавим поворот на -135°.
![](https://habrastorage.org/getpro/habr/upload_files/3ab/797/9e6/3ab7979e6e46985a961275169957b225.png)
Теперь надо из чего-то сформировать вектор наклона платформы. В первую очередь можно переносить наклон транспортного средства. Для формирования управляющего вектора можно воспользоваться значениями поворотов объекта по Х и Y или проекцией вектора UP на оси Forward и Right. Затем останется их обрезать до требуемого диапазона и отправить в платформу. Посмотреть реализацию можно тут.
![Скриншот из видео, формирование вектора наклона платформы Скриншот из видео, формирование вектора наклона платформы](https://habrastorage.org/getpro/habr/upload_files/e59/7cd/8db/e597cd8db17f347b6ca6431a25ea0219.png)
К этому вектору можно добавить тряску. Для этого привнесём в каждый кадр случайный шум с разной интенсивностью, которая зависит от работы оборудования на погрузчике или типа поверхности, по которому он перемещается. Для имитации ускорения можно добавить наклон в противоположную от ускорения сторону.
Последняя доработка, которая сильно улучшит погружение в симуляцию, это Hand Tracking (отслеживание рук). Немного об этой технологии мы уже писали здесь. Есть один минус применения VR на подвижном кресле с контроллерами — пользователь не видит своих рук. Из-за этого приходится нащупывать элементы управления, даже если они физически находятся там же, где их виртуальные 3D-модели. Hand Tracking позволяет обойти это ограничение, добавляя в симуляцию визуализацию рук. Посмотри как у нас получилось по ссылке в ролике.
![Скриншот из видео, визуализация рук Скриншот из видео, визуализация рук](https://habrastorage.org/getpro/habr/upload_files/297/522/054/297522054c73ddb26911c0389e485caf.png)
Вот мы и создали прототип, который позволяет управлять погрузчиком, сидя в подвижном кресле с VR-очками на глазах. Ощущения получились довольно реалистичными за счёт движения платформы.
Смотрите, как это выглядит в финальном ролике.
![](https://habrastorage.org/getpro/habr/upload_files/076/453/330/0764533307e5f5c9b4927d715ad50f20.png)
Так как все наши разработки так или иначе направлены на промышленное обучение, мы не можем обойтись без их тестирования на работниках завода. Вот какой отзыв мы получили после тестирования этого VR-симулятора.
Отзыв менеджера по развитию
VR-технологии позволяют окунуться в процесс работы на машине с полным погружением и при этом безопасно для работника. У работодателя такая технология минимизирует страх, что что-то пойдёт не так — например, случатся потери по производству или простои оборудования.
Такие операции в цехе, как, например, очистка коутера или перевалка клети производятся стоя. Их симуляция не требует специальных устройств — нужны лишь инструменты и знания. А что делать машинисту крана, водителю БелАЗа или тепловоза? Тут-то и подключается такое кресло. И если с водителем БелАЗа или погрузчика всё понятно (мы полностью симулируем процессы управления — руль, педали), то для машиниста крана или тепловоза со специфическими органами управления на этих машинах требуются дополнительные контроллеры.
В этом и стоит задача наших разработчиков: довести кресло до ума, до наших органов управления, чтобы процесс обучения вне рабочего места был на 100% настоящим. Ну ладно на 95%). Первый образец уже впечатляет. Хотя пока использован только стандартный вид управления (руль и педали), у разработчиков уже получилось разобраться в ПО кресла и внедрить его в разработанные тренажёры. На экскаваторе покатался, жду следующую итерацию уже под наши запросы.
Планы на будущее
Имея на руках готовый и протестированный прототип, можно развивать его дальше. У нас уже есть идеи, которые позволят использовать и развивать этот тренажёр:
Создать кастомные контроллеры. Они позволят разработать тренажёры с физическим управлением для различных видов техники.
Объединить кресла и контроллеры с уже существующим тренажёром для машиниста крана. Это позволит улучшить тренажёр, добавив в него физическое взаимодействие.
Найти новые направления, где технология подвижной платформы может быть полезна.