E-Learning. Часть 3. Blender. Визуализируем данные с гироскопа
Доброго всем времени суток, продолжаю серию постов про образовательную робототехнику. Здесь я описываю результаты и просто ход выполнения своей научной работы.
Кратко: разрабатываю специальную робо-накидку на одежду, которая сможет оцифровывать часть двигательных навыков мастеров своего дела и передавать это тем, кто только учится.
Но перед тем как визуализировать всю руку, хочу рассказать как сделать визуализатор данных средствами Blender 3D, а не того же Processing (с которым я так и не смог разобраться).
В этой статье я опишу один из способов визуализации данных из COM порта. Рассматривать буду на примере визуализации изменения ориентации платформы для 3х-осевого гироскопа и 3х-осевого акселерометра (далее просто гироскоп, для простоты). У меня это GY-BMI160, у Вас может быть любой другой, главное, чтобы Arduino отправляла данные в формате: “gx,gy,gz,ax,ay,az”.
Рис. 1. 3D модель платформы гироскопа. Основная цель – чтобы повороты нашей модели соответствовали поворотам физического гироскопа. В этой статье мы научим Blender принимать данные по COM порту.
В этой статье мы НЕ будем рассматривать следующие вещи:
1. Как подключить визуализацию нескольких датчиков, которые посылают информацию по одному COM порту.
2. Физический смысл входящих данных (примем по умолчанию, что у нас уже получены каким-то образом правильные углы).
3. Методы фильтрации данных (Фильтр Калмана, комплементарный фильтр, комплементарный фильтр второго порядка, фильтр Маджвика, получение углов из данных гироскопа, получение углов из данных акселерометра, получение углов из магнитометра и прочее).
Что будет в этой статье:
1. Как начать управлять мощной средой визуализации Blender. (Processing не столь серьезно).
2. Как настраивать Python в Blender.
3. Какие существуют подводные камни, связанные строго с Blender.
В начале хочется привести несколько причин, почему выбран именно Blender:
1. Он бесплатен.
2. Он не специфичен и используется при разработке игр, анимации, 3D моделировании как профессиональный инструмент. И как следствие по нему очень много материала и открытое сообщество.
3. Он использует Python 3. Если с Processing вы выучите язык программирования и больше нигде он не будет применим, то Python широко распространённый язык программирования. Если Вы его знаете – учить практически ничего не надо будет, если нет – то это знание гарантированно пригодится вновь.
Первое что делаем – качаем Blender с официального сайта www.blender.org. Ставим его. Откроется окно с заставкой, кликаете по свободному месту и увидите куб. Примерно как на картинке.
Первый подводный камень, Ваша видеокарта. Наводим мышкой на куб, нажимаем на колесико мыши и крутим влево-вправо. Если все хорошо, то это будет быстро. Если нет, то картинка будет менять раз в 2-5 секунд.
Как решается? Либо драйвера видеокарты слишком старые, либо слишком новые и не обкатанные. У меня оказались слишком новые на Windows 10 64x.
Заходим в диспетчер устройств – видеоадаптеры – смотрим какие у Вас стоят. Переходим на сайт производитель и у них обычно есть архивные драйвера как раз на такие случаи. Качаем-ставим.
Второй подводный камень. Внутренний Python блендера создатели посчитали самодостаточным и туда нельзя поставить новые библиотеки, например, нужную нам PySerial.
Решаем так:
Смотрим какая версия питона установлена.
Вариант 1:
Ставим в скаченный питон все что нам нужно (как это сделать я тут не буду расписывать, это стандартная процедура). Нам нужна библиотека PySerial.
Вариант 2:
Находим папку с нужной библиотекой, например, на GitHube (https://github.com/pyserial/pyserial).
Из появившейся папки в Scripts/serial или просто скаченную папку необходимо скопировать блендеру в C:\Program Files\Blender Foundation\Blender\2.78\python\lib.
Переходим в консоль Python Blender’а и проверяем. Пишем import serial.
Если не ругается – то все хорошо установлено.
Третий подводный камень:
COM порт передающий данные по проводу и по Bluetooth устройству могут иметь разное поведение после закрытия порта. Чуть подробнее далее.
Первая команда – это s = serial.Serial('COM1', 9600)
Следите за номером порта (как у меня COM1), много ошибок связано с тем, что можно забыть номер подключаемого порта или забыть его включить физически.
Следите за скоростью. Я, например, разгонял частоту работы датчика, ставил 250 000 БОД и забывал, что блендер ожидает 9600.
Чтобы последовательно считывать данные нужна команда s.readline().
На выходе мы имеем байт-строку формата “b’gx,gy,gz,ax,ay,az\n”.
Важно! Подключите библиотеку Re и разберитесь в ней. Про это мы не будем тут говорить, но пару полезных вещей коснемся. import re (к счастью стандартная библиотека).
Для начала подготовим для обработки её и переведем в строковый формат:
line = s.readline()
line2 = str(line)
Далее используем функцию sp = re.split('[^0-9.-]+', line2)
В квадратных скобках указываются символы, которые не удаляются, все остальные удаляются и служат разделителями для созданного массива sp.
Можно теперь обращаться так: sp[1]-sp[6] – наши значения, первый и последний элементы будут пустыми.
Затем для того, чтобы использовать данные в своих расчётов – просто задайте им нужный тип. float(sp[1]) – даст нужное число.
В конце обязательно закрывайте порт. s.close(). Иначе никто больше к нему не подключиться, Arduino IDE будет говорить, что порт занят уже кем-то.
Ссылка на файл с кодом https://yadi.sk/d/-Jwmt1Qw3MvqJa
В начале запустить Game Engine. Потом нажимаете на англ. раскладке "P". Затем используете клавиши: "O" - открыть порт, "R" - начать чтение данные, "C" - закрыть порт (это важно!), ESC - выйти из режима Game Engine.
Прошлые части:
0: E-Learning. Образовательная робототехника. Часть 0. Вступление
https://pikabu.ru/story/elearning_obrazovatelnaya_robototekh...
1: Часть 1. В общем о визуализации данных в Blender и Unity
https://pikabu.ru/story/chast_1_v_obshchem_o_vizualizatsii_d...
2: E-Learning. Образовательная робототехника. Часть 2. Эволюция костюмов
https://pikabu.ru/story/elearning_obrazovatelnaya_robototekh...