Quadrotor20152015. 4. 18. 16:41

초음파 센서를 이용해서 고도 PID제어기를 구현해서 실험한 영상입니다. 덤으로 자세제어기도 작동되고있습니다~


제원은.. 아두이노 Mega2560, 초음파센서 SRF08를 이용했네요.




왼손으로 잡고있긴 한데.. 저건 아두이노랑 PC랑 연결선을 잡고있는거지 기체를 잡고있는게 아니예요 ㅋㅋ






Posted by 너를위한노래
Quadrotor20152015. 4. 18. 16:34

이번 포스팅에서는 저번 포스팅(mpu6050 가속도, 자이로 센서를 융합하기[상보필터] - 2)의 개선된 사항을 포스팅합니다. 


먼저 가속도 센서를 오일러각으로 바꿀 때 저번 포스팅처럼 x/z나 y/z 하는건 단순히 각 축의 기울어짐 각도를 구하는 거였습니다.


이것을 자세 표현 방법의 한가지인 오일러각으로 변환하는 방법을 다룰 건데요


밑의 출처를 참고하여 이렇게 변환할 수 있습니다.





물론 Ax, Ay, Az는 약분될거기 때문에 스케일링을 하지 않으셔도 무방하지만, 변수의 자료형 범위를 넘지 않도록 신경써줍시다.


그리고 atan함수를 사용한다면 출력의 단위가 라디안이기 때문에 180.0 / 3.141592인 57.3을 곱해서 각도로 바꿔줍시다.


여기서 φ가 Roll, θ가 Pitch라고 정하겠습니다. 


아, 기체좌표계는 다음 그림과 같이 쿼드콥터 전방을 x축 양의 방향이라고 하고, 우측을 y축 양의방향, 지면쪽을 z축 양의방향으로 정합니다.

x축을 중심으로 한 회전이 Roll회전이고, y축을 중심으로한 회전이 Pitch회전이고, z축을 중심으로 한 회전이 yaw회전입니다. 

회전의 방향은 각 축의 양의 방향에 오른손법칙을 적용한 방향을 +로 정합니다. 글마다 계속 언급하겠지만, 이 설정을 되도록 유지할 생각입니다.




여기까지가 가속도 센서값을 오일러각으로 바꾸는 내용이고, 다음은 자이로 센서를 다뤄봅시다.


자이로 센서는 각 축의 각속도를 출력해주기 때문에 단위변환 후시간 변화량에 대해 적분해주면 각 축의 각도를 구할 수 있습니다.


하지만 자이로센서를 조금 다뤄본다면 각 축의 출력이 완전히 독립적이지 않다는걸 알게되는데요, 


예를들어 센서를 지면에 평행하게 두고 yaw회전 각도만 구한다면 실제 90도 회전에 대해 정확히 90도의 각도를 구할 수 있을겁니다. 하지만 지면에 평행하게 두지 않고 센서의 Roll각을 20도 정도 들고 90도 회전을 시행할 경우 yaw회전만 측정해서는 관성좌표계에 대한 yaw회전 각을 구할 수 없습니다.


이런 이유로 오일러각 변환이 필요하게 되었는데요


이것도 다음 식을 이용해서 변환할 수 있습니다. (AR.drone 관련 논문 참고)




Ω는 각 축의 각속도인 p, q, r이고 Q는 현재 오일러각인 φ, θ, ψ를 의미합니다. 


(여기서 현재 오일러각은 세가지를 쓸 수 있습니다. 가속도 센서로 만들어낸 오일러각을 쓸 수도, 자이로 센서로 만들어진 가장 최근 오일러각을 쓸 수도 있지만 실제 자세각을 반영하기 위해 상보 필터를 거친 오일러각을 사용하는게 바람직하겠습니다.)


이 두 정보를 가지고 오일러각의 변화량을 구할 수 있습니다. 그 후 이 변화량을 시간에 따라 적분하면 됩니다.


이 결과는 다음 그림을 보면 알 수 있습니다.




Roll축의 각도만 표시했습니다. 빨간색이 가속도센서의 오일러각, 초록색이 자이로센서의 오일러각 입니다.


이 두개를 합치는 상보필터에 대한 이야기는 다음 포스팅에서 하기로 하겠습니다~!


지난 포스팅에서 다뤘지만... 잘못된 정보가 있어서 바로잡는 포스팅을 하려고 합니다.









참고 사이트

http://www.nano-i.com/salse/1272665

http://blog.daum.net/pg365 - open robotics


논문

The Navigation and Control technology inside the AR.Drone micro UAV



Posted by 너를위한노래
Quadrotor20152015. 3. 8. 15:16

자이로 센서의 각속도를 적분해서 각도로 만드는 방법은 당연히 기초물리학에서 배우듯이 단위 시간 변화량에 현재 각속도를 곱해서 더하면 됩니다.


하지만 실세계에서 자이로센서의 각속도는 아날로그이고, 그걸 양자화해서 사용하므로 실세계에 비해 오차가 있기 마련입니다. 아무리 시간을 정확하게 구했다 하더라도요.




위 그림은 고등학교에서 배우는 정적분에 나오는 그림입니다. 저 단위 시간을 무한대로 쪼개면 빨간색 영역인 오차는 없어진다는 건데 실제 프로그래밍에서는 그게 사실상 불가능합니다. 연산속도가 무한히 빨라야한다는거니까요 ㅋㅋ


이런 경우, 저 빨간 영역을 보상하기위한 방법이 몇개 있다고 합니다.



바로 이렇게 사다리꼴의 면적을 이용해서 적분시키는 방법입니다. 직관적으로 봐도 오차가 줄여질 거 같습니다.


그 밖에는 심슨법이라고하는 법이 있는데 2개의 데이터를 가지고 2차 함수를 구한 다음에 그 함수를 적분하는 방법인 것 같습니다(1/3 Rule). 연산량이 조금 늘겠네요.


제 쿼드 자이로센서 적분법은 사각형 적분을 적용하고있는데 사다리꼴 적분을 적용한 결과를 다음에 포스팅하도록 하겠습니다~


참고한 사이트 : http://www.hanbit.co.kr/network/view.html?bi_id=614





-------------------------------------------------------------------- 2015. 04. 04 결과 추가


글을 새로 적으려다가 결과가 변변치 않아서 이렇게 주석 형식으로 남깁니다. ㅜㅜ

위의 참고사이트에 보면 사다리꼴 적분은 실제로 적용해보면 오차가 많이 줄지 않는다고 나와있습니다. 근데 이걸 못보고 실험부터 해봤는데.. 역시 별로 개선된 게 없는거 같네요.

이유는 위의 그림을 보고 설명하겠습니다. 사각형 적분은 기울기가 +인 구간에서는 오차가 -로 쌓이고 기울기가 -인 구간에서는 오차가 +로 쌓이니까 서로 상충돼서 오차가 어느정도 줄어드는데, 
사다리꼴 적분법은 기울기가 +이든 -이든 항상 -로 조금씩 쌓이므로 좋지 않다는게 그 이유입니다.

머리가 좋아야 몸이 고생안한다고 하던데 ㅠㅜ 괜한 실험을 했네요





Posted by 너를위한노래