< 중간보고서 > 가속도센서를이용한 실내위치인식 지도교수 이창훈교수님 Team 12 200412307 김상은 200511305 김성규 200511306 김성훈
1. 프로젝트소개 1.1 배경및목적 1.2 시나리오 1.3 프로젝트기능 2. 관련기술 2.1. 안드로이드센서 2.1.1 SENSOR_ORIENTATION ( 방향센서 ) 2.1.2 SENSOR_ACCELEROMETER ( 가속도센서 ) 2.2 가속도를이용한거리측정알고리즘 2.2.1 가속도 - 거리관계 2.2.2 Trapezoidal Method 2.2.3 Calibration 2.2.4 Filtering 2.2.5 Mechanical Filtering Window 2.2.6 Positioning 2.2.7 Movement End Check 3. 기대효과및활용 3.1 기대효과 3.2 발전방향 3.3 활용가능성 4. 진행상황 4.1 가속도센서연산 4.2 PC 서버 4.3 문제점및진행방향 5. 개발계획 5.1 개발및테스트환경 5.2 개발일정 5.3 역할분담 6. 참조
1. 프로젝트소개 1.1 배경및목적최근스마트폰이대중화되어많은사람들이스마트폰의어플리케이션을이용하고있으며 GPS와 Wi-Fi로부터얻은위치정보를이용한다양한어플리케이션의활용이두드러졌다. 하지만 GPS는신호가닿지않는지하나건물내부에서는위치인식이부정확하며접속한 Wi-Fi의중계기 (AP) 의위치로인식하는경우실제위치를인식할수없으며다수의 AP를이용하는경우최소 3개이상의 AP가필요하며 AP의신호강도가단순히거리에정비례하지않으므로정확한위치파악이어려운단점이있다. 따라서기존의 GPS와 Wi-Fi를이용하지않고가속도센서를이용하여움직임을수학적으로연산하여분석하는접근방식으로실내위치인식기술을구현하는것이목적이다. 1.2 시나리오 GPS가닿지않는경우현재를위치를파악할수없으며코엑스, 공연장, 박물관등과같은건물내의배치도를통해사용자가직접현재위치파악해야하는불편을겪는다. 건물의입구와같이현재위치를알수있는지점에서최초의위치를설정한다. 위치확인 1 최초위치설정 위치확인 2 첫설정후자유롭게이동하면가속도센서를통한이동거리및방향을연산한다. 최초의설정위치와연산한값을통해실내에서의현재위치를파악한다. 1.3 프로젝트기능 사용자로부터최초의위치를입력받음 스마트폰의가속도센서와자이로센서로부터데이터를수집 수집한데이터를분석하여이동거리를연산 최초위치와연산값을이용하여현재위치를표시 오차가적은결과를도출
2. 관련기술 2.1. 안드로이드센서 2.1.1 SENSOR_ORIENTATION ( 방향센서 ) 각배열의값은각도를나타냄 단말기화면이하늘을향한상태로테이블위에수평으로놓여있는상태를기준으로 각축을중심으로회전위치감지 - values[0] : Z 축을중심으로회전 (0 azimuth < 360) 0 = 북, 90 = 동, 180 = 남, 270 = 서 - values[1] : X축을중심으로회전 (-180 pitch 180) Z축이 Y축방향으로향하면 0보다큰값테이블위에수평으로하늘을향하면 0, 아래를향하면 -180 or 180 똑바로세우면 -90, 거꾸로세우면 +90 - values[2] : Y축을중심으로회전 (-90 roll 90) Z축이 X축방향으로향하면 0보다큰값 2.1.2 SENSOR_ACCELEROMETER ( 가속도센서 ) 각배열의값은 (m/s 2 ) 단위로되어있으며, 접촉힘 (Contact Force) 을측정 - values[0] : X축에적용되는힘 - values[1] : Y축에적용되는힘 - values[2] : Z축에적용되는힘 단말의왼쪽측면을오른쪽방향으로눌렀을때 X축가속도값은음수단말에테이블위에평평하게놓여있을때 -STANDARD_GRAVITY 값, 즉 -9.8 (m/s 2 ) 단말이테이블에서중력에대한반작용으로적용되는힘을나타남
2.2 가속도를이용한거리측정알고리즘 2.2.1 가속도 - 거리관계 가속도를적분하면속도, 속도를적분하면거리 따라서가속도를이중적분하면거리 f(x) 를 a 부터 b 까지적분은 n 개로쪼갠후 n 개사각형넓이의합 2.2.2 Trapezoidal Method 적분할때이론상무한히쪼개면완벽한값이나오지만, 현실에선 sampling의한계로양자화과정중 Area error가발생 따라서오차가적은 Trapezoidal Method를사용 높이를 Sample1, Sample2 라할때 Area = Area1 + Area2 = 대표적수치적분법
2.2.3 Calibration 센서의기울기와그에따른중력에의해영향을받으므로교정이필요 정지한상태에서의가속도값을알아내어중력가속도값으로인지하고제거 2.2.4 Filtering Sampling 후에크게움직이면생기게되는갑자기생기는물리적인오류로인한이상한 sample들을제거하기위하여 10개샘플링할때마다상위 2개하위 2개정도는재하고, 중간 6개정도의값을평균을내서하나의값으로사용 2.2.5 Mechanical Filtering Window 움직임이없을때 sample들의합이이상적으론 0이어야하지만, 0이아닌작은 noise 값이발생하여이것을제거하기위해 valid data와 invalid data 사이를구분짓는 window가필요 2.2.6 Positioning acceleration data값을이전의 Trapezoidal Method으로이중적분 first integration - velocityx[1] = velocityx[0]+ accelerationx[0] + ((accelerationx[1] - accelerationx[0]) / 2) second integration - positionx[1] = positionx[0] + velocityx[0] + ((velocityx[1] - velocityx[0]) / 2)
2.2.7 Movement End Check 물체가멈추면 acceleration의총적분값이 0의속도로되어야하지만현실에서적분의결과값은결코속도 0에도달하지않음 그러므로위치값이조금씩움직이는오류가발생할수있음 때문에가속도값이 0에오래지속될경우속도를강제로 0으로다운시킴 3. 기대효과및활용 3.1 기대효과 기존의중계기 (AP) 를이용한위치인식에더하여정확한위치인식을위해상호보완 중계기 (AP) 가없는실내지역에서의위치인식가능 지하철역이나복잡한건물안에서의위치인식이가능해져지도서비스제공가능 3.2 발전방향 연산알고리즘을개선하여정확도를향상 시뮬레이션을통해적절한 Sampling 수를파악 3.3 활용가능성 GPS를통해얻은위치정보를기준으로주변특정지도를네트워크로전송받아특정지역이아닌다양한지역정보서비스제공가능 스마트폰이아닌센서들을카트에부착하거나소비자에게부착하여마트와같은상점에서의이동패턴을분석하는수단으로활용가능
4. 진행상황 4.1 가속도센서연산 (x 축 ) 적분연산 (Trapezoidal Method [2.2.2]) base : 이전속도 / 위치, diff0 : 이전가속도 / 속도 diff1 : 현재가속도 / 속도, time : 기간 (ms) float CalcIntegration(float base, float diff0, float diff1, float time) outputx.settext("x:" + Float.toString(diff1)); float result=0; result = base + ( diff0 + ((diff1 - diff0)/2) ) * (time / 1000); return result; @Override public void onsensorchanged(sensoreventevent) synchronized (this) switch (event.sensor.gettype()) case Sensor.TYPE_ACCELEROMETER: 주기적 Calibration [2.2.3] if(acccalibrationindex == 240) acccalibrationvalue = sumacc/240; sumacc=0; accelerationx[0] = 0; velocityx[0] = 0; positionx[0] = 0; acccalibrationindex++; if (curtime == 0) curtime = System.currentTimeMillis(); else lastime = curtime; curtime = System.currentTimeMillis(); deltat = curtime - lastime; float time = (float)deltat/1000; accelerationx[1] = (float) (event.values[0]-acccalibrationvalue); FilteringWindow(); sumacc += accelerationx[1]; Positioning [2.2.6] velocityx[1]= CalcIntegration(velocityx[0], accelerationx[0],accelerationx[1],time); positionx[1]= CalcIntegration(positionx[0], velocityx[0],velocityx[1],time); accelerationx[0] = accelerationx[1]; velocityx[0] = velocityx[1]; positionx[0] = positionx[1]; this.movement_end_check(); Mechanical Filtering Window [2.2.5] public final static float window = 0.06f; void FilteringWindow() //Discrimination window applied to if( ((accelerationx[1]<=window)&&(accelerationx[1]>=-window))) accelerationx[1]=0; Movement End Check [2.2.7] void movement_end_check() if (accelerationx[1]<movementendcheckvariable && accelerationx[1]>-movementendcheckvariable) countx++; else countx =0; if (countx>=5) velocityx[1]=0; velocityx[0]=0;
4.2 PC 서버 목적 : 좌표이동의표시 안드로이드폰과 TCP 메시지통신을통해위치를나타냄 SET X Y : 초기위치설정 MOVE X Y : 좌표의이동 public class Server int port = 2011; ServerSocket ss = null; static boolean serveron = false; UIFrame frm; public void initserver() frm = new UIFrame(); try ss=new ServerSocket(port); serveron=true; frm.logappend("server Start"); catch (IOException e) e.printstacktrace(); public static void main(string args[]) Server sv = new Server(); sv.initserver(); if(serveron==true) sv.runserver(); public void runserver() BufferedReader sbr=null; PrintWriter spw=null; Socket ssoc = null; while(serveron) try ssoc=ss.accept(); //wait connect frm.logappend(" 서버 : "+ssoc.getinetaddress() +" 클라이언트와 "+ssoc.getlocalport()+" 포트로연결이되었습니다."); //input, output sbr=new BufferedReader( new InputStreamReader(ssoc.getInputStream())); spw=new PrintWriter(ssoc.getOutputStream(),true); while(true) String reading=sbr.readline(); // 메세지를읽어들임 HandleMessage(reading); //Handle // 입력값이없으면연결을끊음 if (reading==null) break; spw.close(); // 출력스트림닫기 sbr.close(); // 입력스트림닫기 ssoc.close(); // 소켓닫기 catch (IOException e) e.printstacktrace(); frm.logappend(" 서버 : "+ssoc.getinetaddress() +" 클라이언트와의연결이끊어졌습니다."); public void HandleMessage(String str) if(str==null) return; String[] strings = str.split(" "); if(strings[0].equals("set")) frm.logappend(str); frm.setposition(strings[1], strings[2]); else if(strings[0].equals("move")) frm.logappend(str); frm.moveposition(strings[1], strings[2]);
4.3 문제점및진행방향 문제점 1 - Calibration - 스마트폰은하나의가속도센서를이용하여기울기, 중력산출 - 따라서가속이동과기울변화시의변화값이동일함 - 그로인해중력을제거하는 Calibration[2.2.3] 과정의어려움이증대 - 실제이동가속도 (0~2) 에비해중력에의한가속도 (0~9) 의영향이큼 문제점 2 - 오차발생 - 문제점 1의발생을배제하기위한정확한수평이동이어려움 - Mechanical Filtering Window 단계의노이즈제거가실제측정에도영향을끼침 - 오차의발생은여러단계의복합적인결과이기때문에테스트가어려움 개발진행방향 - 문제점 1을해결하기위한알고리즘또는방법을구상 - 가속도적분연산식의개선을고려 : 현재 2개의변화값을이용한 Trapezoidal Method가아닌 3개의변화값을이용한심프슨법칙을사용고려 - 문제점 1을해결을통해 Calibration 단계 - 반복적인테스트를통해 Mechanical Filtering Window의적절한값을정함 - 단순히좌표이동만표시할뿐만아니라가속도, 속도등의정보를표현 - 유효한이동거리, 이동패턴의단순화등구현한계에따른제약사항도고려
5. 개발계획 5.1 개발및테스트환경 개발언어 : JAVA, 안드로이드 SDK 2.3.4 개발 Tool : Eclipse 테스트기기 : GALAXY SⅡ 5.2 개발일정 6월 7월 8월 9월 10월 11월 주제설정기획서작성관련자료수집기능분석시스템설계중간보고서작성센서측정구현데이터연산구현 UI 구현성능향상디버깅및테스트최종보고서작성 5.3 역할분담팀원 역 할 김성은 기능분석, UI 설계및구현 김성규 자료수집, 센처측정모듈구현 김성훈 기능분석, 센서측정모듈구현 6. 참조 - Implementing Positioning Algorithms Using Accelerometers (by Kurt Seifert and Oscar Camacho) http://www.newtc.co.kr/board/view.php?id=qna&page=19&sn1=&divpage=3&sn=off&ss=on &sc=on&select_arrange=hit&desc=desc&no=9557 - 수치적분법 http://blog.naver.com/pcw0615/10106460261 - Design of angular estimator of inertial sensor using the least square method http://blog.naver.com/pcw0615/10100392768