안드로이드 센서를 로봇 제어에 사용하기 (가속도 센서, 자기장 센서 )Android/개념 및 예제2015. 11. 23. 10:30
Table of Contents
반응형
게임 플레이시 안드로이드에 있는 센서를 이용하여 플레이하는 것이 어떻게 동작하는지 알아보기 위해..태스트 앱을 만들었습니다. 향후 로봇 제어용으로 사용하려고 구현해놓았는데 제대로 동작했으면 좋겠습니다...
안드로이드폰을 수평으로 놓아서 pitch 값이 0이되거나 안드로이드폰 상단을 아래로 향하게 해서 pitch값이 양수가 되면 로봇에 STOP신호를 주도록 작성할 계획입니다.
안드로이 폰을 들어서 보면 상단이 위로 향하게 되어 pitch값은 음수가 되고 이때 로봇에게 GO 명령을 줄 계획입니다..
이제 스마트폰을 게임플레이하던거 처럼 좌우로 기울이면 로봇에게 해당 방향으로 전진하도록 할 계획입니다...
AndroidManifest.xml파일에 다음 퍼미션 두 가지를 추가해주어야 합니다..
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
그리고 다음은 메인 레이아웃 XML파일입니다. 여기에서 사용한 img.png 파일은 res/drawable폴더에 넣어주셔야 합니다..아래 있는 삼각형 이미지입니다.
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="100dp"
- tools:context=".MainActivity" >
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ImageView
- android:id="@+id/pointer"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:src="@drawable/img" />
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text=""
- android:textSize="40sp"
- android:gravity="center"
- android:id="@+id/textView" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="New Text"
- android:id="@+id/pitch" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="New Text"
- android:id="@+id/roll" />
- </LinearLayout>
- </RelativeLayout>
메인 액티비티 자바파일입니다..
- package com.tistory.webnautes.sensorexample;
- import android.app.Activity;
- import android.graphics.Color;
- import android.hardware.Sensor;
- import android.hardware.SensorEvent;
- import android.hardware.SensorEventListener;
- import android.hardware.SensorManager;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.RotateAnimation;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class MainActivity extends Activity implements SensorEventListener {
- private ImageView mPointer;
- private SensorManager mSensorManager;
- private Sensor mAccelerometer;
- private Sensor mMagnetometer;
- private float[] mLastAccelerometer = new float[3];
- private float[] mLastMagnetometer = new float[3];
- private boolean mLastAccelerometerSet = false;
- private boolean mLastMagnetometerSet = false;
- private float mCurrentDegree = 0f;
- TextView pitchValue, rollValue;
- private TextView view;
- @Override
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- view = (TextView) findViewById(R.id.textView);
- view.setBackgroundColor(Color.GREEN);
- mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
- mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
- mPointer = (ImageView) findViewById(R.id.pointer);
- pitchValue=(TextView) findViewById(R.id.pitch);
- rollValue = (TextView) findViewById(R.id.roll);
- }
- @Override
- protected void onResume() {
- super.onResume();
- mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
- mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_UI);
- }
- @Override
- protected void onPause() {
- super.onPause();
- mSensorManager.unregisterListener(this, mAccelerometer);
- mSensorManager.unregisterListener(this, mMagnetometer);
- }
- public static float[] computeOrientation(float[] accel, float[] magnetic){
- float[] inR = new float[16];
- float[] I = new float[16];
- float[] outR = new float[16];
- float[] values = new float[3];
- SensorManager.getRotationMatrix(inR, I, accel, magnetic);
- SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR);
- SensorManager.getOrientation(outR, values);
- return values;
- }
- @Override
- public void onSensorChanged(SensorEvent event) {
- long lastComputedTime = 0;
- if (event.sensor == mAccelerometer) {
- System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
- mLastAccelerometerSet = true;
- } else if (event.sensor == mMagnetometer) {
- System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
- mLastMagnetometerSet = true;
- }
- if (mLastAccelerometerSet &&mLastMagnetometerSet) {
- long tempTime = System.currentTimeMillis();
- if(tempTime - lastComputedTime > 1000){
- float[] orientationValues = computeOrientation(mLastAccelerometer, mLastMagnetometer);
- int pitch = (int)((360 * orientationValues[1]) / (2 * Math.PI));
- int roll = (int) ((360 * orientationValues[2]) / (2 * Math.PI));
- //경사도
- pitchValue.setText("pitch="+String.valueOf(pitch));
- //좌우회전
- rollValue.setText("roll="+String.valueOf(roll));
- RotateAnimation ra = new RotateAnimation(
- mCurrentDegree,
- roll,
- Animation.RELATIVE_TO_SELF, 0.5f,
- Animation.RELATIVE_TO_SELF,
- 0.5f);
- ra.setDuration(250);
- ra.setFillAfter(true);
- mPointer.startAnimation(ra);
- mCurrentDegree =roll;
- if (pitch<0) {
- view.setBackgroundColor(Color.GREEN);
- view.setText("GO");
- } else {
- view.setBackgroundColor(Color.RED);
- view.setText("STOP");
- }
- }
- }
- }
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // TODO Auto-generated method stub
- }
- }
반응형
'Android > 개념 및 예제' 카테고리의 다른 글
android에서 Navigation Drawer 사용하기 (5) | 2016.08.06 |
---|---|
Android의 LinearLayout 정리 (0) | 2016.07.14 |
안드로이드 에코 클라이언트 앱 (2) | 2015.11.14 |
안드로이드 백그라운드 서비스 예제 - IntentService (0) | 2015.02.21 |
Android WebView 예제 (0) | 2014.07.09 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!