Як працюють додатки рівня: пояснення акселерометрів телефонів
Ваш телефон знає, де низ, бо в ньому є крихітний датчик — акселерометр MEMS. Цей датчик вимірює, як гравітація тягне телефон одразу в трьох напрямках. Додаток рівня читає ці три числа, робить трохи тригонометрії й показує вам кут. І так сотні разів на секунду, усередині чіпа, який важко розгледіти неозброєним оком. У цій статті розповідаємо, що відбувається насправді.
- Акселерометр вимірює, як гравітація розподіляється між трьома осями. Коли телефон лежить нерухомо, він не вимірює рух.
- Pitch і roll отримують за формулами arctan, застосованими до цих трьох показань гравітації.
- Spirit Level Pro пропускає сирі показання через експоненційне ковзне середнє (alpha=0,15), щоб пухирець не смикався.
- Датчики MEMS дрейфують від температури, тому калібруйте там, де працюєте.
- Для телефона, притиснутого нерухомо до поверхні, акселерометр робить усю роботу. Гіроскоп не потрібен.
Що таке акселерометр MEMS?
MEMS означає Micro-Electro-Mechanical Systems — мікроелектромеханічні системи. Чутливий елемент усередині акселерометра телефона крихітний, кілька сотень мікронів завширшки, менший за крупинку солі. Він розміщується на тому ж кремнії, що й звичайна електроніка чіпа, і виготовляється так само. Саме тому такі датчики дешеві й стоять майже в кожному телефоні.
Механізм простий, коли його уявити. Крихітна маса висить на кремнієвих пружинах, витравлених у чіпі. Коли ви нахиляєте чіп, гравітація трохи зміщує масу вбік. Цей рух змінює зазор між гребінцевими металевими пластинами, а зміна зазору змінює ємність між ними. Чіп зчитує цю зміну й перетворює її на значення прискорення, виміряне в g.
Ось частина, яка робить рівень можливим. Коли телефон лежить нерухомо, акселерометр вимірює не рух. Він вимірює, скільки гравітації тягне вздовж кожної з трьох його осей. Гравітація — це стала, відома сила. Щойно ви знаєте, як вона розподіляється між трьома осями, ви можете точно обчислити, як нахилений телефон.
Як трьохосьовий акселерометр вимірює нахил?
Трьохосьовий акселерометр задає телефону власний набір напрямків: X іде зліва направо, Y — згори вниз, Z — спереду назад. Покладіть телефон рівно на стіл, і гравітація тягне майже повністю вздовж Z, тому Z показує близько 9,81 м/с², а X і Y — близько нуля. Нахиліть телефон — і гравітація зміститься: менше на Z, більше на X і Y, пропорційно куту.
Перетворити ці три показання на кути — базова тригонометрія. Pitch — це нахил спереду назад, roll — нахил зліва направо, і обидва отримують через обернений тангенс:
Ці два рядки — уся математична основа додатка рівня. Подайте три сирих значення, виконайте обчислення — і отримаєте pitch і roll у радіанах. Помножте на 180/π, щоб отримати градуси. Це те число, що на вашому екрані.
Ви можете спитати, чому в знаменнику стоїть корінь квадратний із двох інших осей, а не просто одна вісь. Це утримує показання стабільним при повному оберті. Якщо ділити на одну вісь, математика ламається біля вертикалі: та вісь падає до нуля, і ви ділите майже на ніщо. Спільна величина двох інших осей цього уникає.
Spirit Level Pro показує кути pitch і roll наживо зі згладжуванням EMA, п'ятьма пресетами допуску та калібруванням в один дотик. Завантажувати нічого не треба.
Спробуйте Spirit Level Pro безплатноЧому сирі дані датчика такі шумні?
Сирий вихід акселерометра стрибає більше, ніж можна очікувати. Навіть телефон, що лежить зовсім нерухомо, показує невеликі коливання. Частину цього дає електричний шум у самому датчику, частину — вібрація, що йде через поверхню, а частину — похибка округлення, коли аналоговий сигнал перетворюється на числа. Покажіть цей сирий потік на екрані — і пухирець тремтітиме без упину, а для акуратної роботи це марно.
Шум має кілька джерел. Тепловий шум — це випадкові електричні коливання від тепла. Прибрати його не можна, і саме він задає межу того, наскільки тихим датчик узагалі може бути. Вібраційний шум приходить зі світу довкола: компресор холодильника, кроки, машини на вулиці. А нульова точка датчика сама собою повільно дрейфує з часом. Кожне джерело потребує свого рішення.
Звичайне програмне рішення — фільтр низьких частот. Він пропускає повільні зміни, як-от справжній нахил, і стримує швидкі, як-от вібрацію. Найпоширеніший спосіб — експоненційне ковзне середнє, або EMA. Кожне нове показання враховується з часткою alpha, а решта переноситься з попереднього відфільтрованого значення:
Spirit Level Pro використовує EMA з alpha=0,15. Ми зупинилися на цьому числі, перебравши вручну цілий діапазон значень. При alpha=0,05 показання було гладеньким, як скло, але повільним, і пухирець відставав від телефона під час руху. При alpha=0,3 він добре встигав, але смикався настільки, що точне показання було важко впіймати. Alpha=0,15 — посередині. Пухирець відчувається живим, але не нервовим.
Яку роль відіграє гіроскоп?
Гіроскоп вимірює, як швидко телефон обертається, у градусах за секунду. Він не вимірює, куди телефон спрямований. Ця різниця важлива. Сам по собі гіроскоп не скаже вам, чи телефон горизонтальний. Він знає лише, чи телефон обертається й наскільки швидко. Для показання рівня, коли телефон лежить нерухомо, акселерометр уже має все потрібне.
Гіроскоп стає в пригоді, коли телефон рухається, — через злиття датчиків. Акселерометри добре читають статичний нахил, але стають повільними й шумними при швидкому русі. Гіроскопи добре стежать за швидким обертанням, але дрейфують, бо їхні дрібні похибки накопичуються з часом. Комплементарний фільтр або фільтр Калмана поєднує обидва: гіроскоп бере на себе швидкий рух, а акселерометр повертає довготривале показання до істини.
Більшість додатків рівня, зокрема й Spirit Level Pro, обходяться без злиття датчиків, бо задача статична. Ви кладете телефон, він усталюється, ви читаєте кут. Акселерометр справляється з цим самотужки. Злиття датчиків важливіше там, де щось у русі, наприклад дрон, який стежить за власним рухом, ніж коли ви перевіряєте полицю.
Чому калібрування таке важливе?
Кожен датчик MEMS виходить із заводу з невеликим вбудованим зміщенням. Це похибка, задана під час виробництва, і вона однакова в кожному показанні: фіксована величина у фіксованому напрямку. Тому чіп може показувати на градус чи два більше навіть тоді, коли телефон справді лежить рівно. Це головна причина, чому додаток рівня «з коробки» здається неточним.
Калібрування виправляє це: воно вимірює зміщення на поверхні, яку ви вважаєте рівною, і зберігає його. Spirit Level Pro зберігає значення в localStorage за ключами calibrationPitch і calibrationRoll. Відтоді кожне показання віднімає ці збережені числа ще до того, як воно потрапить на екран. Зміщення зникає.
Різниця велика. Без калібрування телефон зі зміщенням 1,5° буде помилятися на 1,5° на всьому. Він може показувати 0,0°, стоячи на справжньому схилі 1,5°. Відкалібруйте той самий телефон — і похибка впаде до кількох десятих градуса. Це найбільший виграш у точності, який можна отримати, і коштує він лише кількох секунд.
Як температура впливає на точність?
Датчики MEMS реагують на температуру. Кремнієві пружини, що тримають масу, розширюються й стискаються, коли чіп нагрівається й охолоджується, а це зсуває нульову точку. Тож перенесіть телефон із теплого авто в холодний гараж — і показання трохи попливе, поки датчик не усталиться на новій температурі. Зсув невеликий, але реальний.
Практичний висновок простий: калібруйте за тієї температури, за якої плануєте працювати. Калібрування, зроблене в теплому офісі, не втримається повністю в холодному гаражі. Не варто перейматися цим для кожної роботи. Для картин на стіні чи перевірки полиці дрейф надто малий, щоб його помітити. Для тонкої роботи в межах кількох десятих градуса дайте телефону хвилину-дві усталитися після різкої зміни температури, а потім калібруйте.
iPhone проти Android: чи різне апаратне забезпечення датчиків?
Різне, і це видно з того, як почувається додаток. Apple будує власний стек руху. iPhone, починаючи з 6s, мають окремий копроцесор руху від Apple, який обробляє дані датчиків окремо від головного процесора. Флагмани Samsung Galaxy спираються на компоненти STMicroelectronics, що вміщають трьохосьовий акселерометр і трьохосьовий гіроскоп на одному кристалі. Телефони Google Pixel використовували датчики Bosch і TDK InvenSense, залежно від року.
Після калібрування флагманський iPhone і флагманський Android виходять приблизно на один рівень. Різниця, яка справді має значення, — це між флагманом і бюджетним Android. Бюджетні телефони мають дешевші MEMS із нижчою роздільністю, і їхній сирий вихід шумніший. Калібрування все одно підтягує їх близько, і для більшості робіт своїми руками результат цілком годиться.
Що вирізняє iPhone у додатку рівня — це менше акселерометр, а більше той копроцесор руху. Він далі збирає дані датчиків із високою частотою навіть тоді, коли додаток не на передньому плані, тож у фільтра згладжування більше вибірок для роботи. Це значною мірою й пояснює, чому iPhone тут почуваються так плавно, навіть проти телефонів Android із датчиками, що на папері не гірші.
Часті запитання
Як працюють додатки рівня на телефоні?
Вони читають акселерометр MEMS телефона, який вимірює, як гравітація тягне вздовж трьох осей (X, Y, Z). Нахиліть телефон — і гравітація перерозподіляється між цими осями. Додаток застосовує формули arctan, щоб отримати pitch і roll, згладжує результат, аби вгамувати шум датчика, і показує його як пухирець або число. Усе це працює сотні разів на секунду.
Наскільки точний акселерометр телефона для рівня?
Відкалібрований флагманський телефон читає з точністю до кількох десятих градуса. Бюджетні телефони Android без калібрування читають гірше, бо їхні датчики дешевші й більше різняться від пристрою до пристрою. Найважливіший чинник — калібрування: воно прибирає заводське зміщення й підтягує майже будь-який телефон близько. Для більшості робіт своїми руками й на будові відкаліброваного телефона середнього класу цілком достатньо.
Чи використовує додаток рівня гіроскоп?
Для нерухомого телефона — ні. Акселерометр сам дає кут нахилу. Гіроскоп вимірює швидкість обертання, а не положення, тож він не скаже, чи телефон горизонтальний, — лише як швидко він обертається. Деякі додатки поєднують обидва датчики для плавніших показань у русі, але щоб притиснути телефон до стіни й прочитати кут, акселерометр робить усю роботу.
Чому мій додаток рівня трохи бреше навіть на рівній поверхні?
Зазвичай винне заводське зміщення. Кожен чіп MEMS має невелику вбудовану похибку, через яку він показує ненуль навіть тоді, коли телефон лежить рівно. Калібрування на поверхні, якій ви довіряєте, її прибирає. Інші причини — температурний дрейф, чохол, що трохи піднімає один край на поверхні, або пил під телефоном. Калібрування на чистому скляному столі після будь-якої різкої зміни температури владнує більшість проблем.
Повна картина
Додатки рівня працюють, бо фізика за ними надійна. Гравітація стала, акселерометр вимірює її постійно, а тригонометрія перетворює три числа на кут. Шлях від чутливого елемента до пухирця — це фіксована математика на всьому відрізку. Здогадок тут немає.
Що робить один додаток рівня кращим за інший — це не апаратне забезпечення. Кожен флагманський телефон уже йде з датчиками, яких більш ніж достатньо. Різниця в програмі: наскільки добре фільтрується сирий потік, як зберігається й застосовується калібрування, наскільки пресети допуску відповідають реальним задачам. Зробіть це правильно — і дешевий чіп MEMS не поступиться спеціалізованим інструментам, що коштують у рази більше.
Розуміння того, як працює датчик, також робить вас кращим користувачем. Калібруйте за робочої температури. Знімайте чохол для точних показань. Дайте числу усталитися секунду, перш ніж йому довіряти. Кожна з цих звичок випливає прямо з розуміння того, що робить апаратура.