Отлаживая разные алгоритмы управления для нашего робота, мы на себе прочувствовали насколько приятно было бы иметь среду моделирования и отлаживать программы сначала в ней, а потом уже тестировать на реальном роботе. Поскольку мы активно использовали Blender для создания моделей для 3Д-печати и для пользовательского интерфейса, мы решили попробовать Blender Game Engine в качестве среды для моделирования робота. Первые результаты оказались очень даже неплохими:
На видео показана панель управления для водителя на которой показывается вид с бортовых камер и данные от сенсоров.
После этого стал вопрос — как интегрировать BGE с нашей системой коммуникации и управления? Т.е. как сделать так, чтобы одна и та же программа могла без изменений управлять настоящим или виртуальным роботом в BGE? Для управления роботом по сети мы используем библиотеку Ice, которая, кроме многих других, поддерживает Python. Blender тоже умеет выполнять питоновские скрипты и предоставляет интерфейс ко всем своим объектам и функциям. Таким образом родился план — написать программу на питоне, которая реализовывала бы точно такие-же (удаленные) интерфейсы как и программа, которая работает на роботе. Но вместо реальных моторов она меняла бы свойства объектов в BGE в соответствии с командами поступающими по сети.
В качестве первого шага, мы решили сделать максимально простой пример, который показывает:
- как написать и запустить Ice-сервер написанный на питоне внутри Blender-а?
- как изменять атрибуты объекта (например позицию) получая информацию по сети?
Для этого понадобилось сделать два питоновских файла. Первый с кодом сервера, который будет запущен внутри Blender-а и второй — клиентская программа, которая посылает запросы на изменение позиции серверу по сети. Эти две программы можно найти на ГитХаб-е. Testblender.py это сервер. Следует заметить, что было необходимо запускать сервер в отдельном потоке, т.к. иначе, ожидая сообщения по сети, он блокировал пользовательский интерфейс Blender-а и изменение позиции объекта визуально не отображалось. Client.py это простая программа посылающая 100 запросов на изменение позиции текущего (выбранного) объекта двигая его по кругу в плоскости XZ. На следующем видео показано как запустить серверную и клиентскую программу и результат работы — двигающийся по кругу объект.
После того, как мы научились управлять объектами внутри Blender-а удаленно (по сети), мы планируем реализовать интерфейсы для управления роботом внутри BGE для управления моделью.
На самом деле, описанная техника удаленного управления объектами в Блендере может использоваться и для совершенно других приложений. Например для визуализации данных собранных на другом компьютере. Поэтому, мы надеемся, что простой пример описанный выше и эта статья будут интересны и полезны для читателей :-).
Автор: andreynech