Core Motion: istota, czujniki ruchu i przetwarzanie danych

Autor: IT Sectr Opublikowano: 2026-03-25 Czas czytania: 8 min

Framework Core Motion to systemowy komponent iOS, zapewniający dostęp do danych akcelerometru, żyroskopu, magnetometru i krokomierza na urządzeniach Apple. Według Apple Developer Documentation, 2025, framework przetwarza surowe dane czujników i przekształca je w zrozumiałe metryki — przyspieszenie, prędkość kątową, orientację i liczbę kroków. Jeden API dla wszystkich czujników ruchu pozwala programistom tworzyć krokomierze, aplikacje fitness i gry z sterowaniem poprzez przechylanie urządzenia.

Najważniejsze

  • Core Motion — framework Apple do przetwarzania danych z czujników ruchu iPhone i iPad.
  • CMMotionManager — centralna klasa do dostępu do akcelerometru, żyroskopu i magnetometru.
  • CMAltimeter — klasa do pobierania danych o względnej wysokości i zmianie ciśnienia.
  • CMPedometer — klasa do liczenia kroków, przebytego dystansu i prędkości ruchu.
  • CMDeviceMotion — połączone dane z filtracją grawitacji (userAcceleration).

Czym jest Core Motion?

Core Motion — systemowy framework Apple, wprowadzony w iOS 4 do pracy z czujnikami ruchu urządzenia. Zapewnia jednolity interfejs dostępu do akcelerometru, żyroskopu, magnetometru i krokomierza, oszczędzając programiście konieczności pracy z sterownikami sprzętowymi na niskim poziomie.

Kluczową zaletą Core Motion jest sprzętowa filtracja danych. Framework automatycznie łączy odczyty akcelerometru i żyroskopu w celu obliczenia czystego userAcceleration bez składowej grawitacyjnej, a także podaje orientację urządzenia w przestrzeni w postaci kwaternionów i kątów Eulera.

Według Apple WWDC 2023, Core Motion jest używany w ponad 80% aplikacji fitness w App Store. Framework jest zoptymalizowany pod kątem zużycia energii — częstotliwość odpytywania czujników automatycznie spada przy braku subskrybentów, wydłużając czas pracy urządzenia na baterii.

Ważną cechą architektoniczną jest wykorzystanie koprocesora serii M (Motion coprocessor), który przetwarza dane czujników ruchu niezależnie od głównego procesora serii A. Począwszy od chipa M7 (iPhone 5S), koprocesor stale zbiera dane akcelerometru i żyroskopu, umożliwiając CMPedometer i CMAltimeter pracę w tle przy zablokowanym ekranie z poborem mocy poniżej 1 mW. Stało się to możliwe dzięki izolacji sprzętowej: koprocesor posiada własną nieulotną pamięć i magistralę danych, niezależną od głównego systemu.

Architektura Core Motion

Architektura Core Motion zbudowana jest według modelu singleton poprzez CMMotionManager. Aplikacja otrzymuje pojedynczą instancję menedżera i za jego pomocą konfiguruje częstotliwość aktualizacji, uruchamia lub zatrzymuje zbieranie danych z każdego typu czujnika. Dane są dostarczane przez bloki z określonym interwałem.

Framework wykorzystuje dwa tryby pozyskiwania danych: pull (aktywne odpytywanie przez startAccelerometerUpdates) i push (pasywne otrzymywanie przez startAccelerometerUpdatesToQueue). Tryb push jest preferowany dla aplikacji UI, ponieważ dane są dostarczane do określonej kolejki bez blokowania głównego wątku.

swift
import CoreMotion

let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 0.1

guard motionManager
    .isAccelerometerAvailable else { return }

motionManager.startAccelerometerUpdates(
    to: OperationQueue.current()!
) { data, _ in
    guard let accel = data?.acceleration else { return }
    print("X: \(accel.x), Y: \(accel.y), Z: \(accel.z)")
}

Czujniki Core Motion

Core Motion zapewnia dostęp do czterech kategorii czujników: akcelerometr mierzy liniowe przyspieszenie w trzech osiach, żyroskop — prędkość kątową obrotu, magnetometr — natężenie pola magnetycznego dla kompasu. Czwarta kategoria — połączone dane CMDeviceMotion, które obejmują filtrowane odczyty wszystkich czujników.

CMDeviceMotion — najcenniejsza klasa do programowania. Dostarcza userAcceleration (przyspieszenie bez grawitacji), rotationRate (prędkość obrotu), magneticField (wektor pola magnetycznego) i attitude (orientacja urządzenia w postaci kwaternionu lub kątów Eulera). Do obliczania attitude Core Motion wykorzystuje fuzję danych żyroskopu i akcelerometru według algorytmu podobnego do filtra komplementarnego.

Magnetometr służy do korekcji dryfu żyroskopu. Czysty żyroskop z czasem gromadzi błąd z powodu dryfu temperaturowego i szumu — magnetometr i akcelerometr korygują ten błąd, zapewniając dokładność orientacji do 1–2 stopni w pozycji statycznej.

swift
guard motionManager
    .isDeviceMotionAvailable else { return }

motionManager.deviceMotionUpdateInterval = 1.0 // 1 Hz

motionManager.startDeviceMotionUpdates(
    using: .xArbitraryZVertical,
    to: OperationQueue.current()!
) { motion, _ in
    guard let attitude = motion?.attitude else { return }
    print("Roll: \(attitude.roll)")
    print("Pitch: \(attitude.pitch)")
    print("Yaw: \(attitude.yaw)")
}

Krokomierz i altimetr

CMPedometer — klasa do liczenia kroków, przebytego dystansu i tempa ruchu. Wykorzystuje dane akcelerometru z sprzętowym przetwarzaniem na koprocesorze ruchu serii M (M7/M8/M9/M10/M11). Umożliwia to pracę w tle z minimalnym zużyciem energii — około 1% baterii na 8 godzin ciągłego śledzenia.

CMAltimeter — klasa do określania względnej wysokości na podstawie barometru, zainstalowanego w iPhone 6 i nowszych. Pokazuje zmianę wysokości względem punktu początkowego z dokładnością około 1 metra. Używany w aplikacjach fitness do liczenia pięter i w nawigacyjnych do określania różnic wysokości.

Dane CMPedometer są dostępne z opóźnieniem nie większym niż 5 sekund dla bieżących odczytów. Dla danych historycznych dostępny jest wybór z ostatnich 7 dni przez queryPedometerData. Krokomierz automatycznie rozpoznaje chodzenie, bieganie i jazdę — te typy aktywności są dostępne przez queryPedometerData z filtrem według typu.

Dokładność i ograniczenia

Dokładność CMPedometer wynosi około 95% przy normalnym chodzeniu i spada do 90% przy bieganiu. Na dokładność wpływają: umieszczenie telefonu w kieszeni lub plecaku, rodzaj obuwia i nawierzchnia. Apple zaleca używanie CMPedometer w połączeniu z Core Location do określania dystansu na otwartym powietrzu — GPS zapewnia dokładniejszy dystans, a Core Motion — liczenie kroków.

swift
let pedometer = CMPedometer()

guard CMPedometer
    .isStepCountingAvailable() else { return }

pedometer.startUpdates(from: Date()) { data, _ in
    guard let pedData = pedometerData else { return }
    print("Kroki: \(pedData.numberOfSteps)")
    print("Dystans: \(pedData.distance)")
}

// Dostęp do altimetru
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
    to: OperationQueue.current()!
) { data, _ in
    print("Wysokość: \(data?.relativeAltitude)")
}

Integracja Core Motion w aplikacji

Integracja Core Motion nie wymaga specjalnych uprawnień ani entitlement — wystarczy dodać import frameworka i utworzyć instancję CMMotionManager. Jednak dla CMPedometer od iOS 11 wymagane jest żądanie autoryzacji przez CMStepCounter lub użycie CMPedometer z żądaniem zgody przez systemowe okno dialogowe.

Proces integracji obejmuje: utworzenie CMMotionManager, sprawdzenie dostępności czujnika przez isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, ustawienie interwału aktualizacji i uruchomienie pobierania danych. Ważne jest zatrzymywanie aktualizacji przez stopAccelerometerUpdates, gdy dane nie są potrzebne — ma to krytyczne znaczenie dla zużycia energii.

Do pracy w tle krokomierza CMPedometer i altimetru CMAltimeter nie wymagają dodatkowych ustawień — wykorzystują koprocesor ruchu. Dla CMMotionManager praca w tle jest niedostępna — dane są zbierane tylko gdy aplikacja jest aktywna i znajduje się na pierwszym planie. Jedynym warunkiem dla CMPedometer jest to, że aplikacja musi być przynajmniej raz uruchomiona przez użytkownika po instalacji w celu inicjalizacji subskrypcji aktualizacji w tle z iOS.

Optymalizacja zużycia energii

Core Motion obsługuje adaptacyjną częstotliwość odpytywania: jeśli aplikacja nie potrzebuje danych w czasie rzeczywistym, wystarczy ustawić interwał 1–5 Hz zamiast 100 Hz. Dla aplikacji fitness optymalna częstotliwość to 10 Hz dla CMMotionManager i 1 Hz dla CMPedometer. Apple zaleca obniżanie częstotliwości do minimalnie wymaganej dla poprawnego działania.

Dla gier z sterowaniem poprzez przechylanie wymagana jest częstotliwość 60–100 Hz, aby zapewnić płynność reakcji. W tym przypadku ważne jest użycie startDeviceMotionUpdates z oddzielną kolejką i jak najszybsze przetwarzanie danych. Według Apple, częstotliwość 60 Hz zużywa około 2 razy więcej energii niż 30 Hz.

Podczas pracy z Core Motion należy uwzględnić kompatybilność urządzeń: żyroskop jest nieobecny w iPhone 3GS i iPad 1. generacji, magnetometr — we wszystkich iPad bez modułu komórkowego. Do sprawdzenia dostępności czujników służą statyczne metody isAccelerometerAvailable, isGyroAvailable i isDeviceMotionAvailable klasy CMMotionManager. W symulatorze Core Motion zwraca dane testowe — do debugowania na rzeczywistym czujniku zawsze potrzebne jest fizyczne urządzenie Apple.

swift
// Optymalna konfiguracja dla aplikacji fitness
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Hz

motionManager.startDeviceMotionUpdates(
    to: .main
) { [weak self] motion, error in
    guard let self = self,
          let motion = motion else { return }

    if motion.userAcceleration.magnitude() > 2.0 {
        self.detectedSignificantMovement()
    }
}

Często zadawane pytania

Czy Core Motion działa na iPad i iPod touch?

Tak, Core Motion działa na wszystkich urządzeniach Apple z niezbędnymi czujnikami. Akcelerometr jest we wszystkich iPhone, iPad i iPod touch. Żyroskop — we wszystkich iPhone 4 i nowszych, iPad 2 i nowszych. Magnetometr — tylko w iPhone, w iPad brak. Barometr — w iPhone 6 i nowszych.

Jak Core Motion wpływa na baterię?

Wpływ na baterię zależy od częstotliwości odpytywania. Przy 100 Hz Core Motion zużywa około 5–7% baterii na godzinę. Przy 10 Hz — około 1–2% na godzinę. CMPedometer na koprocesorze ruchu zużywa mniej niż 1% przez 8 godzin pracy. Apple zaleca zawsze zatrzymywać aktualizacje, gdy dane nie są potrzebne.

Czy można użyć Core Motion do stworzenia krokomierza?

Tak, CMPedometer dostarcza gotowe rozwiązanie dla krokomierza bez konieczności przetwarzania surowych danych akcelerometru. Klasa automatycznie rozpoznaje kroki z dokładnością około 95% przy chodzeniu i 90% przy bieganiu. Do niestandardowego detektora kroków można użyć CMMotionManager z własnym algorytmem.

Czym różni się Core Motion od frameworka ruchu na Androidzie?

Core Motion jest zintegrowany z iOS na poziomie systemu i wykorzystuje koprocesor serii M do niskoenergetycznego przetwarzania. Android używa SensorManager z bezpośrednim dostępem do sterowników sprzętowych, ale nie posiada wyspecjalizowanego koprocesora, co zwiększa zużycie energii przy śledzeniu w tle.

Czy potrzebne jest specjalne zezwolenie dla CMPedometer?

Dla CMPedometer w iOS 11 i nowszych wymagana jest zgoda użytkownika. Żądanie jest wykonywane automatycznie przy utworzeniu CMPedometer i wywołuje systemowe okno dialogowe. W Info.plist należy dodać klucz NSMotionUsageDescription z opisem, dlaczego aplikacja potrzebuje dostępu do danych ruchu.

Podsumowanie

  • Core Motion — systemowy framework iOS do pracy z akcelerometrem, żyroskopem i magnetometrem.
  • CMMotionManager — centralna klasa zapewniająca dostęp do wszystkich czujników ruchu urządzenia.
  • CMDeviceMotion dostarcza filtrowane dane — userAcceleration, attitude i rotationRate.
  • CMPedometer wykorzystuje koprocesor serii M do liczenia kroków z minimalnym zużyciem energii.
  • CMAltimeter mierzy zmianę wysokości z dokładnością do 1 metra za pomocą barometru.
  • Integracja nie wymaga entitlement, ale dla CMPedometer potrzebny jest NSMotionUsageDescription.
  • Koprocesor M7–M11 zapewnia zbieranie danych w tle z poborem mocy poniżej 1 mW.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również