자이로 센서 각도 계산 | 스마트폰 자이로스코프 센서, 각속도-각도 수치적분 상위 269개 베스트 답변

당신은 주제를 찾고 있습니까 “자이로 센서 각도 계산 – 스마트폰 자이로스코프 센서, 각속도-각도 수치적분“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Su-Jin Kim 이(가) 작성한 기사에는 조회수 522회 및 좋아요 7개 개의 좋아요가 있습니다.

방향각을 계산하기 위해서는 센서의 위치를 처음부터 알고 있는 방향 (가속도계로부터 가능) 으로 초기화해야 하고, 그 다음에는 어느 시간 동안(Δt) X, Y, 그리고 Z 축 주위를 회전하는 각속도(ω) 를 측정해야 합니다. 그러면, ω × Δt = 각도 변화량을 산출해냅니다.

Table of Contents

자이로 센서 각도 계산 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 스마트폰 자이로스코프 센서, 각속도-각도 수치적분 – 자이로 센서 각도 계산 주제에 대한 세부정보를 참조하세요

자이로스코프 센서
각속도 측정
수치적분 엑셀
각도 그래프

자이로 센서 각도 계산 주제에 대한 자세한 내용은 여기를 참조하세요.

MPU6050센서를 통한 각도계산 – 블로그 – 네이버

MPU6050칩에 내장된 가속도센서, 자이로센서 그리고 이 둘을 합쳐놓은 상보필터를 통해 각도를 계산할 수 있는데요, 이 각도를 구함으로써 드론이 평형을 …

+ 여기에 표시

Source: blog.naver.com

Date Published: 8/27/2021

View: 1804

MPU-6050를 이용한 3축 회전각도 계산 – Space Whale

MPU 6050은 3축 가속도 센서+자이로 센서. MPU-6050 모듈은 가속도/자이로를 측정할 수 있는 센서 가속도는 지구 중력을 기준으로 x, y, …

+ 자세한 내용은 여기를 클릭하십시오

Source: blue-sea-whale.tistory.com

Date Published: 5/11/2022

View: 5608

[MPU6050] 2. 각도값 계산 및 진동 제거하기 – Dongglee

해당 센서에 대한 모든 정보를 데이터시트를 통해 계산하면된다. 먼저 가져온 중력가속도의 값을 계산하여 각도를 측정해보자. X축과 Y축의 각도 …

+ 자세한 내용은 여기를 클릭하십시오

Source: chigun.tistory.com

Date Published: 7/30/2022

View: 2020

가속도센서의 원리 각도 검출방법(중력가속도센서, 자이로센서)

그래서 정확한 출력을 계산해야 할 경우 온도센서도 함께 사용해서 오차를 보상해야한다. 그래서 각도측정 센서를 찾아보면 보통 가속도센서, 자이로센서, …

+ 여기에 자세히 보기

Source: wadadada.tistory.com

Date Published: 6/17/2022

View: 1912

[드론] 가속도 센서를 이용한 각도 구하기_소스코드

일반적으로 기본 루틴 구현하기에서 구한 AcX, AcY, AcZ도 동일한 가속도 센서 값 입니다. 그러나 여기 소스코드에 보시면 아시겠지만 별도로 계산을 해서 …

+ 여기에 더 보기

Source: sensibilityit.tistory.com

Date Published: 10/28/2022

View: 1844

Mr.H – 로봇의 기울여진 각도 확인

바로 로봇이 스스로 기울여진 각도를 계산하는 것이다. 이때 일반적으로 사용하는 센서가 있다. 바로 GYRO Sensor 와 ACCEL sensor이다. GYRO Sensor는 각속도를 측정 …

+ 여기를 클릭

Source: sites.google.com

Date Published: 12/10/2021

View: 9118

티스토리 – 라즈이노 iOT

기울기는, 자이로 스코프(Gyroscope)로 측정이 가능하며, 가속도 센서로도 … 가속도 센서에 비해 비교적 안정적인 값이 출력되지만 각도를 계산하는 …

+ 여기를 클릭

Source: rasino.tistory.com

Date Published: 3/3/2022

View: 2881

자이로 센서 보정 드리프트 각도 계산 유모차 – jeungheuihun46

자이로 센서 보정 드리프트 각도 계산 유모차. q빼고함 2019. 6. 11. 03:39. – 자이로 센서 보정. 본 발명은 자이로 센서의 보정 방법 및 장치에 관한 것으로서, …

+ 여기를 클릭

Source: dlalsgod2.tistory.com

Date Published: 9/19/2022

View: 7820

주제와 관련된 이미지 자이로 센서 각도 계산

주제와 관련된 더 많은 사진을 참조하십시오 스마트폰 자이로스코프 센서, 각속도-각도 수치적분. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

스마트폰  자이로스코프 센서, 각속도-각도 수치적분
스마트폰 자이로스코프 센서, 각속도-각도 수치적분

주제에 대한 기사 평가 자이로 센서 각도 계산

  • Author: Su-Jin Kim
  • Views: 조회수 522회
  • Likes: 좋아요 7개
  • Date Published: 2022. 5. 5.
  • Video Url link: https://www.youtube.com/watch?v=KiOzQMS-9YA

◈ MPU-6050를 이용한 3축 회전각도 계산

▲ MPU 6050은 3축 가속도 센서+자이로 센서

MPU-6050 모듈은 가속도/자이로를 측정할 수 있는 센서 가속도는 지구 중력을 기준으로 x, y, z 축의 가속도 크기를 구할 수 있다는 원리 입니다.

자이로(각속도)는 시간당 x, y, z 축의 회전속도 즉 각속도를 구할 수 있습니다.

구분 가속도 자이로 비고 Register Name ACCEL_XOUT

ACCEL_YOUT

ACCEL_ZOUT

GYRO_XOUT

GYRO_YOUT

GYRO_ZOUT

16Bit

(High 8bit, Low 8bit) Minimum -32768 -32768 Maximum +32768 +32768 Consept

▲ 가속도 출력 값을 이용한 X, Y 축 기준 회전 각도

중력 가속도를 기반으로 X, Y, Z축에 대한 직선 가속도를 측정한다. 중력은 지구 방향으로 mg로 일정하지만 센서의 기울어짐에 따라서 센서의 X, Y, Z축으로 분해되는 크기가 달라지게 되는데, 이 분해되는 값들을 백터 분해수식을 이용하여 각도를 계산할수있다. 외력에 의해 측정값이 왜곡될 수 있지만 시간이 흘러도 오차가 커지지 않는다.

회전 각 수 식 Y축 기준 회전 각도 X축 기준 회전 각도

▲ 자이로 출력 값을 이용한 Z 기준 회전 각도 계산

X, Y, Z축의 각속도 변화량을 측정한다. 순간 각속도이므로 각도를 알기 위해서는 이 값을 측정시간 단위로 적분해야 한다. 그런데 적분을 하게되면 오차가 누적되어, 가속도 센서보다는 실제 센서의 움직임과 같은 값을 보이지만 시간이 흐를수록 오차가 커지게 된다. 드론 제어 시 센서의 오차로 시스템이 불안정해 지는 것으로 보인다.

회전 각 수 식 X축 기준 회전 각도

Y축 기준 회전 각도

Z축 기준 회전 각도 ω X, Y and Z 축을 중심으로 하는 각속도 측정 간격 센서에서 자이로 값을 읽어오는 시간 간격 각도변화량

▲ 상보필터

위의 두 센서의 값의 오차와 오류를 보정하기위한 필터가 사용된다 칼만필터가 사용이 된다, 그러나 칼만필터는 연산시 시간이 오래 걸려 저가의 MCU에 적용하면 시간지연으로 제어속도를 낼수 없다. 이를 좀 가볍게 만든 필터가 상보필터 이다. 적용 수식은 다음과 같다.

상보필터 측정 값 공식 필터에의해 계산된 현재 각도 이전 필터 각도

ω 각속도 (현재)

입력 주기 (측정주기)

시간상수

[MPU6050] 2. 각도값 계산 및 진동 제거하기

지난 게시글에서 데이터시터의 기본 정보를 확인하여 센서로부터 값을 읽어오는 것을 해보았다.

이번에는 읽은 값을 계산하여 각도를 계산해보자

MPU6050은 칩에 점의 방향으로 X, Y, Z축을 찾을 수 있다.

위 데이터 역시 데이터시트에서 가져온 자료이다.

해당 센서에 대한 모든 정보를 데이터시트를 통해 계산하면된다.

먼저 가져온 중력가속도의 값을 계산하여 각도를 측정해보자

X축과 Y축의 각도를 각각 계산하기위해서는 바닥을 가르키는 중력의 값을 알아야한다.

따라서 X축의 기울기를 구하기위해 Y, Z 중력가속도 벡터를 합한다. 이후 중력가속도와 X축을 atan 함수를 통해 계산하면 각도값을 얻을 수 있다. 하지만 atan, atan2 함수는 RAD 단위를 출력하기 떄문에 RAD_TO_DEG 를 곱하여 DEG 단위로 변환한다.

Y축 역시 X, Z의 벡터를 합하여 같은 과정으로 계산하면 된다.

위 코드의 결과를 [ 시리얼 플로터 ]를 통해 관찰하면 다음과 같이 많은 노이즈가 섞이는 것을 볼 수 있다.

이를 제거하기위해서 Low Pass Filter 를 사용하여 진동으로부터 들어오는 노이즈를 줄여보자

매우 효과적으로 진동의 노이즈를 줄인 것을 확인할 수 있다. 하지만 센서를 이리저리 움직여보면 반응속도에 있어 매우 느리다는 것을 느낄 수 있다.

따라서 각가속도의 값을 사용하여 LPF에 합성해보자

갑자기 코드가 복잡해지기 시작했다. 각가속도는 시간당 회전 각도를 얻은 값이기 때문에 센서를 측정하는 주기를 계산하여 곱한다. gyro_raw[i] / 131.0 을 해주었는데, 131은 데이터시트에서 나온 단위값이다.

Z축의 경우 중력가속도를 통해서는 계산할 수가 없기 때문에 각가속도를 통한 계산만 가능하다.

[ 시리얼 플로터 ]를 실행하면 다음과 같이 3축의 값을 얻을 수 있을 것이다.

그런데 Z축의 값이 계속 떨어지거나 상승할 것이다. 그 이유로는 센서마다 고유 노이즈를 가지고 있어 해당 노이즈를 함께 계산하여 위와 같은 문제가 발생하는 것이다. 따라서 센서를 가만히 두었을 때의 값을 보정해주어야한다.

센서를 가만히 두고 gyro_raw의 데이터를 읽어 그 값을 빼주면 된다.

offset의 경우 센서마다 값이 다르기 때문에 시리얼 모니터의 값을 보고 직접 수정하여야한다.

나는 gyro_raw의 값이 너무 잘 튀어서 raw에 LPF를 넣어서 깔끔하게 데이터를 얻었다.

이제 값이 튀지 않고 보정이 되어 정확한 값을 얻을 수 있다.

눈치가 빠른사람은 Z축의 값이 사람의 움직임을 측정하기에는 제한적이라는 것을 느낄 것이다.

1초당 최대 250도의 각도를 측정하도록 설정하였기 때문에 급격한 움직임은 측정할 수가 없다.

따라서 자이로 스코프의 설정은 최대 2000deg/sec 로 설정해보자

데이터 시트를 통해 비트열의 값을 수정하고, 단위 숫자 역시 수정한다.

offset 값 역시 변경된 감도에 맞게 수정하면 된다.

그러면 센서 감도 내에서 급격한 각도 변화가 있더라도 감지할 수 있을 것이다.

그리고, 해당 센서를 모션 감지, 드론 제어 등에 사용하려면 위와 같은 노이즈 제거를 위한 계산은 필수이다.

하지만 진동이 너무 강하면 제거가 되지 않는다.

해당 플로터처럼 모터 진동으로 인해 정확한 값을 추출할 수가 없을 때, MPU6050에 내장된 DLPF를 사용하면 된다.

사용방법은 간단하다. 이 역시 데이터시트를 통해 제어방법을 찾을 수가 있다.

26번 레지스터를 제어하여 DLPF를 사용하면된다.

우리는 모든 축에 한하여 DLPF를 사용해볼 것이다.

비트 연산을 사용하여 자이로, 중력 센서의 모든 축에 DLPF를 적용하였다.

보통 DLPF_CFG의 값은 1 ~ 3이면 충분하다. 높은 설정을 할 수록 미세하지만 반응속도가 느려지기 때문에 주의해야한다.

이렇게 우리는 흔들리지 않는 편안한 센서값을 얻었다. 이 값을 베이스로 드론 제어, 모션 감지 등에 사용하면 되는 것이다. 물론 추가적으로 칼만필터 등의 사용을 통해 정확한 값을 얻을 수도 있다.

sketch_jul29a.ino 0.00MB

가속도센서의 원리 각도 검출방법(중력가속도센서, 자이로센서)

반응형

가속도센서

단위시간당 속도의 변화를 검출하는 소자. 스마트폰의 가속도센서는 피에조 저항방식(Piezoresistive resistance accelerometer)과 정전용량방식(capacitive accelerometer)의 특징을 가지고 있다.

가속도 및 자이로 센서로 유명한 invensense 사의 제품이다

로봇의 자세를 의미하는 롤, 피치, 요(Roll, Pitch, Yaw)로 나타낸다. 요는 z축의 방향 회전을 의미하고, 롤은 좌우로 회전하는 것을 의미한다. 피치는 앞으로 쏠릴 때, 기울어지는 방향을 의미한다.

이러한 자세측정에는 기준이 있다. 즉 중력방향을 기준으로 얼마나 기울어져있는지 나타내는 값이 롤과 피치 이다. 롤과 피치를 측정하기 위해 사용하는 센서가 가속도센서와 자이로 센서이다. MEMS기술을 통해 칩형태의 센서가 스마트폰에도 많이 장착되어 있다.

가속도 센서 원리 및 구조

과거에는 기계식의 센서가 이용되었으나, 현재는 반도체식을 이용한 제품이 주류를 이루고 있다.

가속도센서의 구조와 원리

기계식 원리 (a)

proof mass, 스프링 및 damper로 구성된다. proof mass의 위치 변화로부터 아래식에 따라서 가속도가 구해지는 방법이다. 기계식 가속도 센서는 적은 가속도 범위만을 요구하며, 소형 형상에서는 적절치 못하다.

반도체식 원리(b)

물체에 가해지는 가속도의 크기를 출력하는 것으로 축, 2축, 3축 등 축수에 의해서 타입이 나뉘어지며, 검지될 수 있는 범위가 3축 가속도 센서 에서는 x,y,z축 3축 방향의 3차원 공간에서 가속도를 측정할 수 있다. 즉 중력가속도를 기준으로 기울어진 각도와 각 방향의 가속도로부터 물체의 움직임을 검출할 수 있다. 스마트폰의 경사도를 검출하는 것에는 3축 센서가 이용된다.

가속도 검출 원리

중력 가속도를 기준으로 물체의 기울어진 각도는 **지구 중력은 수직방향으로 중력가속도 1G**이고, **수평으로 있던 가속도 센서가 기울어지면서 중력에 반응하여 90도, 즉 수직을 이루었을 때 1G가 검출된다**. 따라서 중력가속도는 sin(기울어진 각도)의 관계로 아래 그람과 같이 나타 낼 수 있고, 예를 들어 0.5G 의 중력가속도가 측정되면 기울어진 각도는 30도로 환산될 수 있다.

가속도 검출 원리

가속도센서의 검출감도

가속도 센서의 검출감도[V/g]는 가속도당 전압변화에 의한 가속도 검출의 감도를 나타내는 것으로 클수록 우수한 가속도 센서를 의미한다. 이들 가속도 센서는 가속도 검출 방식에 따라서 피에조 저항식, 정전용량식, 열분포 검출식, 자기센서 방식 등으로 분류될 수 있으며, 스마트폰의 경우 낮은 중력 가속도 검지가 필요함으로 피에조 저항식과 정전용량식이 주목 받고 있다.

가속도센서의 종류

(1)피에조 저항식

소자 중앙에 설치된 피에조 저항의 변동을 브릿지 회로로 검출하게 된다. 아래그림과 같이 구성되며 가속도 검출에 필요한 반도체 피에조 저항효과를 이용하고 있다. 피에조 저항효과는 결정에 기계적 외력이 가해지면 결정 격다의 변형을 발생하고, 반도체 중에 캐리어 수와 이동도의 변화를 가져와, 저항 변화를 가져오게 되는 원리를 이용하고 있다.

피에조 저항식

피에조 저항 소자는 브릿지에 가장 높은 응력 집중 위치에 1축당 4개의 소자, 3축으로 모두 12개의 소자로 구성된다. 가속도에 비례한 신호는 각 축과 4소자로 브릿지 회로를 구성하여 응력에 의한 저항변화를 전압 변화로 검출한다.

x, y축의 브릿지 모델과 전압검출 회로

가속도 센서에 가속도가 가해지면 아래그림과 같은 proof mass 변화가 발생된다. 즉 x축 및 y축 방향의 가속도에 대하여 브릿지의 피에조 소자 R1,R3에는 인장응력으로 저항은 증가하고 R2,R4에는 압축응력으로 저항이 감소한다. 서로 상반된 저항 변화가 발생된다. Z축으로 변형의 경우는 추가 상하 방향으로 이동하여 R1,R4와 R2,R3가 상반된 저항변화로 읽게 된다. 피에조 저항방식은 구조가 간단하게 제조될 수 있으나, 온도 의존성이 크기 때문에 온도 보상회로가 필요하다.

전압 검출 식

(2) 정전용량식

proof mass가 전극들 사이 중앙에 위치하고 있고**, 가속도가 없으면 proof mass 는 중앙에 위치하고 있다가 만일 가속도가 가해자면 중앙의 위치에서 반대편의 전극으로 이동하게 되어 정전용량의 차이를 발생**하게 된다. 정전용량식의 민감도는 정전용량의 변화를 가져오게 되는 면적에 의존함으로 부품의 소형화에 장애가 될 수 있다. 온도특성 낮은 노이즈 특성의 장점을 지니고 있다.

proof mass가 가속도가 가해짐에 따라서 전극사이 변화로 정전용량의 변호로부터 가속도를 검지한다. 일반적으로 정전용량 방식으 ㅣ경우 SOI기판을 사용하면 공정수를 피에조 방식보다 줄일 수 있는 이점이 있다. 칩 내부에 가동부분이 있고 전기적 특성의 변화로부터 어떤 방향에서 어떤 가속도가 가해지는가를 검출하게 된다. 가속도 센서 칩이 수평상태의 경우 아래방향으로 1G의 중력이 가해지고있고, 선세가 45도 경사를 갖게되면 0.707G가 된다. 이와 같이 방향에 대하여 미세한 가속도 변화를 검출하게 된다.

가속도 센서로 각도 측정시의 문제점

간단히 가속도 센서를 이용해서 각도를 측정하는 방법은 위와 같은데, 간단한 만큼 문제점이 있다. 정지된 상태에서 물체가 움직이기 시작하면, 그 때 측정되는 값은 기울기를 나타내지 않을 수 있다. 예를들어 45도 기울어진 위와 같은 상태에서 오른쪽으로 가속을 해본다고 하면, x축과 z축에서 측정되는 가속도는 변하게 된다. 한쪽값이 커지게 된다. 그러면 이 상태에서 atan에 대입한다고 하더라도 45도 값은 나오지 않게 된다. 즉 움직임이 생겨서 어느 한쪽 방향으로 가속도가 생기게되면 결과적으로 이 값이 중력에 의해 측정되는 가속도 값과 구분이 안되게 된다.

정지하지 않은 움직임 상태에서는 가속도 센서만으로 기울기 값을 측정할 수가 없다.

자이로 센서

자이로센서는 각속도를 측정한다. 각속도는 시간당 회전하는 각도를 의미하는데 다음의 순서로 측정한다.

수평한 자세를 유지하고 있는 상태를 가정. 이 때, 정지 상태이니 당연히 각속도도 0도/sec로 나타낸다. 이 물체가 10초동안 50도만큼 기울어진다고 하자. 이 10초동안은 0이 아닌 각속도 값을 가지게 된다. 10초동안의 평균 각속도는 5도/sec가 된다. 기울어지는 동작을 한 후 다시 멈춰서 50도를 유지한다고 하자. 이 때는 다시 각속도가 0도/sec가 된다.

1번 2번 3번의 과정을 거치면서, 각속도는 0 → 5 → 0 으로 바뀌었다. 하지만 각도는? 0도에서 점차 증가해서 50도가 되었다. 각속도에서 각도를 구하려면 전체 시간에 해당하는 만큼 적분을 해야한다. 자이로 센서는 이와같이 각속도를 출력으로 내보내기 때문에 전체 시간동안 이 각속도를 적분하면 기울어진 각도를 계산할 수 있다.

그런데 자이로 선세도 문제가 있다. 적분의 문제점이다. 센서에서 측정되는 각속도는 노이즈가 생기든 어떠한 이유에 의해 측정값에 에러가 계속 생기는데, 이 오차가 적분시에는 누적이 되어서 최종값이 드리프트 되는 현상이 생긴다.

자이로 센서에서 측정되는 각속도를 이용하면 시간이 지날수록 각도는 오차가 생겨 기울기 값이 변하게 된다.

정리

앞서 가속도센서와 자이로 센서를 이용해서 물체가 기울어진 각도를 측정하는 방법에 대해서 알아보았다. 하지만 각각 문제점이 존재하는데 다음과 같다.

정지한 물체가 움직이기 시작한 후 다시 정지하는 동작을 한다면…

정지상태의 긴 시간의 관점에서 보면 가속도센서에 의해 계산된 기울어진 각도는 올바른 값을 보여주지만, 자이로 센서에서는 시간이 지날수록 틀린 값을 나타낸다.

움직이는 짧은 시간의 관점에서 보자면…

자이로 센서는 올바른 값을 보여줍니다. 하지만 가속도센서는 기울어진 각도와는 영 다른 계산 값이 나올 것이다.

결론적으로 가속도센서와 자이로센서를 모두 사용해서 각각의 단점을 보상할 수 있는 알고리즘을 적용해서 롤 또는 피치 값을 계산하게 되는 것이다. 많이 적용하는 보상방법 및 필터링으로는 칼만필터를 사용하는 경우가 많이 있다.

*부가적인내용

1) Yaw 값 측정은 회전축 z방향, 즉 중력방향과 같다. 따라서 가속도 보다는 자이로 센서의 z축 값을 측정해서 이 값을 이용해서 yaw값을 계산하고, 드리프트되는 오차를 보상하는 센서를 추가적으로 사용한다. 바로 마그네토미터(지자기센서)이다. 3축 지자기 센서를 적용해서 yaw 방향을 측정하는 것이다.

2) 자이로는 온도가 변하면 그 값이 같이 변하는 특성이 있다. 그래서 정확한 출력을 계산해야 할 경우 온도센서도 함께 사용해서 오차를 보상해야한다. 그래서 각도측정 센서를 찾아보면 보통 가속도센서, 자이로센서, 지자기센서, 온도센서를 내장한 9축 자세 측정 센서라고 한다.

3) 선가속도 측정은 중력가속도에서 x축,y축,z축방향으로의 성분을 말한다. 즉 그림2에서 0.5g 의 중력가속도를 갖는 x축방향으로의 선가속도 Vx는 Vx = 0.5g * cos30 이다.

출처

휴대전화기기의 가속도센서기술.pdf 0.66MB

-가속도센서 및 자이로센서원리 (https://mechaworld.tistory.com/11)

-과학백과사전선가속도(https://www.scienceall.com/선가속도linear-acceleration/)

반응형

[드론] 가속도 센서를 이용한 각도 구하기

가속도 센서를 이용한 각도 구하기

[기본 개념]

MPU-6050 가속도 자이로 센서

[처리루틴]

기본 루틴 구현하기

센서 보정 루틴 구현하기

시간 처리 루틴 구현하기

이번에는 가속도 센서를 처리해서 Roll, Pitch, Yaw의 각도를 구해보는 시간을 가지도록 하겠습니다.

일반적으로 기본 루틴 구현하기에서 구한 AcX, AcY, AcZ도 동일한 가속도 센서 값 입니다. 그러나 여기 소스코드에 보시면 아시겠지만 별도로 계산을 해서 accel_x, accel_y, accel_z의 값들을 구하는걸 볼 수 있을 것입니다.

그 이유는 MPU-6050의 가속도 센서를 이용한 드론을 지면 수평한 상태에 놓으면 미세한 떨림에 의해서 부유한 값을 얻게 됩니다. 그러한 현상들을 해결 하기 위해서 가속도 센서의 현재 위치하고 있는 드론의 상태에 따라 얻어지는 현재값 에다가 ‘센서 보정 루틴’해서 작성을 했던 초기 평균값들을 빼서 가속도 센서 값에 대한 최종적이 보정 값을 구하는 목적 입니다.

소스코드

//가속도 센서 처리 루틴 #include const int MPU_addr = 0x68; int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; void setup() { initMPU6050(); //가속도 자이로 센서 값을 읽음 Serial.begin(115200); calibAccelGyro(); //센서 보정 루틴 initDT();// 시간 간격에 대한 초기화 } void loop() { readAccelGyro(); calcDT(); //시간 간격 계산 calcAccelYPR(); //가속도 센서 처리 루틴 static int cnt; cnt++; if(cnt%2==0) SendDataToProcessing(); //Roll, Pitch, Yaw에 대한 각도 정보를 보냄 } //MPU-6050초기화 루틴 void initMPU6050() { Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); } //가속도 자이로 센서를 읽는 루틴 void readAccelGyro() { Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true); AcX = Wire.read() << 8 | Wire.read(); AcY = Wire.read() << 8 | Wire.read(); AcZ = Wire.read() << 8 | Wire.read(); Tmp = Wire.read() << 8 | Wire.read(); GyX = Wire.read() << 8 | Wire.read(); GyY = Wire.read() << 8 | Wire.read(); GyZ = Wire.read() << 8 | Wire.read(); } float dt; float accel_angel_x, accel_angel_y, accel_angel_z; float gyro_angel_x, gyro_angel_y, gyro_angel_z; float filtered_angel_x, filtered_angel_y, filtered_angel_z; float baseAcX, baseAcY, baseAcZ; float baseGyX, baseGyY, baseGyZ; //센서 들의 기본값들의 평균을 내야하는 루틴(센서 보정 루틴) void calibAccelGyro() { float sumAcX = 0, sumAcY = 0, sumAcZ = 0; float sumGyX = 0, sumGyY = 0, sumGyZ = 0; //가속도 자이로 센서를 읽어드림 readAccelGyro(); //읽어드렸으면 이제 읽어드린 값을 토대로 평균값을 구하면 됨 for(int i=0; i<10; i++) { readAccelGyro(); sumAcX += AcX; sumAcY += AcY; sumAcZ += AcZ; sumGyX += GyX; sumGyY += GyY; sumGyZ += GyZ; delay(100);//0.1초 } //맨 처음 기본 센서 값들을 보여지고 그다음에 평균값을 구하는 함수 baseAcX = sumAcX / 10; baseAcY = sumAcY / 10; baseAcZ = sumAcZ / 10; baseGyX = sumGyX / 10; baseGyY = sumGyY / 10; baseGyZ = sumGyZ / 10; } //프로세싱 스케치로 각도 정보를 보내는 루틴 void SendDataToProcessing() { Serial.print(F("DEL:")); Serial.print(dt,DEC); Serial.print(F("#ACC:")); Serial.print(accel_angel_x, 2); Serial.print(F(",")); Serial.print(accel_angel_y, 2); Serial.print(F(",")); Serial.print(accel_angel_z, 2); Serial.print(F("#GYR:")); Serial.print(gyro_angel_x, 2); Serial.print(F(",")); Serial.print(gyro_angel_y, 2); Serial.print(F(",")); Serial.print(gyro_angel_z, 2); Serial.print(F("#FIL:")); Serial.print(filtered_angel_x, 2); Serial.print(F(",")); Serial.print(filtered_angel_y, 2); Serial.print(F(",")); Serial.print(filtered_angel_z, 2); Serial.println(F("")); delay(5); } unsigned long t_now; unsigned long t_prev; void initDT(){ t_prev = millis(); } void calcDT(){ t_now = millis(); dt = (t_now - t_prev) / 1000.0; t_prev = t_now; } void calcAccelYPR() //가속도 센서 처리 루틴 { float accel_x, accel_y, accel_z; //x, y, z 축에 대한 각도 저장 변수 float accel_xz, accel_yz; const float RADIANS_TO_DEGREES = 180 / 3.14159; accel_x = AcX - baseAcX; accel_y = AcY - baseAcY; accel_z = AcZ + (16384 - baseAcZ); accel_yz = sqrt(pow(accel_y, 2) + pow(accel_z, 2)); accel_angel_y = atan(-accel_x / accel_yz)*RADIANS_TO_DEGREES; accel_xz = sqrt(pow(accel_x, 2) + pow(accel_z, 2)); accel_angel_x = atan(accel_y / accel_xz)*RADIANS_TO_DEGREES; accel_angel_z = 0; } 다운로드 파일(2016.09.10) 코드 설명 loop구문에 calcAccelYPR() 이라는 제가 별도로 만들어준 함수를 선언해주었습니다. loop 구문에다가 선언을 한 이유는, 매번 가속도 센서의 값을 해석해서 Roll, Pitch, Yaw에 대한 각도를 구하는 함수인데 setup()에다가 선언을 해버리면 맨 처음에만 해석을 하고 그 이후로는 안하게 됩니다. 이렇게 되면 드론을 조정하기 거의 불가능 해서 loop구문에다가 설정을 한것입니다. 그리고 아래칸에다가 진짜 가속도 처리 센서 함수를 표현해주었습니다. 해석을 자세하게 해보겠습니다.(너무 자세하게는 말고..ㅎㅎ) 127 : 위에서도 말씀 드렸다싶이 가속도 센서에 대한 최정적인 보정 값을 저장하는 변수를 선언하는 부분입니다. 128 : 드론이 기울어짐에 따라서 얻어지는 각도를 저장하는 변수 입니다. 여기 드론에서는 +Z축이 하늘을 바라보고 있으면 +X축은 비행기 머리부분 +Y축은 날개부분입니다. [조건] 1. 직선축 +X는 비행기의 머리부분 2. 직선축 +Y는 비행기의 날개부분 accel_yz : 직선축 +X 기준으로 좌 우로 기울어 지는 각도를 저장하는 변수 accel_angel_y : Roll의 각도 accel_xz : 직선축 +Y 기준으로 비행기 머리가 위 아래로 기울어 지는 각도를 저장하는 변수 accel_angel_x = Pitch의 각도 129 : 이따 축에 따라 기울어진 각도를 구할때 사용되는 값들을 변수로 선언을 해주었습니다. 131 ~ 132 : 가속도 X축과 Y축에 대한 현재 값(AcX or AcY)에서 가속도 센서의 평균값(baseAcX or baseAcY)을 빼주고 있습니다. 이 경우는 가속도 센서에 대한 최종적인 보정 값을 저장해 줍니다. 133 : 왜 여기만 x,y축과 다르냐고요?? 그 이유는 이상적인 기본 루틴에서 얻은 AcZ(가속도 센서 Z값_의 값이 중력 가속도 g에 해당하는 값인 16384입니다. 그러나 말 그대로 이상적인 값이지 실제로는 +-얼마의 오차값의 범위를 가지고 있스빈다. 따라서 이러한 경우에 대해 보정을 해주고 있는 것입니다. 135~136 : 직선축 +X이 기울어진 각도를 구하고 있습니다. 직선 +X축이 곡선 +Y축에 따라 기울어진 각도를 구하는 공식[angel(Y) : Pitch값] 138 ~ 139 : 직선 +Y축이 기울어진 각도를 구하고 있습니다. 직석 +Y축이 곡선 +X축에 따라 기울어진 각도를 구하는 공식[angel(X) : Roll값] 141 : 현재 드론은 지면이 평평한 면에 둘 경우로 가정하고 하고 있습니다. 그러면 직선 +Z축이 중력 가속도와 정 반대방향이므로 중력 가속도는 양수의 값을 얻게 되지만 +Z축을 중심으로 한 회전각을 구할 수 없게 됩니다. 그래서 변수를 0으로 저장한 것 입니다.

라즈이노 iOT :: 【 아두이노모듈#30】 #1.기울기 센서(6축 가속도&자이로)에 대해 알아봅시다.(GY-521/MPU6050 센서 실습 #1)

반응형

【 아두이노 모듈 #30 】 #1. 기울기 센서 ( 6축 가속도 & 자이로 ) 에 대해 알아봅시다.

【 기울기 센서 개요 】

자이로 센서(Gyro Sensor)의 원리는 자이로스코프가 내장된 물체가 회전 운동을 하면 생기는 회전 반발력을 측정하여 전기신호로 바꾸어 출력하고 이를 수치화하여 활용하게 됩니다. 그래서 기울기 센서는 가속도 센서와 자이로 센서의 기능을 통합하여 자세나 위치를 추정할 수 있는 장치를 말하며, 이를 활용한 항공기 및 배(Ship) 등에 사용되는 관성항법장치(INS)는 이동거리와 방향까지 추정할 수 있도록 되어 있습니다.

▶ 주요 활용분야 :

센서 주요활용분야: 드론/AR스마트안경/VR고글/나인봇/핏빗, 미밴드/스마트워치/전자수평계 등

– 드론 : 비행 중인 드론은 현재의 기울기나 위치 파악은 물론이며, 특정 위치에서의 고정 비행을 할 경우 바람 등으로 인하여 원래의 위치와 자세를 유지하는 기능이 필요한데, 가속도 센서와 자이로 센서가 각각 중력가속도와 각속도를 측정하여 얼마나 기울어졌는지를 파악하여 보정할 수 있도록 해줍니다.

– VR/AR : 대표적 VR제품인 오큘러스 고글이나 구글 스마트 안경과 같은 AR 제품의 경우 사용자의 머리(얼굴 방향) 움직임이 있을 경우 자이로 센서를 이용하여 회전을 인식하거나 물체와의 위치를 파악하게 해주는 등의 중요한 역할을 합니다.

– 세그웨이나 나인봇 : 사람의 몸이 기울이는 정도와 방향에 따라 세그웨이/나인봇을 제어할 수 있도록 하는 곳에 자이로(가속도) 센서가 사용됩니다.

– 운동 관련 웨어러블 기기인 핏빗이나 샤오미 밴드 , 스마트 워치 등에서 사람의 움직임 등을 파악하기 위해 사용됩니다.

이처럼, 기울기 센서(가속도/자이로 센서)는 다양한 곳에 활용되는데요, 대표적으로 많이 사용되는 GY-521(MPU6050) 모듈을 아두이노를 통하여 학습해 본다면, 이후 아두이노와 함께 다양한 응용 작품을 만드는데 좋은 기회가 될 것으로 생각됩니다 ^^.

라즈이노 IoT에서는 앞으로 몇 회차에 걸쳐 기울기 센서 모듈을 이용해서 흥미로운 학습과제를 진행할 예정입니다.

본 페이지에서는 GY-521 모듈의 스펙과 기본 사용법에 관련된 학습이 진행됩니다.

《 GY-521 모듈(MPU-6050 6축-자이로 가속도 센서) 》

GY-521 기울기 센서 앞·뒷면 모습

IMU-6040 기울기 센서 모듈의 동작원리에 대한, 간략한 설명을 드리면,

센서 이름에 있는 IMU의 뜻은 Inertial Measurement Unit의 약어로, 관성 측정 장치라는 뜻이 있으며,

IMU-6040 모듈에는 X, Y, Z의 3축 가속도 센서와, 3축 자이로 센서, 온도 센서로 구성되어 있습니다. 온도 센서는 가속도 자이로 값이 급격한 온도 변화에 영향을 받을 경우 적용하기 위해 있는 센서로 일반적인 환경하에서는 적용하지 않고 사용하게 됩니다.

기울기는, 자이로 스코프(Gyroscope)로 측정이 가능하며, 가속도 센서로도 측정 가능합니다. 두 가지가 함께 있는 이유는 서로의 단점이 존재하는데, 이를 보완하기 위함이라고 보시면 됩니다. “자이로 스코프”에는 MEMS Gyroscope 라는 칩, 시스템 혹은 센서라고 하는 것이 들어 있습니다.

MEMS 뜻은 “Micro Electro Mechanical System”의 약어로, MEMS 센서는 칩이 회전 또는 기울어질 때 전압을 출력 시킵니다. 기울어지는 정도에 따라 비례해서 전압값이 다르게 출력됩니다.

이 전압은 칩 내부에서 16bit ADC 컨버터(아날로그 전압을 디지털 숫자 값으로 변환하는)에 의해 16비트(0 ~ 2의 16승 값 범위)값으로 변환 되고, 이 값을 가지고 아두이노 라이브러리와 프로그래밍 코드에서 처리하여 각도 값으로 변환해서 보여주게 됩니다.

그리고 MPU-6050에는 Accelerometer(가속도 계)라는 측정 센서가 있습니다. 역시, X, Y, Z 3개의 축으로 구성 되어 있으며, 조금 설명하기 쉽게, 어떤 박스 안에 무게가 있는 둥근 공이 있을 때, -X ↔ 공 ↔ +X 예를 들어, X축을 기준으로 -X축 방향으로 박스를 빠르게 밀었을 때, 공은 제자리에 머물러 있게 되는데, 이는 관성에 의해 +X축 방향으로 이동한 것으로 볼 수 있습니다. 센서에서는 이런 움직임에 대해 각 축 별로 전압으로 측정해 내게 되고, 자이로 센서의 경우처럼, 이를 수치 값으로 변환하여 코드에서 기울기 값 등으로 처리 할 수 있게 됩니다.

MPU-6050은 위 이미지에서 가운데 정사각형의 IC칩 명칭이며, 이 칩을 이용해서 만든 모듈 이름이 GY-521입니다. 따라서 같은 MPU-6050 칩을 사용한 다른 모델 제품도 있을 수 있으며, 경우에 따라 핀 배열이 다를 수 있습니다.

하지만 GY-521 모듈이 대표적으로 많이 사용되고 있습니다.

MPU-6050은 6축의 자유도(DOF : Degree of Freedom)를 가지며, 3축(x, y, z) 가속도계와 3축(x,y,z) 자이로를 합하여 6 축이라고 하며, 또는 3축 가속도+자이로 2축+온도 1축을 합하여 6축이라고도 합니다. (온도 센서가 포함된 이유는 가속도와 자이로 값이 온도에도 영향을 받기 때문에 온도센서를 활용하면 온도 변화에도 대응하는 값을 얻을 수 있기 때문입니다) 여기에, 지자기(지구자기) 센서의 3축을 추가한 모델이 MPU-9060 , 9축 센서입니다. 9축 센서를 이용하면 3차원의 위치(지구 상 공간)와 3차원의 방향을 모두 파악할 수 있게 됩니다.

– 가속도 센서 는 시간에 대한 속도 변화의 비율을 말하는 데요, 중력가속도를 이용하여 가속도를 측정하게 됩니다.

중력 가속도가 3개의 축 각각에 얼마만큼의 영향을 주었는지를 측정하여 센서의 기울어진 정도를 파악할 수 있게 됩니다. 다만, 가속도 센서의 경우 움직이는 동적인 물체에서는 가속도와 중력이 섞여서 검출되기 때문에 정확한 데이터를 얻기가 힘듭니다, 따라서 정적인 상태에서만 정확한 기울기를 측정할 수 있는 한계가 있습니다.

– 자이로 센서 는 물체의 회전 속도인 ‘각속도’를 이용하는 센서이기 때문에 각속도 센서라고도 합니다. 역시 3축의 물리량을 측정하여 센서의 움직임을 감지하고 기울기를 측정할 수 있는데요, 동적인 상황에서 가속도 센서에 비해 비교적 안정적인 값이 출력되지만 각도를 계산하는 과정에서 적분 방식을 사용하기 때문에 시간이 지날수록 누적되는 오차가 발생합니다.

※ 따라서, 가속도 센서와 자이로 센서의 장점을 적절하게 적용하여 코드를 구성한다면 보다 정밀한 결과를 얻을 수 있습니다. 그러므로 센서를 적용하려는 형태와 방법에 따라 코드가 심플해지기도 하며, 외부 라이브러리 사용과 함께 아주 복잡해지기도 합니다.

바로 위 ‘6050칩 이미지’를 보면, 직선방향의 화살표가 향하는 방향이 x, y, z 축의 가속도 센서가 적용되는 방향입니다.

( 센서를 통해 얻을 수 있는 RAW 데이터 파일 값 중에서 화살표 방향이 +값으로 표시된다면, 화살표 반대방향으로 움직일 시, -(마이너스) 값으로 표시됩니다. 좀 더 정확히 얘기하자면, 중력의 방향을 기준으로 잡고, 중력의 방향은 – , 중력의 반대 방향이 +입니다. )

그리고 회전하는 모양의 화살표가 x, y, z 축의 자이로 센서가 적용되는 방향입니다.

(마찬가지로, 화살표 방향으로의 회전 일 때 +값이 얻어진다면, 반대 방향으로의 회전 시, -(마이너스) 값이 얻어집니다. 회전 방향에 대한 + 방향은 위 이미지를 참고하세요)

그리고, 이 회전 방향은 특히 드론과 같은 비행체나 배와 같은 곳에 필수적으로 적용이 되는데요, 이 센서가 있어야, 기울기/자세를 유지하거나 보정할 수 있기 때문입니다.

X축 회전 각도를 Roll (롤) , Y축 회전 각도를 Pitch(피치) , Z 축 회전 각도는 Yaw(야우)라고 불립니다.

★ 기억하기 쉽도록 : 사람 머리를 기준으로

– Roll 은 → 고개를 좌우로 갸우뚱갸우뚱

– Pitch는 → 고개를 앞뒤로 끄덕끄덕

– Yaw는 → 고개를 도리 도리

그럼, MPU6050 칩의 상세 스펙과 MPU6050을 내장한 GY-521 모듈에 대해 본격적으로 살펴볼게요.

【 기울기 센서 MPU6050 스팩 】

전원 사용은 일반적으로 5V를 입력하지만, 3V~5V 사이의 전원은 모두 동작하므로, 3.3V 전원을 사용하는 다른 모듈들과 함께 3.3V 전원 연결도 자주 이용됩니다.

보시는 바와 같이 MPU6050은 I2C 인터페이스를 이용한 통신으로 측정값을 얻어낼 수 있습니다. 일반적으로 모듈로부터 데이터를 얻기 위해 SCL과 SDA 핀을 이용(모듈이 슬레이브로 동작) 합니다. 좀더 구체적으로 설명하자면, I2C는 필립스에서 개발한 직렬 컴퓨터 버스이며, 임베디드시스템 혹은 저속의 주변기기와의 통신을 위해 사용된 직렬 통신 방식입니다. 기본적으로 하나의 마스터와 하나 혹은 여러 대의 슬레이브 연결 구조이며 SDA핀으로 데이터를 주고받고,핀의 클럭신호(동기화)에 맞추어 통신하게 됩니다. 아두이노에서는 라이브러리를 활용하면 손쉽게 I2C 통신을 할 수 있습니다.

XDA와 XCL은 추가적인 외부의 지자기 센서나 또 다른 센서 연결을 확장하는 시리얼 통신 단자입니다. External , XDA, XCL 연결 단자 입니다.

그리고, 하나의 회로에서 만약 동일한 GY521 모듈을 두 개 구성하여 사용할 경우, I2C 통신 주소를 다르게 하기 위해 AD0 핀에 풀업 저항을 달면 주소를 달리 할 수 있습니다. 모듈의 기본 Slave address 주소는 1101000 이며(0x68), +Vcc쪽으로 풀업 저항(1㏀~10㏀) 연결 시 1101001로(0x69) 변경됩니다.

【 기울기 센서 실습 #1 】

: 기울기 센서 기본 실습으로 센서로부터 기본적인 RAW 데이터 값을 얻어내 보도록 하겠습니다.

활용도와 정확도를 높이기 위해서는 라이브러리를 사용해야 하지만, 복잡하고 코드 내용 파악이 어려울 수 있기 때문에, 기초 실습 #1에서는 라이브러리 없이 진행됩니다.

– MPU6050센서는 16bit ADC가 내장되어 있습니다. 센서의 각축으로부터 가속도와 자이로에 대한 아날로그 데이터를 16bit 분해능을 가진 ADC(Analog Digital Converter)를 거치면서 디지털 수치값으로 얻을 수 있다는 말인데요, 16bit는 2^16 이니 65536의 값인데, -(마이너스)부분까지 반으로 나누어 표시하면 기본적으로는 ” -32768 ~ +32767 ” 사이값의 출력 범위를 가진다는 말이 됩니다.

실습 #1에서는 우선 원시 RAW 데이터를 각센서 축별로 출력해보고,

실습 #2는 가속도 센서를 통해 얻은 RAW 데이터로부터 X축과 Y축의 각도를 계산해 내는 실습으로 진행하고,

실습 #3에서는 자이로 센서를 통해 얻은 RAW 데이터로부터 X축과 Y축의 각도를 얻는 과정으로 진행합니다.

실습 #4 상보필터 적용 실습

각 실습별 방법에 대한 장단점 및 기본적인 설명이 안내해 드리며, 상호 보완필터(상보필터)를 적용한 실습 #4로 이어지니 차근차근 하나씩 실습해 보시기 바랍니다. 가급적 실습 #4까지는 외부라이브러리를 배제한 코드를 사용하여 코드 단순화를 통해 동작원리를 이해하는데 도움이 되도록 하였습니다.

아래 회로 연결도를 구성해 주고 PC와 연결합니다.

▶ 회로 연결도 (아두이노 나노와 GY521(MPU6050) 연결도)

아두이노 나노와 GY521(MPU6050) 연결도

▶ 아두이노 코드

(가속도 x, y, z 축 값과 자이로 x, y, z 축 값의 raw data를 시리얼 모니터로 출력해 보기)

/* 기울기 센서 GY-521(MPU6050) 기초 실습 #1 (RAW 데이터 얻기) */ /* 아래 코드관련 실습에 대한 설명과 회로도 및 자료는 https://rasino.tistory.com/ 에 있습니다 */ #include const int MPU_ADDR = 0x68; // I2C통신을 위한 MPU6050의 주소 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // 가속도(Acceleration) 와 void getRawData(); // 센서값 얻는 서브함수의 프로토타입 선언 void setup() { initSensor(); Serial.begin(9600); delay(200); } void loop() { getRawData(); // 센서값 얻어오는 함수 호출 Serial.print(“AcX:”); Serial.print(AcX); Serial.print(” AcY:”); Serial.print(AcY); Serial.print(” AcZ:”); Serial.print(AcZ); Serial.print(” GyX:”); Serial.print(GyX); Serial.print(” GyY:”); Serial.print(GyY); Serial.print(” GyZ:”); Serial.print(GyZ); Serial.println(); delay(300); } void initSensor() { Wire.begin(); Wire.beginTransmission(MPU_ADDR); // I2C 통신용 어드레스(주소) Wire.write(0x6B); // MPU6050과 통신을 시작하기 위해서는 0x6B번지에 Wire.write(0); // MPU6050을 동작 대기 모드로 변경 Wire.endTransmission(true); } void getRawData() { Wire.beginTransmission(MPU_ADDR); Wire.write(0x3B); // AcX 레지스터 위치(주소)를 지칭합니다 Wire.endTransmission(false); Wire.requestFrom(MPU_ADDR, 14, true); // AcX 주소 이후의 14byte의 데이터를 요청 AcX = Wire.read() << 8 | Wire.read(); //두 개의 나뉘어진 바이트를 하나로 이어 붙여서 각 변수에 저장 AcY = Wire.read() << 8 | Wire.read(); AcZ = Wire.read() << 8 | Wire.read(); Tmp = Wire.read() << 8 | Wire.read(); GyX = Wire.read() << 8 | Wire.read(); GyY = Wire.read() << 8 | Wire.read(); GyZ = Wire.read() << 8 | Wire.read(); } 《 위 코드 다운로드 》 Angle_RawData.zip 0.00MB ▶ 실행 결과 : 코드를 실행해 보면, 가속도 값 3개와 자이로 값3개 총 6개의 값이 일렬로 나타납니다. 센서를 움직여보면 데이터 값이 변하는 것을 볼 수 있습니다. 방향에 따라 + , - 값으로 나타나는데요, 현재 보이는 값은 어떤 각도 값이나 보정된 값이 아닌 말 그대로 순수한 Raw data이기 때문에 방향과 위치에 따른 데이터 변화를 유추하기는 어렵습니다. 때문에, 기본적인 Raw 데이터를 추출하는 원리 정도만 파악하시면 되고, 다음 실험에서 삼각함수를 이용한 각도 값을 계산해 보거나 , 특정 라이브러리를 이용해서 고정시킨 위치 데이터를 확인해 볼 수 있게 됩니다. 또는 프로세싱(Processing)과 같은 그래픽 구현 툴을 이용해서 3D 이미지로 센서의 움직임을 그래픽 화면으로 볼 수 있는 실험도 진행할 예정입니다. 기울기센서(MPU6050)로부터 Raw 데이터 얻기 ▶ 동작 영상 (본 글 제일 아래 전체 동영상을 참고해보세요 : 설명 음성 추가) 【 기울기 센서 실습 #2 】 : 실습 #1에서 Raw 데이터를 얻었다면, 이번엔 이 데이터를 가지고 우리가 흔히 알아보기 쉬운 각도(라디안: radian) 값으로 바꾸어 출력해 보는 실습입니다. 먼저 각도를 얻을 수 있는 방법은, 앞서 설명한 것처럼 크게 세 가지입니다. 1. 가속도 센서를 이용한 방법 2. 자이로 센서를 이용한 방법 3. 이 둘을 합쳐놓은 '상호보완 필터' 코드를 통해 구하는 방법 이번 실습은 움직임이 없는 상태에서 보다 정확한 값을 구할 수 있는 1번 가속도 센서를 이용한 간단한 방법으로 진행합니다. 때문에 라이브러리 설치 없이 간단히 진행할 수 있고 코드도 비교적 단순하여 파악과 응용이 쉽습니다. 각도(라디안)를 라이브러리 설치 없이 진행되어 구하기 위해서는 중력과 X축, Y축, Z 축과의 기울기를 이용한 삼각함수를 적용해야 하는데요, 해당 수식은 아래와 같습니다. Roll/Pitch/Yaw 각도를 구하기 위한 삼각함수 수식 물론 코드에서는 이 수식이 적용되어 있습니다. 회로 연결은 실습 1과 같고 아래에 있는 아두이노 코드를 업로드해 주세요. ▶ 아두이노 코드 ( 코드에서는 가속도 AcX에 대한 'Roll 각도'와 가속도 AcY에 대한 'Pitch 각도'만 구합니다. 앞서 설명드린 것처럼 가속도 센서만 가지고는 Yaw에 해당하는 정확한 AcZ 각도가 구할 수 없습니다. Z축 Yaw가 중력 방향과 평행한 회전을 하기 때문에 삼각함수를 적용해도 올바른 데이터가 출력되지 않습니다.) // Roll과 Pitch 각도 구하기 실습 》 // 가속도 센서만 가지고 롤(Roll)과 피치(Pitch)를 구하는 예제입니다. // 본 코드는 드론과 같은 움직임이 심한 경우가 아닌 비교적 정적인 상태에서 안정된 값을 얻을 수 있으며, // 복잡한 외부라이브러리를 사용하지 않아 코드가 심플해서 파악후 적용하기가 쉽습니다. // 아래 코드관련 실습에 대한 설명과 회로도 및 자료는 https://rasino.tistory.com/ 에 있습니다 #include const int MPU_ADDR = 0x68; // I2C통신을 위한 MPU6050의 주소 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // 가속도(Acceleration)와 자이로(Gyro) double angleAcX; double angleAcY; // double angleAcZ; const double RADIAN_TO_DEGREE = 180 / 3.14159; void setup() { initSensor(); Serial.begin(9600); delay(200); } void loop() { getAngleXY(); Serial.print(“Angle x : “); Serial.print(angleAcX); Serial.print(“\t\t Angle y : “); Serial.println(angleAcY); delay(20); } double getAngleXY() { getData(); // 삼각함수를 이용한 롤(Roll)의 각도 구하기 angleAcX = atan(AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))); angleAcX *= RADIAN_TO_DEGREE; // 삼각함수를 이용한 피치(Pitch)의 각도 구하기 angleAcY = atan(-AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))); angleAcY *= RADIAN_TO_DEGREE; // angleAcZ값(Yaw)은 아래의 삼각함수 공식은 있으나, 가속도 센서만 이용해서는 원하는 데이터를 얻을 수 없어 생략 // angleAcZ = atan(sqrt(pow(AcX, 2) + pow(AcY, 2)) / AcZ ); // angleAcZ *= RADIAN_TO_DEGREE; } void initSensor() { Wire.begin(); Wire.beginTransmission(MPU_ADDR); // I2C 통신용 어드레스(주소) Wire.write(0x6B); // MPU6050과 통신을 시작하기 위해서는 0x6B번지에 Wire.write(0); Wire.endTransmission(true); } void getData() { Wire.beginTransmission(MPU_ADDR); Wire.write(0x3B); // AcX 레지스터 위치(주소)를 지칭합니다 Wire.endTransmission(false); Wire.requestFrom(MPU_ADDR, 14, true); // AcX 주소 이후의 14byte의 데이터를 요청 AcX = Wire.read() << 8 | Wire.read(); //두 개의 나뉘어진 바이트를 하나로 이어 붙여서 각 변수에 저장 AcY = Wire.read() << 8 | Wire.read(); AcZ = Wire.read() << 8 | Wire.read(); Tmp = Wire.read() << 8 | Wire.read(); GyX = Wire.read() << 8 | Wire.read(); GyY = Wire.read() << 8 | Wire.read(); GyZ = Wire.read() << 8 | Wire.read(); } 《 위 코드 다운로드 》 Angle_Roll_Pitch.zip 0.00MB ▶ 실행 결과 : main loop( )에 있는 delay(20)을 느리게 혹은 빠르게 조절하여 확인해 볼 수 있습니다. 센서 보드를 중력의 방향과 수직으로 놓으면 X와 Y는 0도를 가리킵니다. 그 상태에서 Roll(X)을 앞 뒤로 돌려보고, Pitch(Y)를 앞뒤로 돌려 보세요. - Roll은 센서 보드 위 화살표 표시를 참고 기준으로 하여, 중력과 반대로 머리를 들면 +각도로 나오며, 중력의 방향으로 머리를 숙이면 -각도를 표시합니다. - Pitch 또한 피치 화살표를 기준으로, 화살표 방향으로 숙이면 +각도로 표시되며, 반대방향으로 회전시키면 -각도로 표시됩니다. - 아래 이미지는 시리얼 플로터를 실행시킨 화면인데요, 각도 값을 그래프 형태로 보면 좀 더 직관적으로 파악하기 좋습니다. ( 시리얼 플로터 창 열기 : 아두이노 IDE 툴 메뉴 클릭 》 시리얼 플로터 클릭! ) 파란선이 Roll (AcX)에 대한 각도 그래프이며, 빨간선이 Pitch(AcY)에 대한 각도 그래프입니다. 기울기 센서 모듈은 접촉이 불안정할 경우, 데이터가 원하는 대로 나오지 않거나, 오작동 할 수 있습니다. 접촉이 헐렁한 브레드보드를 바꾸어 보거나 연결선을 확인해 보세요. 필요한 경우 납땜으로 연결해 주면 더욱 안정된 접촉이 이루어집니다. 그 외에 동작은 정상 동작하나, 데이터 값이 튀는 노이즈가 심할 경우에는, 추출 값을 3~10회 정도의 평균값 처리하는 루틴을 넣어 주면 어느 정도 해결할 수 있습니다. ▶ 동작 영상 【 기울기 센서 실습 #3 】 : 실습 #2에서 MPU6050에 있는 가속도 센서를 이용해서 각도(라디안: radian) 값으로 바꾸어 출력해 보는 실습을 했다면, 이번엔 MPU6050에 있는 자이로 센서를 이용해서 각도를 계산해 출력해 보겠습니다. 1. 가속도 센서를 이용한 방법 2. 자이로 센서를 이용한 방법 3. 이 둘을 합쳐놓은 '상호보완 필터' 코드를 통해 구하는 방법 이번 실습은 2. 자이로 센서를 이용한 방법 입니다. 먼저 자이로 센서는 진자의 움직임과 같은 축을 중심으로 회전하는 각속도를 측정합니다. 각속도는 시간당 회전하는 각도를 의미하는데요, 예를 들면, 1. 수평한 자세를 유지하고 있는 상태이라면, 각속도는 0도/sec를 나타낼 텐데요, 2. 이 물체가 10초 동안 50도만큼 기울어졌을 경우 , 이 10초동안은 0이 아닌 각속도 값을 가지게 됩니다. 10초 동안의 평균 각속도는 5도/sec 가 되는데요, 즉, 초당 5도를 움직이는 속력이라 말할 수 있습니다. 3. 기울어지는 동작을 한 후 다시 멈춰서 50도를 유지한다고 할 때, 이때는 다시 각속도가 0도/sec 가 됩니다. 1번 2번 3번 과정을 거치면서 각속도는 0 -> 5 -> 0으로 바뀌었는데요, 그런데 각도는 0도에서 점차 증가해서 50도가 된 상태입니다. 그래서 각속도가 움직인 각도에 비례해서 증가하는 것이 아니기 때문에, 각도를 구하려면 전체 시간에 해당하는 만큼의 각속도를 모두 합(적분을) 해야합니다. 자이로 센서는 이와 같이 각속도를 데이터로 출력하기 때문에 이 각속도 데이터를 모두 합(적분)하면 기울어진 각도를 계산해 낼 수 있는 원리입니다. 그런데 자이로 센서의 경우 문제는 이러한 적분 때문에 발생하게 됩니다. 센서에서 측정되는 각속도는 노이즈나 미세한 기본 오차 값들이 적분으로 인해, 시간이 지날 수록 쌓여 결국 측정값(각도 오차)의 오차가 커지게 되는 문제가 있습니다. Drift 현상이 발생합니다.

(즉, 이 방법만으로는 시간이 지날 수록 각도 혹은 기울기의 오차가 커지게 되는 단점이 있죠. 하지만, 가속도 센서처럼 진동에 영향이 크게 없으며 중력과 일치하는 Z축의 Yaw 각도도 구할 수 있는 장점이 있습니다.

[ 용어 정리 ]

– Drift 현상 : 조건이 일정함에도 시간이 경과함에 따라서 값이 이탈 또는 흘러가는 현상.

– 각속도란 : 각속도 오메가(ω)는 원운동에서 단위 시간 동안에 회전한 각도를 말하며, 즉, 회전하는 물체에 대한 회전의 빠르기를 의미합니다.

– 각도 : 각속도에 시간을 곱한 것이 각도 이며, 이것들을 모두 합치면 움직인 전체 각도가 됩니다

속력/속도/가속도 와의 관계식

회로 연결은 실습 1과 같고 아래에 있는 아두이노 코드를 업로드해 주세요.

▶ 아두이노 코드

( 코드에서는 시리얼 모니터 통신속도를 115200bps 으로 바꾸었으니, 실행시 시리얼 모니터 창의 보드레이트를 115200 bps로 맞추어 주세요)

// 《 자이로 Gyro 센서로 Roll과 Pitch, Yaw의 각도 구하기 실습 》 // 자이로 센서만 가지고 롤(Roll)과 피치(Pitch), 야우(Yaw)를 구하는 예제입니다. /* 아래 코드관련 실습에 대한 설명과 회로도 및 자료는 https://rasino.tistory.com/ 에 있습니다 */ #include const int MPU_ADDR = 0x68; // I2C통신을 위한 MPU6050의 주소 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // 가속도(Acceleration)와 자이로(Gyro) double angleAcX, angleAcY, angleAcZ; double angleGyX, angleGyY, angleGyZ; const double RADIAN_TO_DEGREE = 180 / 3.14159; const double DEG_PER_SEC = 32767 / 250; // 1초에 회전하는 각도 // GyX, GyY, GyZ 값의 범위 : -32768 ~ +32767 (16비트 정수범위) unsigned long now = 0; // 현재 시간 저장용 변수 unsigned long past = 0; // 이전 시간 저장용 변수 double dt = 0; // 한 사이클 동안 걸린 시간 변수 double averAcX, averAcY, averAcZ; double averGyX, averGyY, averGyZ; void setup() { initSensor(); Serial.begin(115200); caliSensor(); // 초기 센서 캘리브레이션 함수 호출 past = millis(); // past에 현재 시간 저장 } void loop() { getData(); getDT(); angleGyX += ((GyX – averGyX) / DEG_PER_SEC) * dt; angleGyY += ((GyY – averGyY) / DEG_PER_SEC) * dt; angleGyZ += ((GyZ – averGyZ) / DEG_PER_SEC) * dt; Serial.print(“Angle Gyro X:”); Serial.print(angleGyX); Serial.print(“\t\t Angle Gyro y:”); Serial.print(angleGyY); Serial.print(“\t\t Angle Gyro Z:”); Serial.println(angleGyZ); delay(20); } void initSensor() { Wire.begin(); Wire.beginTransmission(MPU_ADDR); // I2C 통신용 어드레스(주소) Wire.write(0x6B); // MPU6050과 통신을 시작하기 위해서는 0x6B번지에 Wire.write(0); Wire.endTransmission(true); } void getData() { Wire.beginTransmission(MPU_ADDR); Wire.write(0x3B); // AcX 레지스터 위치(주소)를 지칭합니다 Wire.endTransmission(false); Wire.requestFrom(MPU_ADDR, 14, true); // AcX 주소 이후의 14byte의 데이터를 요청 AcX = Wire.read() << 8 | Wire.read(); //두 개의 나뉘어진 바이트를 하나로 이어 붙여서 각 변수에 저장 AcY = Wire.read() << 8 | Wire.read(); AcZ = Wire.read() << 8 | Wire.read(); Tmp = Wire.read() << 8 | Wire.read(); GyX = Wire.read() << 8 | Wire.read(); GyY = Wire.read() << 8 | Wire.read(); GyZ = Wire.read() << 8 | Wire.read(); } // loop 한 사이클동안 걸리는 시간을 알기위한 함수 void getDT() { now = millis(); dt = (now - past) / 1000.0; past = now; } // 센서의 초기값을 10회 정도 평균값으로 구하여 저장하는 함수 void caliSensor() { double sumAcX = 0 , sumAcY = 0, sumAcZ = 0; double sumGyX = 0 , sumGyY = 0, sumGyZ = 0; getData(); for (int i=0;i<10;i++) { getData(); sumAcX+=AcX; sumAcY+=AcY; sumAcZ+=AcZ; sumGyX+=GyX; sumGyY+=GyY; sumGyZ+=GyZ; delay(50); } averAcX=sumAcX/10; averAcY=sumAcY/10; averAcZ=sumAcY/10; averGyX=sumGyX/10; averGyY=sumGyY/10; averGyZ=sumGyZ/10; } 《 위 코드 다운로드 》 Angle_Gyro.zip 0.00MB ▶ 실행 결과 : 센서 보드를 X축 Y축 Z축 각각 움직여 보세요. ▶ 실행 영상 (제일 아래 전체 설명 동영상 참고) 【 기울기 센서 실습 #4 】 : 실습 #2와 실습#3에서는 각각 가속도 센서와 자이로 센서를 이용한 각도를 구했는데요, 가속도센서는 진동에 약하기 때문에(튀는 데이터값의 영향이 큼) 짧은 시간의 변화에는 약하지만, 긴 시간에 대해서는 정확한 각도를 산출해 낼 수 있고, 자이로센서는 진동에 강하기 때문에 짧은 시간에 대해서는 정확한 각도를 얻을 수 있지만 시간이 지나면서 오차가 누적되어 긴 시간에서는 취약합니다. 그래서 각각의 장점도 있지만, 단점이 명확하여 어느 하나의 센서 만으로는 드론과 같은 자세제어나 보정은 어렵습니다. 따라서 센서 둘을 모두 이용하고, 이 둘의 장점을 이용하여 서로의 단점을 보완한 상호보완 필터 코드를 적용하여 사용한다면, 비교적 오류가 없는 각도를 구할 수 있어서 드론 등의 자세제어 코드에 사용할 수 있습니다. 1. 가속도 센서를 이용한 방법 2. 자이로 센서를 이용한 방법 3. 이 둘을 합쳐놓은 '상호보완 필터' 코드를 통해 구하는 방법 이번 실습은 3. 상호보완 필터를 이용한 방법 입니다. 아래 이미지는 상호보완 필터의 개념도 입니다. 상보필터(상호보완) 개념도 [ 상보필터의 원리 - Complementary Filter ] - 가속도 센서(Accelerometer)는 센서 특성상 고주파 영역에서 노이즈가 많이 발생하게 되어 정확한 값을 얻기 어려운데요, 그래서 노이즈 영역을 제거하고자 고역은 감쇠시키고, 낮은 주파수 영역을 통과시키는 저역필터(Low Pass Filter)를 적용해주면 정확도가 올라갑니다. - 자이로 센서(Gyroscope)는 센서 특성상 저주파 영역에서 값이 변하는 Drift현상이 발생하여 정확한 값을 기대하기가 어렵습니다. 그래서 저역을 감쇠시키고 노이즈가 적은 고역을 통과시키기 위한 고역필터(High Pass Filter)를 적용해주면 역시 정확도가 올라갑니다. ※ 이렇게 각각의 필터를 통과해서 노이즈가 걸러진 값들을 합하여 보다더 정확한 각도값을 얻게 됩니다. 이외에 칼만필터(Kalman Filter), Quanternion 라는 것도 있습니다. 상보필터에서는 가속도 센서의 저주파 영역에서의 장점과 , 자이로센서의 고주파 영역에서의 장점만을 융합한 필터로서 , 방법과 코드가 간단하여 적용하기 쉬운 장점이 있습니다. 상보필터에서는 ALPHA라는 가중치 값을 통해 자이로센서와 가속도센서 각각으로부터 얻은 각도를 어떤 비중으로 적용시킬지 정하여 계산하게 되는데요. 아래가 바로 보정값(가중치) ALPHA를 적용한 보정된 각도 값의 식(angleFiX) 입니다. angleFiX = ALPHA * angleTmpX + (1.0 - ALPHA) * angleAcX; 여기서 angleTmp 는 자이로센서 값을 기준으로 만든 상보필터 처리를 위한 임시각도이며 X축에 대해 정리하면 angleTmpX = angleFiX + angleGyX * dt 가 됩니다. 가중치 ALPHA 값은 α = T/(T+Δt) 식으로 구하는데요, α (ALPHA) = 1 / (1+0.04) 가되어, α 값은 0.96 이 됩니다. 즉, 1(T) 사이클 도는 동안의 loop Time(Δt=0.04) 을 적용한 식입니다. 그런데 이 값은 고정값은 아니며, loop Time이 길어지거나 등의 이유로 알파값을 시스템에 맞게 변경할 수 있습니다. 즉, angleFiX 식을 보면 아시겠지만, 자이로 값에 * 0.96 가중치를 곱하고(주고), 가속도 값에 * 0.04의 가중치를 줘서 합한 값이어서 자이로센서(자이로스코프)에 더 의존하는 형태라고 말 할 수 있습니다. 그런데, 이런 형태가 비교적 정밀한(안정적인) 출력값을 내는 이유는, 식을 다시 살펴보면 angleFiX = ALPHA * angleTmpX + (1.0 - ALPHA) * angleAcX; 각도 변화가 상당히 느린 구간(저주파 영역)에서는 자이로센서의 데이터 값이 작아지기 때문에(angleGyX * dt의 누적값 감소), (1.0-ALPHA) = 0.04 가중치 적용으로 작았던 가속도 데이터 값이 상대적으로 커지게 되어 , 자이로스코프의 저주파 영역에서 발생하는 Drift(드리프트)에 대한 단점을 보완 할 수 있게 됩니다. ▶ 아두이노 코드 ( 위에서 설명한 식을 코드에 적용한 아두이노 코드입니다. 실습 #1과 실습#2에 소개한 코드를 합쳐서, 상보필터 식을 적용한 코드입니다. 축 3가지를 동시에 시리얼모니터로 확인하기 불편하기 때문에, 일부 축에 주석처리 되어 있으니, 필요한 경우 주석을 해제하여 사용하세요. ) - 시리얼모티너(플로터) 출력은 아래처럼 각 축별로 비교하기 쉽도록 배치하였습니다. 《가속도센서 X축》 출력과 《필터링된 X축》 출력 《가속도센서 Y축》 출력과 《필터링된 Y축》 출력 《자이로센서 Z축》 출력과 《필터링된 Z축》 출력 // 《 상보필터를 적용한 Roll과 Pitch, Yaw의 각도 구하기 실습 》 /* 아래 코드관련 실습에 대한 설명과 회로도 및 자료는 https://rasino.tistory.com/ 에 있습니다 */ #include const int MPU_ADDR = 0x68; // I2C통신을 위한 MPU6050의 주소 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // 가속도(Acceleration)와 자이로(Gyro) double angleAcX, angleAcY, angleAcZ; double angleGyX, angleGyY, angleGyZ; double angleFiX, angleFiY, angleFiZ; const double RADIAN_TO_DEGREE = 180 / 3.14159; const double DEG_PER_SEC = 32767 / 250; // 1초에 회전하는 각도 const double ALPHA = 1 / (1 + 0.04); // GyX, GyY, GyZ 값의 범위 : -32768 ~ +32767 (16비트 정수범위) unsigned long now = 0; // 현재 시간 저장용 변수 unsigned long past = 0; // 이전 시간 저장용 변수 double dt = 0; // 한 사이클 동안 걸린 시간 변수 double averAcX, averAcY, averAcZ; double averGyX, averGyY, averGyZ; void setup() { initSensor(); Serial.begin(115200); caliSensor(); // 초기 센서 캘리브레이션 함수 호출 past = millis(); // past에 현재 시간 저장 } void loop() { getData(); getDT(); angleAcX = atan(AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))); angleAcX *= RADIAN_TO_DEGREE; angleAcY = atan(-AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))); angleAcY *= RADIAN_TO_DEGREE; // 가속도 센서로는 Z축 회전각 계산 불가함. // 가속도 현재 값에서 초기평균값을 빼서 센서값에 대한 보정 angleGyX += ((GyX – averGyX) / DEG_PER_SEC) * dt; //각속도로 변환 angleGyY += ((GyY – averGyY) / DEG_PER_SEC) * dt; angleGyZ += ((GyZ – averGyZ) / DEG_PER_SEC) * dt; // 상보필터 처리를 위한 임시각도 저장 double angleTmpX = angleFiX + angleGyX * dt; double angleTmpY = angleFiY + angleGyY * dt; double angleTmpZ = angleFiZ + angleGyZ * dt; // (상보필터 값 처리) 임시 각도에 0.96가속도 센서로 얻어진 각도 0.04의 비중을 두어 현재 각도를 구함. angleFiX = ALPHA * angleTmpX + (1.0 – ALPHA) * angleAcX; angleFiY = ALPHA * angleTmpY + (1.0 – ALPHA) * angleAcY; angleFiZ = angleGyZ; // Z축은 자이로 센서만을 이용하열 구함. Serial.print(“AngleAcX:”); Serial.print(angleAcX); Serial.print(“\t FilteredX:”); Serial.print(angleFiX); Serial.print(“\t AngleAcY:”); Serial.print(angleAcY); Serial.print(“\t FilteredY:”); Serial.println(angleFiY); Serial.print(“\t AngleAcZ:”); Serial.print(angleGyZ); Serial.print(“\t FilteredZ:”); Serial.println(angleFiZ); // Serial.print(“Angle Gyro X:”); // Serial.print(angleGyX); // Serial.print(“\t\t Angle Gyro y:”); // Serial.print(angleGyY); // Serial.print(“\t\t Angle Gyro Z:”); // Serial.println(angleGyZ); // delay(20); } void initSensor() { Wire.begin(); Wire.beginTransmission(MPU_ADDR); // I2C 통신용 어드레스(주소) Wire.write(0x6B); // MPU6050과 통신을 시작하기 위해서는 0x6B번지에 Wire.write(0); Wire.endTransmission(true); } void getData() { Wire.beginTransmission(MPU_ADDR); Wire.write(0x3B); // AcX 레지스터 위치(주소)를 지칭합니다 Wire.endTransmission(false); Wire.requestFrom(MPU_ADDR, 14, true); // AcX 주소 이후의 14byte의 데이터를 요청 AcX = Wire.read() << 8 | Wire.read(); //두 개의 나뉘어진 바이트를 하나로 이어 붙여서 각 변수에 저장 AcY = Wire.read() << 8 | Wire.read(); AcZ = Wire.read() << 8 | Wire.read(); Tmp = Wire.read() << 8 | Wire.read(); GyX = Wire.read() << 8 | Wire.read(); GyY = Wire.read() << 8 | Wire.read(); GyZ = Wire.read() << 8 | Wire.read(); } // loop 한 사이클동안 걸리는 시간을 알기위한 함수 void getDT() { now = millis(); dt = (now - past) / 1000.0; past = now; } // 센서의 초기값을 10회 정도 평균값으로 구하여 저장하는 함수 void caliSensor() { double sumAcX = 0 , sumAcY = 0, sumAcZ = 0; double sumGyX = 0 , sumGyY = 0, sumGyZ = 0; getData(); for (int i=0;i<10;i++) { getData(); sumAcX+=AcX; sumAcY+=AcY; sumAcZ+=AcZ; sumGyX+=GyX; sumGyY+=GyY; sumGyZ+=GyZ; delay(50); } averAcX=sumAcX/10; averAcY=sumAcY/10; averAcZ=sumAcY/10; averGyX=sumGyX/10; averGyY=sumGyY/10; averGyZ=sumGyZ/10; } 《 위 코드 다운로드 》 Angle_Acc_Gyro_CompFilter.zip 0.00MB ※ 아래 실행결과 화면을 보시면 알겠지만, 상보필터를 적용 후의 그래프는 노이즈나 한 번씩 크게 튀는 값 들이 상당히 제거되어 나타나는 것을 알 수 있습니다. 단, 노이즈 향상을 위해 ALPHA값 등, 보정값을 과도하게 조정하게 되면, 보정된 데이터의 출력 딜레이(시간차)가 발생하게 됩니다. 이는 드론(Drone)과 같은 제어에 있어서는 적시에 올바른 제어를 할 수 없게 만들 수도 있습니다. ▶ 실행 결과 1. 《가속도센서 X축》 출력과《필터링된 X축》 출력 비교 화면 먼저, 시리얼모니터 화면을 살펴 보세요.(아래 이미지) , 보드를 77도 정도에서 고정한 상태에서 가속도센서에서 얻은 데이터는 각도 값이 68~70도 사이를 짧은 순간에 제법 심하게 요동치고 있는 반면에, 필터링한 각도 값은, 77도에서 소수점 단위 정도만 변동이 있을 뿐 매우 안정된 출력을 보여주고 있는 것을 알 수 있습니다. 그럼, 이제 시리얼 모니터만으로는 잘 체감이 안 되실텐데요, 같은 출력을 아두이노 IDE 메뉴에 있는 '시리얼 플로터'를 통해 그래프로 보면 좀더 확연히 그 차이를 구분하실 수 있게 됩니다. (아래) 파란색 그래프가 가속도센서로 부터 얻은 X축 회전(각도)상태의 데이터인데요, 떨림과 같은 병동이 심한 반면에, 필터링 코드를 거친 빨간색 X축의 데이터는 이런 노이즈들이 깔끔하게 제거 된 것을 알 수 있습니다. 2. 《가속도센서 Y축》 출력과《필터링된 Y축》 출력 비교 화면 그럼, Y축 그래프도 살펴 볼게요. 역시 마찬가지로, 필터링 되지 않은 Y축 출력과 필터링된 Y축 출력에 차이가 있음을 볼수 있습니다. 3. 《자이로센서 Z축》 출력과《필터링된 Z축》 출력 비교 화면 그리고, Z축 같은 경우는 앞서 설명드린대로, 가속도 센서로부터는 데이터를 얻을 수 없는 상태이고, 따라서 자이로 센서로 부터 얻은 Z축 데이터와, 자이로센서 데이터 가중치가 높은 필터링된 Z축 데이터를 출력해 본 것이어서 두 그래프간의 차이가 거의 없는 그래프 모습을 보여주고 있습니다. 3. 끝으로 전체 축을 동시에 비교해봤습니다. 《자이로센서 X-Y-Z-축》 출력과

자이로 센서 보정 드리프트 각도 계산 유모차

– 자이로 센서 보정

본 발명은 자이로 센서의 보정 방법 및 장치에 관한 것으로서, 본 발명의 일 실시예에 따른 자이로 센서의 보정 방법은, a 자이로 센서가 장착된 이동체가 회전하는 KR101231209B1 자이로 센서의 보정 방법 및 장치

왜 센서 보정을 해야하는가? 기본적으로 센서들여기서는 가속도 센서, 자이로 센서은 지면가 수평인 상태여도 무시할 수 있는 정도의 미세하게 드론상보필터를 적용한 센서 보정 루틴 구현하기 자이로센서

필요하다. 정적인 각도는 가속도계G 센서로 측정하고, 동적인 각도는 Gyro로서 측정되는 단점을 가지고 있기 때문에 이것을 보정하고 나서 본래 물체의 각도를 안드로이드 자이로스코프 이야기. 가속도센서 vs 자이로센서 비교

– 자이로 센서 드리프트

서에 대한 연구가 많이 이루어지고 있는 실정이. 다 하지만 자이로 센서가 가지는. 현상에 의 . drift. 해서 발생하는 오차를 피할 수 없는 문제를 안고. 있다 이에 다수의 필터를 이용한 자이로센서의 누적오차 보정 알고리즘 FIR

자이로센서를 사용해서 처음 각도를 출력해보면 이해가 안가는 부분이 있습니다. 기체는 가만히 있는데 출력값은 처음 0도에서 시작해서 무한대로 자이로센서 드리프트 줄이기 HDRHeuristic

것은 리어가 배로 설정했습니다 최종적으로는 구사님으로 자이로 센서 바르고 드리프트입니다 자이로 센서 최근 드론과 헬기 조종기에 잘 붙어 있지요 차체 및 기체를 자이로센서 장난감 편 라지 제작

자이로센서를 사용해서 처음 각도를 출력해보면 이해가 안가는 부분이 있습니다. 기체는 가만히 있는데 출력값은 처음 0도에서 시작해서 무한대로 점점 발산해 간다는 자이로센서 드리프트 줄이기 HDRHeuristic Drift Reduction

– 자이로 센서 각도 계산

바로 로봇이 스스로 기울여진 각도를 계산하는 것이다. 이때 일반적으로 CM730에는 자이로센서와 가속도센서가 같이 있어 동시에 확인하는 것이다. 그 외 kubot의 Mr.H 로봇의 기울여진 각도 확인

2009. 6. 10. 답글 20개한 일년도 훨씬 전쯤에 가속도센서를 이용한 각도 측정에 대한 글을 올렸었 적어도 위 상황이라면 그것은 y성분/z성분을 계산할때, 각 종 펙터 가속도센서를 이용한 각도 측정과 그 한계

예제 소스는 자이로 가속도 값이 나오는데요. 이 때, 가속도 센서로부터 각 축에 대한 m/s2값을 먼저 얻으셔야해요. mpu6050의 경우 16384의 현재 각도 계산법에 대해mpu6050 + can통신

유투브에서 더 큰 화면으로 영상을 볼수 있습니다 영상 후반부에서 자이로 센서로 계산한 Yaw 각도에 무작위적인 오차가 누적되는 것을 보실수 있습니다. 그리고 영상 지자기 센서와 Yaw각도에 대한 이야기 MPU9250을 이용한 yaw 각도

사항입니다. 이 글에서 두 센서의 측정치를 각각 각도으로 변환하는데, 오일러각이기억합니다. 0도에서는 탄젠트로 어떻게 계산하는지 이해가 안가서 덮어뒀던 기억 mpu6050 가속도, 자이로 센서를 융합하기상보필터 2

– 자이로 센서 유모차

스트롤에버Strollever는 마치 소형 로켓을 떠올리게 하는 이동수단 같지만 사실은 유모차다. 미래지향적 디자인을 갖춘 이 유모차는 바퀴에 센서를 자이로스코프를미래에서 온 유모차

초음파 센서를 이용한 자동 브레이크 스마트 유모차. 104 The moving direction of the mobile robot is measured by a gyro sensor on the robot. Untitled

6조 스마트유모차 Go Buggy . 의 데이터를 유모차. 의 Bluetooth모듈로. 전송. 센서. 초음파센서와 자이. 로센서 서, 자이로 센서 값을 샘플링. 캡스톤 디자인 발표회

스마트 유모차 엄마랑 같이 뛰어갈수도있다. 371만원 +유투브 스나이퍼TV smartbe2006 3버전 2013 우리가 배워야 될거 자이로센서 회전을 감지 LED메뉴 1최근 2017.04.29레고마인드스톰 연수

키워드에 대한 정보 자이로 센서 각도 계산

다음은 Bing에서 자이로 센서 각도 계산 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 스마트폰 자이로스코프 센서, 각속도-각도 수치적분

  • 자이로스코프
  • 자이로 센서
  • 스마트폰 센서
  • 각속도 측정
  • 각도 측정
  • 수치적분
  • 엑셀

스마트폰 # #자이로스코프 #센서, #각속도-각도 #수치적분


YouTube에서 자이로 센서 각도 계산 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 스마트폰 자이로스코프 센서, 각속도-각도 수치적분 | 자이로 센서 각도 계산, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  간호학 과 지원 동기 예시 | 간호학과 간호사 지원동기 작성 Tip✏ | 나의 지원동기 공개 답을 믿으세요

Leave a Comment