Flutter/Pub.dev(Plug-in)

[Flutter] 가속도와 자이로스코프 센서 (sensors_plus, shake)

개발자킹콩 2023. 4. 8. 16:56

 

목차

  • 플러그인 정보
  • 가속도 센서
  • 자이로스코프 센서
  • sensors.plus 플러그인: 1.3.4+1
  • shake 플러그인: 2.1.0

 

 


 

가속도 센서

가속도계는 말 그대로 특정 물체가 특정 방향으로 이동하는 가속도가 어느 정도인지를 숫자로 측정하는 기기입니다. 대부분의 휴대폰에는 가속도계가 장착되어 있습니다. 휴대폰을 정면으로 봤을 때 x, y, z 축의 의미는 다음과 같습니다.

1) x축: 좌우로 움직이는 방향입니다.

2) y축: 위아래로 움직이는 방향입니다.

3) z축: 앞뒤로 움직이는 방향입니다.

 

 - 휴대폰을 아이폰과 같이 정면으로 세웠을때의 상태입니다.

 - 가속도계는 x, y, z축으로의 직선 움직임만 측정할 수 있습니다.

 - 가속도계를 사용해서 움직임 이벤트를 받으면 x, y, z축의 측정 결과가 모두 double 값으로 반환 됩니다. 

 

 

 

 

 


 

 

자이로스코프(Gyroscope): 회전 측정

자이로스코프는 x, y, z축의 회전을 측정할 수 있습니다. 

1) x축: 좌우로 회전하는 방향입니다.

2) y축: 위아래로 회전하는 방향입니다.

3) z축: 앞뒤로 회전하는 방향입니다.

 

 - 휴대폰을 아이폰과 같이 정면으로 세웠을때의 상태입니다.

 - 가속도계와 마찬가지로 자이로스코프도 회전에 대한 이벤트를 받게되면 x, y, z축 모두에서의 회전값이 동시에 반환됩니다.

 

 

 

 

 


 

 

sensors.plus 플러그인: 1.3.4+1

 

sensors_plus 패키지를 사용하면 가속도계와 자이로스코프 센서를 간단하게 사용할 수 있다. 그렇게 되면 이 움직임을 측정하여 유의미한 데이터로써 사용하려면 정규화 작업이 필요하다. 그래서 나의 프로젝트에 맞게 커스텀이 자유롭다. 하지만 휴대폰이 움직였는지 체크하는 정도라면 shake를 사용하길 권장하겠다. shake는 정규화 작업까지 완료되어 있는 플러그인이다.

 

import 'package:sensors_plus/sensors_plus.dart';

void SensorsPlusTest() {
  
  // 중력을 반영한 가속도계 값
  accelerometerEvents.listen((AccelerometerEvent event) {
    print(event.x);
    print(event.y);
    print(event.z);
  });

  // 중력을 반영하지 않은 순수 사용자의 힘에 의한 가속도계 값
  userAccelerometerEvents.listen((UserAccelerometerEvent event) {
    print(event.x);
    print(event.y);
    print(event.z);
  });
  
  // 회전
  gyroscopeEvents.listen((GyroscopeEvent event) {
    print(event.x);
    print(event.y);
    print(event.z);
  });
}

 

 

 

 

 


 

 

shake 플러그인: 2.1.0

 

Shake 플러그인은 Gyroscope(회전)를 사용하지 않고 Accelerometer(가속도) 과 정규화의 기능만 담겨 있습니다. 

 

Shake 플러그인은 계속해서 흔들림을 감지하는 detector 가 존재해야 합니다. controller와 유사한 기능을 합니다.

1) ShakeDetector 을 생성 시 단 한 번만 호출되는 StatefulWidget의 initState()에서 생성해줍니다.

2) autoStart 생성자를 이용하면 코드가 실행되는 순간부터 흔들기를 감지합니다.

3) waitForStart 생성자를 이용하면 코드만 등록을 해두고 추후에 흔들기 감지를 시작하는 코드를 따로 실행해줄 수 있습니다.

4) 해당 위젯이 없어지면 shakeDetector 가 더 이상 흔들림을 감지하지 않아도 됩니다. 메모리 제거를 해주어야 합니다. ShakeDetector.autoStart에서 반환받은 값에 stopListening() 함수를 실행하여 간단하게 제거 가능합니다.

 

 

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:shake/shake.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  double threshold = 2.7;  // 임계값, 문지방, 입구
  int number = 1;
  ShakeDetector? shakeDetector;

  @override
  void initState() {
    super.initState();

    shakeDetector = ShakeDetector.autoStart(
      shakeSlopTimeMS: 100,              // 감지 주기
      shakeThresholdGravity: threshold,  // 감지 민감도
      onPhoneShake: onPhoneShake,        // 감지 후 실행할 함수
    );
  }

  @override
  void dispose() {
    shakeDetector?.stopListening();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Text(
        number.toString
      ),
    );
  }

  void onPhoneShake() {
    final rand = Random();

    setState(() {
      number = rand.nextInt(5) + 1;
    });
  }
}

 

 

 

 

 


 

 

 

Reference

 

https://link.coupang.com/a/UB3Sk

 

Must Have 코드팩토리의 플러터 프로그래밍:Dart & Flutter 입문부터 실전에 유용한 10가지 앱 개발과 

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."