Застосування МЕМС гіроскопів та акселерометрів для відстеження рухів тіла людини

Дуже часто відстеження рухів потрібне під час спортивних тренувань. Наприклад, можна знайти патент US3820783, в якому описується тренажерний пристрій, який одночасно спрямовує спортсмена і не дає йому неправильно рухатися.

Відеофіксація рухів має очевидні переваги, але оскільки я хочу в цій статті описати альтернативне рішення, то дозволю собі трохи покритикувати і наведу недоліки.
Розумний одяг
Виявляється, наука та техніка вже надають такі можливості. Звичайно, мова поки не йдеться про розумний повсякденний одяг, але вже є спеціальні костюми, що складаються з датчиків, що носяться, які на дуже непоганому рівні записують рухи тіла. Такі костюми робить фірма XSENS. Коштують вони недешево, але в міру того, як у кожній родині з'являються десятки одиниць обчислювальної техніки, дешевшають мікросхеми і все більше стає інтелектуальних портативних систем. Ми семимильними кроками йдемо до світлого майбутнього. Не вдаючись глибоко в технічні подробиці спробую розповісти, як відбувається запис рухів, опишу роботу і принцип дії основних вузлів системи вимірювання рухів з урахуванням електронно-механічних датчиків.
З розвитком мікроелектроніки з'являються різні мініатюрні датчики. Окрема група таких датчиків називається МЕМС – мікро електромеханічні рецептори. Для вимірювання рухів застосовуються датчики прискорення – акселерометри та датчики кутової швидкості – гіроскопи. Акселерометр є мініатюрний чутливий елемент, що змінює свої властивості під дією прискорення. Це може бути п'єзоелектричний сенсор або елемент змінної ємності – конденсатор із рухомою обкладкою. П'єзоелектричний сенсорвиробляє невелику напругу на своїх електродах, яка може бути виміряна і перерахована на прискорення. Подібним чином справи з ємністю змінного конденсатора.
МЕМС гіроскоп найчастіше використовує в конструкції дію сили Коріоліса, яка відхиляє вібруючу платівку, величина відхилення реєструється і перетворюється на кутову швидкість.
Як ми знаємо з курсу фізики та математики, будь-який вектор може бути розкладений на складові вектора. Так, наприклад, прискорення та швидкість розкладаються на взаємно-перпендикулярні складові: X, Y, Z. Чутливі елементи МЕМС вимірюють прискорення та швидкість окремо вздовж кожного з цих векторів.
Зараз зустрічаються мікросхеми, які містять у собі відразу кілька МЕМС датчиків.
Наприклад, мікросхема МЕМС акселерометра здійснює вимірювання прискорення відразу по трьох осях x, y, z. Це стосується і мікросхем гіроскопів, які можуть вимірювати кутову швидкість відразу по всіх трьох осях. Зустрічаються навіть мікросхеми, які одночасно вимірюють прискорення і швидкість. Такі датчики називають шестикоординатними.
МЕМС - контролер
МЕМС датчики, як правило, оснащуються вбудованим контролером, який здійснює розрахунок прискорення або кутової швидкості, забезпечує цифрову фільтрацію та конфігурування мікросхеми.
Також контролер забезпечує зв'язок МЕМС датчика із зовнішнім світом по одному з найпоширеніших інтерфейсів. Як правило, це SPI чи I2C. SPI – це інтерфейс із двома лініями даних та однією лінією тактування. I2C - це інтерфейс з однією лінією даних та однією лінією тактування. Нам у принципі потрібно знати лише, що передавати дані від МЕМС датчика легко та приємно, для цього є стандартизовані розповсюджені інтерфейсита готові бібліотеки.
Модель тіла людини
Нехай дані таки дійшли за призначенням і починається їхня обробка. Для проведення розрахунків та візуалізації рухів нам просто потрібна математична модель тіла людини. Така модель має безумовно враховувати різні довжини рук, ніг, обхвати талії, грудей, тобто різні антропометричні особливості людей. Можливо, така модель має також враховувати внутрішню будову організму. Чим складніша модель, тим важче, дорожче і довше її створення. Я особисто вважаю, що модель повинна містити лише ті елементи, на які можна надіти чутливий елемент. Тобто, якщо йдеться про руку, то доцільно складати її модель з наступних частин:
Будувати модель з урахуванням безлічі кісточок, м'язів і сухожилля недоцільно. Як найпростіша модель однієї частини тіла може виступити конус. Це проста геометрична фігура, яку без проблем можна реалізувати в будь-якому графічному середовищі і яка не вимагатиме багато ресурсів, що особливо актуально для мобільних платформ. Власне об'ємна форма конуса використовується для візуалізації моделі, а вектор, що збігається з поздовжньою віссю симетрії, використовується для різних розрахунків. Різні довжини нижнього і верхнього кіл конуса легко моделюють відмінності в діаметрах, наприклад, стегна зверху і в районі коліна.


Погодьтеся, що модель виглядає досить відомим. Ця модель була побудована серед Microsoft XNA, для малювання конуса використані бібліотеки Primitives3D, знайдені на просторах інтернету. Для розміщення елементів моделі використовується математичний апарат матричних обчислень середовищаXNA.
Трохи про обчислення
Простір, у якому розташована модель, називається світовим простором. Щоб переміщати елементи моделі у світовому просторі, необхідно складати матриці переміщення, щоб повертати необхідні матриці повороту. Власне кажучи, це одні й самі матриці, лише з різних цілей у яких використовуються різні осередки.

Елементи, виділені червоним кольором, відповідають за поворот, виділені елементи синім за переміщення, а чорні елементи потрібні для дотримання розмірності 4х4. Щоб створити матрицю переміщення, використовується метод:
Який параметр приймає радіус-вектор необхідного положення точки. Щоб розмістити всі елементи тіла, потрібно кожному з них скласти матрицю переміщення, назвемо таку матрицю fBaseWorldi.
Все, що стосується руху 3D моделей, чудово відомо розробникам комп'ютерних ігор та іншим фахівцям, які працюють у галузі комп'ютерної 3D графіки.
Ми ж перейдемо до найцікавішого, а саме як пов'язати вимірювання кутової швидкості та прискорення зі становищем моделі на екрані. Положення тіла в просторі може бути задано за допомогою кутів Ейлера, матриць переміщення та повороту або за допомогою кватерніонів. Чимало копій зламано у суперечках про те, який із способів вибрати. Я користуюсь поданням становища як кватерніонів. Від одного способу до іншого можна легко перейти за допомогою відомих математичних перетворень.
Кватерніон - це набір з чотирьох чисел, що задають у просторі вісь, навколо якої потрібно повернути тіло та кут повороту. Кватерніон записується у вигляді:
q = [W,X,Y,Z], де W – це косинус половинного кута повороту; X, Y, Z – координати осі повороту.
Кватерніон краще матриць повороту, так як матриця містить 16 чисел, а кватерніон тільки 4, що очевидно заощаджує час передачі даних і не так сильно завантажує канал зв'язку.
Уважний читач справедливо може заперечити, що кватерніон дозволяє описати лише обертальний рух, а як бути з поступальним? Справа в тому, що запропонований метод призначений для реєстрації рухів без прив'язки до навколишньої місцевості. А всі рухи людини можна побудувати за рахунок лише обертань.
Справді, наше тіло практично не схильне до чистих (без обертання) розтягувань і стискань. Наприклад, щоб лінійно перемістити кисть вперед або назад, вгору або вниз, доведеться здійснити обертальний рух передпліччя в ліктьовому суглобі або плече в плечовому.
Залишилася справа за малим, перетворити прискорення та кутову швидкість на кватерніони. Математичний апарат, який виробляє такі перетворення складає святу святих фірм, що виробляють системи вимірювання рухів. Цей апарат загалом відомий, в інтернеті можна знайти навіть вихідні коди (Open source IMU and AHRS algorithms), але, як завжди, всі складнощі криються в деталях. Тому не дивуйтеся, якщо виміри руху будуть містити помилки положення. Це пов'язано з помилками у показаннях датчиків, які інтегруються та значно впливають на результат. Також свою частку неточностей роблять помилки розташування датчиків на тілі людини. Непогане рішення надає фірма виробник МЕМС-чіпів Invensense, вони виробляють мікросхеми, в які можна завантажити ними бібліотеку, що постачає, що робить обчислення. У ранніх версіях бібліотека була кодами, написаними на С, які виконувались на сторонньому мікроконтролері. Тепер бібліотека – це масившістнадцяткових чисел, які потрібно завантажити в мікросхему МЕМС після подачі на неї живлення. Подібне рішення надають інші фірми, наприклад Microchip.
Після того, як ми розрахували положення частини тіла та висловили його у вигляді кватерніону, необхідно зі свідчень, що належать до окремих частин тіла, скласти загальну модель. Тут і стане в нагоді середовище XNA і код Primitives3D. Бібліотека Primitives3D, що використовується, для переміщення або повороту використовує дані в матричному поданні. Тому, щоб перетворити отримані від датчиків кватерніони необхідно скористатися вбудованою в XNA функцією:
де qi це кватерніон від датчика.
Потім потрібно обов'язково перенести повернену частину тіла з початку координат у відповідну точку, де вона повинна знаходиться, передпліччя, наприклад, «кріпиться» до ліктя. Хоча ви вже бачили на картинці повністю «зібране» тіло, щоб воно завжди було в правильному положенні після приходу кожного нового кватерніону, положення тіла потрібно розраховувати заново. Це з тим, що бібліотека розрахунку кватерніонів видає кватерніон, який пов'язує становище тіла у нульовий час із поточним моментом. Щоб зробити перенесення частини тіла потрібно лише перемножити дві матриці:
Матриця fBaseWorldi постійно коригується, оскільки якщо перемістилося плече, то відповідно переміститься і лікоть. Тому в програмі після приходу кватерніону для будь-якої частини тіла слід здійснити розрахунок матриць fBaseWorldi для всіх інших пов'язаних з нею частин тіла.