모바일 기기의 가속도계는 3개 축의 선형 가속도를 측정하여 기기의 방향과 운동을 파악하는 MEMS 센서입니다. Google Android Sensors Guide (2025)에 따르면, 가속도계는 모바일 앱에서 가장 널리 사용되는 센서입니다. MEMS 기술을 통해 1mm 칩에 센서를 탑재하며, 1mW 미만의 전력을 소모합니다.
중요 요점
가속도계 는 서로 직교하는 3개의 축에 대한 가속도의 투영을 측정하는 MEMS 센서입니다: X (수평, 오른쪽), Y (수직, 위쪽), Z (화면에 수직). 정지 상태에서 가속도계는 Z축에 9.8 m/s²를 나타냅니다 — 이것은 지구 중심으로 향하는 중력 가속도입니다. 시스템은 이 값을 기반으로 기기의 방향을 결정합니다: Z값이 0에 근접하고 Y값이 -9.8 m/s²에 근접하면 기기가 수평으로 회전된 것입니다. 가속도계의 측정 범위는 칩 모델에 따라 보통 ±2g, ±4g, ±8g 또는 ±16g입니다.
현대의 가속도계는 여러 핵심 파라미터로 구분됩니다: 민감도 (0.001 m/s² 부터), 샘플링 율 (1000Hz까지), 측정 범위, 잡음 레벨. 플래그십 기기에는 1600Hz까지의 주파수와 활성 모드에서 0.5mW 미만을 소모하는 STMicroelectronics LSM6DSO 또는 Bosch BMI270 센서가 사용됩니다. 샘플링 율이 높을수록 앱이 받는 신호가 더 상세해집니다 — 게임은 200~400Hz가 필요하며, 걸음 칸수는 10~50Hz면 충분합니다. 센서 잡음은 측정 정확도에 영향을 미치며, OS 레벨에서 저역탈 필터로 보정됩니다.
MEMS 가속도계는 내부적으로 고정 전극 사이에 탄성 캔틸레버에 매달된 미세 실리콘 구조물로 구성됩니다: 테스트 질량입니다. 가속도가 가해지면 질량이 이동하며, 이동 요소와 고정 요소 사이의 정용량이 변경됩니다 — 이 변화를 측정하여 전기 신호로 변환합니다. 폐폔루프 피드백 회로가 정전기적 힘을 사용하여 질량을 중앙 위치에 유지하며, 전 범위에서 선형성을 보장합니다. 오픈루프 시스템에서는 질량이 자유롭게 움직이며 계산은 간단하지만 정확도가 떨어집니다. STMicroelectronics (2025)에 따르면, 폐폔루프 가속도계는 0.1 mg/°C 미만의 온도 드립트로 0.001g까지의 정확도를 달성합니다.
가속도계의 3개 축은 3가지 공간 차원에 해당합니다: X (좌우 기울기), Y (상하), Z (화면에 대한 전후). 기기를 화면이 위로 하여 테이블에 놓으면, 중력 가속도 벡터가 Z축에 9.8 m/s²로 향합니다. 기기를 기울이면 중력의 투영이 축 간에 재분배됩니다 — 이 투영으로부터 0.1도 이내의 정확도로 기울기 각을 계산할 수 있습니다. 중력의 영향 없이 운동을 감지하려면, 고역탈 필터를 사용하여 가속도의 동적 요소 (기기 자체의 운동)를 정적 요소 (중력)에서 분리합니다.
Android에서는 가속도계에 접근하려면 SensorManager 클래스와 SensorEventListener 인터페이스를 통합니다. 앱은 SENSOR_SERVICE 시스템 서비스를 획득하고, TYPE_ACCELEROMETER 센서를 요청하고, 지정된 업데이트 율로 리스너를 등록합니다. 시스템은 새로운 측정마다 값의 배열을 붙여 onSensorChanged를 호출합니다: values[0] = X, values[1] = Y, values[2] = Z. 아래는 Kotlin에서 가속도계 데이터를 읽는 완전한 예제입니다.
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
val sensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
// 기울기 각 계산
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// 새로운 각으로 UI 업데이트
textViewAngle.text = "기울기: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
예제에서 SensorManager.SENSOR_DELAY_GAME은 업데이트 율을 ~50Hz로 설정하며, 게임과 대화형 앱에 최적적입니다. 걸음 칸수에는 SENSOR_DELAY_NORMAL (~5Hz)을, 정밀 측정에는 SENSOR_DELAY_FASTEST (~200Hz)를 사용하세요. onSensorChanged에서 event.values 배열에는 현재 센서 읽기 값이 들어있습니다. X, Y, Z 값을 기반으로 atan2를 사용하여 기울기 각(피치)을 계산합니다 — 이것은 방향 센서 없이 기기 방향을 결정하는 기본 공식입니다. 배터리를 절약하려면 onPause에서 리스너를 반드시 해제하세요.
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// 중렐 추출용 저역탈 필터 (LPF)
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]
// 중력 빼기 — 선형 가속도 획득
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
계수 alpha의 저역탈 필터가 중력 성분 (정적 벡터)을 추출합니다; 이것을 빼면 기기의 순수 가속도 (선형 가속도)가 나옵니다. 이것은 방향을 고려하지 않고 운동을 감지하는 데 필요합니다 — 예를 들어, 걸음, 흔들맄, 충격 감지. alpha값 0.8은 필터가 새 신호의 ~20%를 통과시키고 이전 신호의 80%를 유지한다는 의미입니다 — 클 지연 없이 잡음을 제거하기에 충분합니다.
iOS에서는 가속도계에 접근하려면 Core Motion 프레임워크의 CMMotionManager 클래스를 통합니다. 앱은 매니저 인스턴스를 생성하고 큐와 핸들러를 통해 startAccelerometerUpdates를 호출합니다. 데이터는 x, y, z 필드가 있는 CMAcceleration 구조체를 포함한 CMAccelerometerData로 반환됩니다. 아래는 잡음 필터링과 함께 Swift에서 가속도계 데이터를 가져오는 예제입니다.
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 1.0 / 60.0
guard motionManager.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) {
data, error in
guard let acceleration = data?.acceleration,
error == nil else { return }
// g 단위 값 (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// magnitude > 2.5g 이면 흔들림 감지
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
예제에서 accelerometerUpdateInterval은 1/60초 (~60Hz)로 설정되어 부드러운 애니메이션과 게임에 최적적입니다. isAccelerometerAvailable 메소드는 센서가 기기에 있는지 확인합니다. 가속도 값은 g 단위 (1 g = 9.8 m/s²)로 반환됩니다. magnitude 벡터는 3개 요소의 탈라클리드 노름으로 계산됩니다 — 2.5g를 초과하면 기기 흔들맄으로 해석됩니다. 업데이트를 멈추려면 화면을 떠날 때 반드시 stopAccelerometerUpdates를 호출하세요.
가속도계는 다양한 모바일 앱에서 사용됩니다. 가장 명확한 사례는 자동 화면 회전입니다: 시스템이 가속도계 데이터에 기반하여 세로와 가로 모드를 전환합니다. 게임에서는 가속도계가 제어 입력으로 작동합니다 — 기기를 기울이면 스테어링 퀘어가 돌아가거나 캐릭터가 움직입니다. 피트니스 앱은 걸을 때의 특징적인 가속도 피크를 기반으로 걸음수를 계산합니다. 아래는 일반적인 사례와 센서 요구 사항을 나타낸 표입니다.
| 사례 | 주파수 (Hz) | 정확도 | 필터링 |
|---|---|---|---|
| 자동 화면 회전 | 5~10 | 낮음 | LPF |
| 걸음 칸수 | 20~50 | 중간 | HPF + 피크 감지 |
| 게임 (레이싱) | 50~200 | 높음 | 캘리브레션 + LPF |
| 카메라 안정화 | 200~1000 | 최대 | 보완 필터 |
| 제스처 인식 | 50~100 | 중간 | HPF + 임계값 감지 |
가속도계를 구현할 때는 기기의 발열과 센서 노화가 읽기 정확도에 영향을 미칠 수 있다는 점을 유념하세요. 중요한 측정 (비디오 안정화, 나침판) 경우 센서 푸전의 일부로 자이로스코프와 지남의차도 사용할 것을 권장합니다.
가속도계는 여러 유형의 오류에 영향을 받습니다: 영점 편의 (bias) — 정지 상태에서 제로가 아닌 값을 나타냄; 스케일 요인 오류 — 축마다 민감도가 다름; 그리고 측정 잡음으로 단일 읽기 정확도가 떨어집니다. MEMS 센서는 제조 시 캘리브레션되지만, 시간이 지남에 따라 온도와 기계적 응력으로 인해 파라미터가 변하할 수 있습니다. 앱 내에서 보정하려면 간단한 캘리브레션을 구현할 수 있습니다: 정지 상태에서 평균값(편의)을 기록하고 이것을 모든 이후 측정에서 빵니다. 더 정밀한 캘리브레션은 모든 축에 대해 기기를 회전시켜야 합니다 — 이 방법을 6점 캘리브레션이라 하며 0.5% 미만의 오류를 달성합니다.
자주 묻는 질문
스마트폰의 가속도계는 약 1mm 크기의 MEMS 센서로 3개 축의 가속도를 측정합니다. 외부 있원없이 기기 방향 (세로/가로), 흔들맄, 걸음, 운동을 감지합니다.
가속도계는 선형 가속도(중력 포함)를, 자이로스코프는 각속도(회전)를 측정합니다. 가속도계는 방향을 결정하고, 자이로스코프는 회전을 감지합니다. 같이 사용하면 공간에서 정확한 운동 추적(센서 푸전)이 가능합니다.
SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)를 사용하여 센서를 획득한 후, SensorEventListener로 registerListener합니다. onSensorChanged에서 event.values 배열에 X, Y, Z 값 (m/s²)이 있습니다. onPause에서 반드시 등록을 해제하세요.
magnitude = sqrt(x² + y² + z²)를 계산하세요. 값이 2~3g(중력 필터링 후)을 초과하면 기기가 흔들린 것입니다. iOS에서는 임계값 2.5g의 CMMotionManager를, Android에서는 임계값 15 m/s²의 Sensor.TYPE_LINEAR_ACCELERATION을 사용하세요.
네, 간단한 캘리브레션을 위해 기기를 평혼한 그위에 놓고 2~3초 동안 각 축의 평균 값을 기록하여 모든 이후 측정에서 빵니다. 이것은 영점 편의를 보정하지만 스케일 오류는 보정하지 못합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.