Od dłuższego czasu szukałem sensora orientacji, który dostarcza gotowe dane, odciążając MCU mojego STM32F411 Black Pill. Wspierałem się AI, czytałem dokumentacje sensorów, wertowałem fora i blogi techniczne. Ostatecznie doprowadziło mnie to do BNO086 — sensora absolutnej orientacji, który spełnia wszystkie założone przeze mnie kryteria i nie wymaga od użytkownika ręcznej implementacji algorytmów fuzji.
Czym jest absolutna orientacja?
Absolutna orientacja oznacza określenie położenia obiektu względem pola magnetycznego Ziemi oraz globalnego układu odniesienia. Dzięki niej wiemy, gdzie jest góra, dół, kierunek północny, a także w jakim stopniu urządzenie jest obrócone. To jedna z kluczowych technologii w systemach autonomicznych: dronach, robotach mobilnych, robotycznych ramionach, pojazdach czy rakietach.
Aby uzyskać absolutną orientację urządzenia w przestrzeni, należy połączyć dane z co najmniej trzech typów czujników:
- akcelerometru,
- żyroskopu,
- magnetometru.
Proces ten nazywamy fuzją sensoryczną (sensor fusion). W praktyce chodzi o to, aby połączyć dane z różnych źródeł w jeden spójny model przestrzenny. Sam żyroskop bardzo szybko się „rozjeżdża”, akcelerometr reaguje na drgania i szumy, a magnetometr łatwo zakłócić. Dopiero połączenie tych trzech sensorów daje stabilny wynik.
W języku C/C++ istnieje wiele bibliotek realizujących fuzję danych – w tym filtry Kalmana, filtry komplementarne czy algorytmy Madgwick oraz Mahony. W Rust, szczególnie w środowisku no_std i bez alokacji pamięci dynamicznej, wybór jest znacznie mniejszy. Próba samodzielnego stworzenia takiego systemu szybko kończy się problemami: synchronizacją próbek, korekcją dryfu, kwaternionami, a do tego dochodzi ciągła walka o wydajność.
Sensor BNO086 – gotowa fuzja danych

Firma CEVA Technologies, w ramach swojego działu MotionEngine™, zdecydowała się rozwiązać problem fuzji danych bezpośrednio w sensorze. Zamiast dostarczać nam surowe dane i zmuszać do implementacji algorytmów, układy z rodziny BNO08X posiadają wbudowany mikrokontroler z zaawansowanym firmware’em odpowiedzialnym za analizę i filtrację sygnałów.
Co to oznacza w praktyce?
- nie musimy pisać własnego filtra Kalmana,
- nie martwimy się o dryf żyroskopu,
- nie musimy kalibrować magnetometru w kodzie,
- nie walczymy o synchronizację danych.
Sensor dostarcza gotową orientację – w postaci kwaternionów lub wektorów rotacji – i robi to z niesamowitą częstotliwością. Dla modelu, którego używam, jest to nawet 400 Hz, czyli 400 zestawów świeżych danych na sekundę.
„Fuzja na poziomie hardware” to uproszczenie — faktycznie operacje zachodzą w mikrokontrolerze wewnątrz układu, który uruchamia precyzyjne algorytmy CEVA. Jednak z perspektywy programisty wygląda to tak, jakbyśmy dostawali idealnie przetworzoną orientację „na tacy”.
To jest właśnie magia BNO086: całkowite odsunięcie problemu fuzji i skupienie się na logice projektu.
SHTP — nietypowa komunikacja, ale z bardzo dobrego powodu
Standardowe sensory IMU czy magnetometry obsługujemy za pomocą prostych odczytów po I²C, SPI lub UART: pobierz dane → przetwórz → powtórz. W przypadku BNO086 sprawa wygląda inaczej. Sensor generuje wiele typów raportów w czasie rzeczywistym, w różnych częstotliwościach i kanałach.
Dlatego CEVA Technologies wraz z producentem układów zdecydowali się na dedykowany protokół komunikacji — SHTP (Sensor Hub Transport Protocol).
Na początku może wydawać się przeszkodą. Po co kolejna warstwa? Dlaczego nagłówki, ramki, sekwencje? Ale gdy zrozumiesz sens działania, pojawia się „aha moment”.
Sensor generuje strumienie danych — nie jedną liczbę. Z tego powodu:
- transmisja odbywa się przez 4 niezależne kanały,
- każdy z nich ma osobne sequence number, dzięki czemu nie gubimy ramek,
- dane przychodzą w postaci raportów, a nie surowych odczytów.
Najważniejsze tryby raportów to m.in.:
- Stepper – licznik kroków do zastosowań mobilnych,
- Game Rotation Vector – orientacja bez odniesienia do magnetometru (idealne do VR, sterowania kamerą, aplikacji „gamingowych”),
- Rotation Vector – absolutna orientacja względem pola magnetycznego.
Właśnie ten ostatni tryb jest kluczowy, jeśli projektujemy drona, robota, satelitę, rakietę czy kosiarkę autonomiczna. Mamy orientację w świecie rzeczywistym — nie tylko „jak się obracam”, ale „jak jestem ustawiony względem całej planety”.
SparkFun BNO086 — najlepszy sposób na start

Płytka SparkFun BNO086 nie należy do najtańszych, ale w praktyce oszczędza Ci czasu i dostarcza pewne dane.
Najważniejsze plusy:
- Qwiic — plug&play bez lutowania
- Podłączasz kabel, a sensor działa po I²C na domyślnym adresie.
- Minimalny próg wejścia
- Pewność działania
Do projektów autonomicznych, w których liczy się czas reakcji, stabilność i prostota implementacji, to jedna z najlepszych opcji. Zreszta chyba jest to technologia domyślnie tworzona do telefonów (Smartfonów), a przynajmniej są rysunki telefonów w dokumentacji układu 😂
Tak na koniec
Co do Rust jest kilka bibliotek, z których możesz skorzystać w kontekście BNO086, ale szczerze to programiści fixują się tak na dostarczeniu komplementarnego rozwiazanie, że API wielu z nich to jakaś masakra. Jeszcze kiedyś o tym napisze.
