Quadrotor20132013. 12. 13. 19:15

쿼드의 핵심인 센서와 보드에 대해 다뤄보겠습니다.

 

일반적으로 RC하시는분들은 제어보드를 FC보드(Flight Control Board)라고 하더라구요. 갑자기 생각난건데 처음 쿼드만드시는 분들은 용어가 생소해서 고생하실 겁니다.. 프롭이니 리포배터리니 통돌이모터 프롭밸런서 등등 이런 단어를 알아야 검색도 하고 공부도 하는데 모르면 난감해요 ㅠ


제어보드의 종류는 많습니다. 아두이노 같이 빵판처럼 온갖 프로그램을 올릴 수 있는 보드에도 제어 소스만 올리면 제어가 가능하니까요. 쿼드콥터 제조 회사나 커뮤니티에서 만들어 지는 것 같습니다. AeroQuad, MultiWii 등 오픈되어있는 소스도 있구요, 이 오픈소스들을 그대로 보드에 올려서 사용하려면 해당 소스에 맞는 하드웨어에 올려야합니다. (센서나 하드웨어사양이 충족되어야 한단 소리입니다)


제어보드의 사양은.. 당연한 소리겠지만 빠르면 빠를수록 좋습니다. 제어 알고리즘을 돌리는데 1초가 걸린다면 전혀 쓸모없는게 되어버리니까요. 

뜨기 위한 보드의 제어 주기는 최소 5ms는 되어야 뜰까말까입니다. 10ms로 하면 시소제어는 되는데 전혀 뜨질 않고, 5ms로 하면 불안정하게 뜨고, 3ms로 하니까 나름 안정적으로 뜨는것 같습니다. 제가 직접 겪은 이야기입니다 ㅠ 이 글을 읽는 여러분은 이런 고생 겪지 않길 바랍니다.


이 제어 주기라는 것은 센서와 깊은 연관이 있습니다. 보드가 아무리 빨라봤자 센서의 최대 샘플링 간격이 1초라면 보드 제어주기는 1초로 맞춰질수밖에 없기 때문입니다. 센서 구매시 잘 선택하시길 바랍니다. 제 경우는 최대 10ms의 속도를 가지는 50만원짜리 센서를 가지고 제어를 해 왔는데.. 지금 보면 되지도 않는 하드웨어 사양을 가지고 엄청 고생한거네요. 50만원짜리 고급 센서보다 9천원짜리 MPU6050이 더 빠른데 말이죠. 



위 표는 MPU6050의 사양입니다. 밑의 Update rate를 보시면 자이로는 최대 0.125ms, 가속도는 최대 1ms 이네요. 왜 범위로 되어있냐면~ MPU6050센서 내부의 레지스터를 조작해서 LPF를 쓸 수 있게 되어있는데, 그 LPF설정에 따라 유동적이기 때문이라는 생각이 드네요.

아무튼, 센서마다 이런 사양이 있으니까 꼭 참고해서 결정하시기 바랍니다.


MicrocontrollerATmega2560
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limits)6-20V
Digital I/O Pins54 (of which 15 provide PWM output)
Analog Input Pins16
DC Current per I/O Pin40 mA
DC Current for 3.3V Pin50 mA
Flash Memory256 KB of which 8 KB used by bootloader   
SRAM8 KB
EEPROM4 KB
Clock Speed16 MHz

위 표는 제어보드인 아두이노 Mega2560의 사양입니다. 메인 클럭 주파수가 16MHz인데, 이걸 가지고 제어 루프의 주기를 계산하기에는 좀 막연하네요. 빠르면 빠를수록 좋긴 한데 쓸데없이 빠른건 굳이 필요 없을테니까 잘 고르시기 바랍니다. 


아두이노의 16MHz는 실시간 영상처리하기에는 턱없이 부족한 주파수인데요, 700MHz이상가는 라즈베리파이를 사용하면 굳이 저처럼 휴대폰을 달지 않고도 영상처리를 할 수 있을거 같다는 생각을 요새 하고 있는 중입니다. 근데 라즈베리파이는 불안정하다는 이야기가 들리기도 하네요.


센서와 보드의 통신 환경도 결정할때 고려해야할 요소 중에 하나인데요, 센서 표를 보시면 인터페이스가 I2C방식이라도 되어있습니다. 저는 운좋게 아두이노 보드에서 I2C전용 핀과 통신용 라이브러리를 제공해서 쉽게 통신할 수 있었는데요. 만약 다른방식이고 보드가 그 방식을 지원하지 않는다면 아날로그 신호를 분석해서 통신을 구현해야할 수도 있습니다. 저는 그렇게까지 하고싶진 않았는데 다행히 보드가 지원해줬네요.. 참고로 아두이노는 I2C통신과 시리얼통신을 지원합니다.


I2C방식(TWI통신이라고도 함)에 대한 자세한 내용은 제 블로그(http://hs36.tistory.com/29)를 참고하시구요 


mpu6050와 통신하는 라이브러리와 예제도 첨부하겠습니다.

MPU6050.zip

 

그밖에 각종 I2C를 사용하는 장치들과 아두이노간 통신 라이브러리는

https://github.com/jrowberg/i2cdevlib/tree/master/Arduino

참고하시면 되겠습니다~ 














Posted by 너를위한노래
Quadrotor20132013. 12. 13. 19:06

I2C의 개요

I2C (Inter-Integrated Circuit) 버스는 마이크로프로세서와 저속 주변 장치 사이의 통신을 위한 용도로 Philips에서 개발한 규격인데 두 가닥의 선을 사용하므로 TWI (Two Wire Interface)라고도 불리고 있다특허권 때문인지 잘 모르겠으나 Philips 이외의 회사들은 거의 대부분TWI라고 부른다. I2버스는 양방향 오픈 드레인 선인 SCL (serial clock) SDA (serial data)로 이루어져 있으며 매스터-슬레이브 형태로 동작한다. SCL은 통신의 동기를 위한 클럭용 선이고 SDA는 데이터용 선이다매스터는 SCL로 동기를 위한 클럭을 출력하며 슬레이브는 SCL로 출력되는 클럭에 맞추어 SDA를 통해 데이터를 출력하거나 입력 받는다단지 SDA 한 선으로만 데이터를 주고 받기 때문에 I2버스는 반이중 (half duplex) 통신만 가능하다. SCL 선과 SDA 선은 모두 오픈 드레인므로 두 선에는 각각 풀업 저항을 연결해 주어야 한다.

다음 그림은 I2매스터와 슬레이브들 사이의 연결을 보여주고 있다.



모든 I2매스터와 슬레이브 장치들의 SCL은 서로 연결되며 SDA 또한 서로 연결된다모든 장치들이 SCL SDA를 각각 공유하고 있으므로 매스터가 슬레이브를 개별적으로 지정하기 위한 방법이 있어야 한다. I2버스에서 매스터가 각 슬레이브를 구분하는 수단은 슬레이브의 주소이다모든 I2슬레이브 장치들은 7 비트의 고유한 주소를 가지고 있으며 매스터는 주소로 원하는 슬레이브를 지정한다주소의 길이가 7비트이므로 매스터는 최대 128 개의 슬레이브 장치들과 연결될 수 있다물론 슬레이브 장치들의 주소는 모두 달라야 한다.

 

앞의 그림에는 매스터가 하나 밖에 없지만 I2버스에 두 개 이상의 매스터들이 존재할 수도 있다버스에 연결된 장치의 수가 아무리 많아도 한 순간에는 오직 하나의 매스터와 하나의 슬레이브만이 통신할 수 있다현재 통신을 진행하고 있는 매스터가 버스 소유권을 가지고 있다두 개 이상의 매스터가 있는 경우에 현재 버스의 소유권을 가지고 있는 매스터 및 매스터와 통신을 진행하고 있는 슬레이브 장치 이외의 나머지 장치들은 이들의 통신을 방해하지 않아야 한다.

 

SCL SDA는 모두 오픈 드레인이므로 모든 장치들의 SCL SDA는 각각 와이어드 AND로 연결 되어 있다와이어드 AND 연결에서는 어느 한 장치라도 ‘0’을 출력하면 해당 신호의 상태는 논리 ‘0’이 된다만일 SCL이나 SDA에 연결되어 있는 어떤 장치가 논리 ‘0’을 출력한다면 다른 장치가 그 신호의 상태를 논리 ‘1’로 만들 수 있는 방법은 없다통신에 참여하지 않은 장치가 SCL이나 SDA로 ‘0’을 출력하면 매스터가 정상적으로 통신을 진행할 수 없다이것은 I2버스에 연결되어 있지만 현재 통신에 참여하지 않고 있는 장치들은 모두 자신의 출력을 플로우팅 상태로 유지해야 한다는 것을 뜻한다.

 

통신이 진행되지 않는 상황에서 모든 장치의 출력은 플로우팅 상태이므로 SCL SDA의 상태는 모두 논리 ‘1’이다이 상황에서 I2버스의 사용을 원하는 매스터는 SCL SDA로 시작 조건을 출력하며 버스 소유권을 주장하고 통신을 시작할 수 있다두 신호의 상태가 모두 논리‘1’이 아니라면 현재 다른 매스터가 버스 소유권을 가지고 통신을 진행 중에 있다는 것을 뜻하므로 그 매스터가 버스 소유권을 반납할 때까지는 다른 매스터가 새로운 통신을 시작해서는 안 된다.

 

다음 그림은 I2프로토콜의 시작 조건정지 조건그리고 데이터 안정 구간을 보여주고 있다.

<v></v>

I2프로토콜에서 SCL이 ‘0’인 구간에서는 SDA의 상태 변화가 허용되지만 SCL이 ‘1’인 구간에서는 SDA는 안정된 논리 상태를 유지해야 한다매스터가 슬레이브로 데이터를 출력할 때 SCL이 ‘0’인 구간에서 SDA의 비트 전환을 하며 SCL이 ‘1’인 구간에서는 SDA의 상태를 그대로 유지한다슬레이브가 데이터를 출력하고 매스터가 그 데이터를 읽을 때에도 마찬가지이다그래서 SCL이 ‘1’인 구간은 데이터가 안정한 구간이다.

 

I2프로토콜에서 SCL이 ‘1’을 유지하고 있는 구간에서 SDA의 상태가 변하는 것은 일반 데이터 전송이 아닌 특별한 조건을 의미한다. SCL‘1’인 동안 SDA가 ‘1’에서 ‘0’으로 바뀌는 것을 시작 조건 (start condition, S)이라고 하며 SCL이 ‘1’인 동안 SDA가 ‘0’에서 ‘1’로 바뀌는 것을 정지 조건 (stop condition, P)이라고 한다. I2통신을 원하는 매스터는 SCL SDA가 모두 논리 ‘1’일 때 SDA의 상태를 ‘0’으로 바꾸어 시작 조건을 출력하며 다른 장치들에게 통신의 시작을 알린다마찬가지로 통신을 끝낼 때에는 SCL이 ‘1’인 동안 SDA를 ‘0’에서 ‘1’로 바꾸어 정지 조건을 출력하며 버스 소유권의 반납을 다른 장치에게 알린다.

 

I2C의 패킷 형식

다음 그림은 I2버스에서 사용되는 데이터 패킷의 형식을 보여준다. ACK을 포함한 9 비트가 I2규격에서 통신의 기본 단위가 된다.

 

<v></v>

매스터는 SCL SDA가 모두 ‘1’인 상태에서 SDA를 ‘0’으로 바꾸어즉 시작 조건을 출력하면서 통신의 시작을 알린다시작 조건 이후부터는SCL의 상태가 ‘0’인 구간에서만 SDA의 논리 값이 바뀐다매스터가 SCL로 출력하는 클럭에 동기를 맞추어 SDA로는 데이터가 MSB부터 한 비트씩 출력된다. SCL은 항상 매스터가 출력하는 신호이지만 SDA는 현재의 동작이 매스터의 읽기냐 쓰기냐에 따라 매스터의 출력일 수도 슬레이브의 출력일 수도 있다.

 

비트 데이터가 클럭 싸이클 동안 SDA로 출력되면 그 데이터를 수신한 쪽에서 번째 클럭에 맞추어 그 비트 데이터의 수신 여부를 확인해 주는 ACK 비트를 출력한다다시 말해서 ACK 비트는 직전의 8 비트 정보를 수신한 쪽에서 그 정보의 송신자에게 직전 8 비트 정보에 대한 수신 여부를 확인하는 값이다. ACK 비트가 ‘0’이면 정상 수신을 나타내며 ACK 비트가 ‘1’이면 (항상 그런 것은 아니지만정상 수신이 아님을 나타낸다값이 ‘0’인 ACK 비트와 구분하기 위하여 값이 ‘1’ ACK 비트를 NACK (no acknowledgement)라고 부르기도 한다.

 

만일 매스터가 SDA로 비트 정보를 출력했다면 그 정보를 수신한 슬레이브가 9 번째 클럭에 SDA로 ACK 비트를 출력하여 매스터에게 수신 결과를 알린다이 때 매스터가 ACK 비트를 받으려면 번째 클럭 싸이클 동안 자신의 SDA 출력을 ‘1’로 유지하고 있어야 한다반대로SDA로 출력된 비트 정보가 슬레이브의 출력이라면 그것을 수신한 매스터가 9 번째 클럭에서 ACK 비트를 출력한다이 때 매스터의 ACK비트를 받기 위해 슬레이브는 자신의 SDA 출력을 ‘1’로 유지하고 있어야 한다.

 

비트 정보와 이어지는 ACK 비트의 전송이 끝난 다음에는 매스터가 정지 조건을 출력할 수도 있고 시작 조건을 다시 출력할 수도 있으며 다음 바이트 전송이 이어질 수도 있다다음 동작은 현재 진행 중인 동작이 무엇인가에 따라 달라진다.

 

I2C의 주소 지정 형식

모든 I2슬레이브 장치는 7 비트의 고유한 주소를 가지고 있으며 매스터는 이 주소를 사용하여 상대 슬레이브 장치를 지정한다다음 그림은 매스터가 슬레이브의 주소를 지정하고 데이터를 주고 받는 방법에 대한 설명이다.

<v></v>

먼저 매스터는 시작 조건에 이어서 자신이 원하는 슬레이브의 7 비트 주소를 출력한다버스에 연결되어 있는 모든 슬레이브 장치들은 SDA선을 계속 감시하면서 매스터가 출력한 주소가 자신의 주소와 일치하는지 여부를 검사한다만일 매스터가 출력한 주소가 어떤 슬레이브의 주소와 같으면 그 슬레이브는 ACK 비트에 ‘0’을 출력하여 매스터에게 응답한다매스터가 출력한 주소를 가진 슬레이브가 없으면 아무도ACK 비트로 ‘0’을 출력하지 않으므로 ACK 비트의 상태는 ‘1’을 유지하여 매스터는 NACK을 받게 된다.

 

매스터가 ACK을 받으면 이것은 자신이 출력한 주소를 가진 슬레이브가 응답했다는 뜻이므로 매스터는 다음 단계를 진행한다반면에 매스터가 NACK을 받으면 이것은 자신의 호출에 응답하는 슬레이브가 없다는 것을 뜻하므로 매스터가 더 이상 할 수 있는 일은 없다매스터는 정지 조건을 출력하여 현재의 상황을 종료하고 통신을 다시 시작해야 한다.

 

 

슬레이브 주소 비트 다음에 오는 8 번째 비트는 다음 동작이 매스터의 읽기인지 쓰기인지를 가리킨다매스터가 이 비트로 0을 출력했다면 이것은 매스터 쓰기임을 뜻하므로 슬레이브 주소 다음의 1 바이트 데이터는 매스터의 출력이다이 데이터는 앞서 주소가 지정된 슬레이브를 위한 것이므로 그 슬레이브가 이 값을 읽어 들인다반면에 슬레이브 주소 비트 다음에 오는 8 번째 비트가 1 이면 이것은 다음 동작이 매스터의 읽기라는 것을 의미한다그러므로 매스터에 의해 주소가 지정된 슬레이브는 ACK을 응답한 후 이어서 매스터에게 보낼 데이터를 출력한다.

 

주의할 것은 슬레이브 주소는 7 비트이지만 패킷의 상위 7 비트로 정렬되고 마지막에 R/W 비트가 LSB 위치에 추가된다는 것이다그렇기 때문에 슬레이브의 주소를 왼쪽으로 한 비트 쉬프트 시킨 후의 비트 값을 슬레이브의 주소라고 생각하는 것이 더 편할 수도 있다예를 들면 DS1037이라는 RTC 칩의 I2주소는 1101000b으로 고정되어 있다 DS1037 I2주소는 0x68이다. DS1037에 데이터를 기록해야 할 때 매스터는 I2버스로 시작 조건을 출력한 다음 11010000b을 출력한다. DS1037의 데이터를 읽고자 한다면 매스터는 I2버스로 시작 조건을 출력한 다음 11010001b을 출력한다그러므로 비트 값인 0xd0 DS1037의 쓰기 주소, 0xd1 DS1037의 읽기 주소로 생각할 수도 있다.

 

I2버스 규격은 I2버스의 전기적 특성 및 타이밍과 함께 앞에서 설명한 시작 조건정지 조건주소 지정 방법 등에 대해서만 규정하고 있다구체적인 통신 방법즉 매스터가 슬레이브의 주소를 출력한 다음 정지 비트를 출력할 때까지 주고 받는 데이터의 바이트 수슬레이브의 내부 레지스터 주소 지정 방법 등은 슬레이브 장치에 따라 달라진다매우 다양한 종류의 I2슬레이브 장치가 있으니 여러 가지 다양한 방법이 있을 수 있다.

 

대부분의 마이크로컨트롤러는 I2인터페이스를 지원한다그렇기 때문에 UART를 사용할 때와 비슷하게 I2관련 몇 개의 레지스터를 설정한 후 레지스터 읽기/쓰기를 통해 간단하게 I2통신을 실행할 수 있다마이크로컨트롤러가 I2인터페이스를 지원하지 않으면 프로그램을 통해 비교적 쉽게 I2프로토콜을 구현할 수 있다·수신 타이밍을 정확하게 맞추어야 하는 비동기 통신과 달리 매스터가 출력하는 클럭에 맞추어 모든 동작이 이루어지므로 타이밍에 관련된 어려움이 특별히 없기 때문이다.

 

I2통신의 예

직렬 EEPROM, ADC, DAC, RTC 등을 포함한 다양한 매우 장치들이 I2인터페이스를 지원하고 있다. I2슬레이브 장치와 통신을 하려면 그 슬레이브의 데이터쉬트를 참고하여 구체적인 통신 방법을 이해해야 한다다음 그림은 24LC64라는 64 Kbit 직렬 EEPROM의 내부 데이터를 읽기 위한 여러 방법 중 하나이다.

 

<v></v>

24LC64의 주소는 1010A2A1A0b로 정해져 있다 4 비트는 1010로 고정되어 있지만 뒤의 3 비트 A2A1A0는 사용자가 임의로 바꿀 수 있다.주소의 마지막 3 비트를 사용자가 조절할 수 있도록 24LC64는 이 3 비트에 각각 대응되는 3 개의 입력 핀 A2, A1, A0을 가지고 있다주소의 일부를 사용자가 정하도록 만든 것은 24LC64에 여러 가지 다른 주소를 부여할 수 있도록 하기 위한 것이다만일 24LC64의 주소가 완전히 고정되어 있다면 I2매스터가 구동할 수 있는 24LC64 1 개뿐이다.

 

위의 그림은 24LC64의 저장된 값을 특정 주소부터 연속으로 읽는 방법이다맨 먼저 매스터는 시작 조건을 출력한 다음 24LC64 7 비트 주소를 출력하고 8 번째 비트로 ‘0’을 출력하여 다음 동작이 쓰기라는 것을 알린다매스터가 지정한 주소와 동일한 주소를 가진 24LC64가 있다면 그 IC ACK을 출력하여 매스터에게 응답한다. ACK을 받은 매스터는 이어서 24LC64의 저장 공간 중에서 자신이 원하는 주소를 MSB부터 연속해서 출력한다. 24LC64의 저장 용량은 64 Kbits,  8 K 바이트이므로 내부 주소 지정을 위해서는 13 비트의 주소 정보가 필요하다그러므로 매스터는 두 번에 걸쳐 주소를 출력한다매 바이트를 받을 때마다 24LC64는 매스터에게 ACK을 보낸다.

 

24LC64 내부의 주소를 출력한 후 ACK을 받으면 매스터는 시작 조건과 슬레이브 주소를 다시 한 번 더 출력한다그런데 이번에는 매스터가24LC64의 데이터를 읽을 차례이므로 7 비트 슬레이브 주소 다음에 오는 8 번째 비트는 ‘1’로 설정한다. 24LC64가 다시 매스터에게 ACK으로 응답하면 그 다음부터 매스터는 24LC64가 출력하는 데이터를 연속해서 읽는다. 24LC64의 출력을 1 바이트 받을 때마다 매스터는 ACK을 출력하여 이를 24LC64에게 알린다. ACK을 받은 24LC64는 내부에서 주소를 1 증가시키고 새로운 주소의 데이터를 읽어서 다음 SCL 클럭에 맞추어 출력하게 된다데이터를 연속해서 수신한 매스터는 자신이 원하는 마지막 데이터를 받으면 이번에는 NACK을 출력하고 이어 정지 조건을 출력하여 통신을 끝낸다.

 

위의 예는 I2통신을 사용하는 24LC64를 사용하기 위한 많은 방법들 중 하나일 뿐이다. I2인터페이스를 가진 장치마다 사용법이 다르기도 하거니와 한 장치에서도 명령의 종류에 따라 다양한 방법이 있을 수 있다.

 

I2C의 장·단점

I2버스의 가장 큰 장점으로 슬레이브 장치의 수에 관계 없이 두 가닥의 선만으로 매스터와 슬레이브 사이의 양방향 통신이 가능하다는 것을 들 수 있다두 개 이상의 매스터를 사용할 수 있다는 사실은 I2버스가 가진 또 다른 장점이다.

 

반면에 I2버스의 양방향 특성은 오픈 드레인 구조에 기반을 두고 있으므로 근본적으로 동시 양방향 통신이 불가능하고 통신 속도를 높이기 어렵다표준 모드에서 I2통신의 최대 속도는 100 kHz이며 고속 모드에서는 최고 400 kHz까지 가능하다다른 동기 통신 프로토콜예를 들어 뒤에서 설명할 SPI와 비교하면 매우 낮은 속도이므로 I2버스는 저속 주변 장치와의 데이터 통신이나 주변 장치의 동작 모드 설정 등의 용도로 많이 쓰인다동작 모드 설정은 사용 빈도가 높지 않기 때문에 낮은 속도가 별 문제가 되지 않는다.

 

I2인터페이스를 사용하는 제품의 수는 무척 많은 반면 슬레이브의 주소는 7 비트로 그 길이가 제한되어 있어서 다수의 슬레이브 장치를 사용할 때 슬레이브 주소가 충돌할 가능성이 있다이런 문제에 대한 해결책으로 슬레이브 주소의 하위 2 ~ 3 비트를 사용자가 임의로 설정할 수 있는 제품들이 많기는 하지만 주소가 7 비트로 제한되어 있어서 근본적인 해결책이 될 수는 없다.

 

출처 : http://blog.naver.com/eslectures?Redirect=Log&logNo=80137860924

 

Posted by 너를위한노래
Quadrotor20132013. 11. 11. 14:34

그러고보니 졸업작품 후 결과영상을 블로그에 안올렸네요 ㄷㄷ


지금 생각해보니 PID중 D값을 너무 크게 한거 같은데 그때는 왜 이런생각을 못했지 ㅠ


아무튼 D가 너무 커서 조종이 뜻대로 잘 안되더라구요 되긴 되는데 반응도 느리고 해서 결국 전시회장에서 날리는건 이렇게~



실을 천장에 메달고 위아래로만 왔다갔다하게 만들었어요 ㅠ 영상처리도 그렇고 만든걸 다 못보여준게 아쉽지만..


대신 학교 초록운동장에서 날린걸 찍어서 만든 동영상을 옆에 틀어놓는걸로 대신 했습니다.


아래에 첨부할게요~ 야간에 LED켜고 날리니까 멋지더라구요 ㅋ





Posted by 너를위한노래
Quadrotor20132013. 11. 11. 10:33




쿼드콥터는 내부에 제어 소프트웨어뿐만 아니라 하드웨어도 매우 중요합니다. 프레임의 재질, 길이, 프롭(=프로펠러)의 종류, 길이를 비롯해 나사 하나의 조임까지도 쿼드 전체의 안정성에 영향을 끼칠 수 있습니다.


 

[프레임 그림]

 

저는 450mm프레임을 썼고 재질은.. 조금 탄력적인 플라스틱이네요.. 이름은 잘 모르겠지만 포맥스랑 비슷하지만 조금 단단한 정도입니다.

 

여러 블로그를 보면 카본프레임이 좋다고 하는데 저는 한가지밖에 못써봐서 재질에 관해서는 그다지 뭐라 할 말이 없네요. 나중에 한번 더 자작한다면 카본으로 만들어보고 싶습니다.

 

450mm 길이에 대해서는 선택 실수네요. 제가 인터넷에서 프레임 찾아다닐때는 이거 하나밖에 못찾았었는데 외국사이트까지 보니 더 싸고 좋은 프레임이 많이 있더라구요 ㅠ 국내에는 아직 쿼드콥터같은거에 대한 판매처, 특히 부품만 따로 파는데는 찾기 힘들더라구요. 모터같은것도 다 수입해서 유통하는 업체 뿐이고요.

몇번이나 모터주문하면 재고가 없어서 다른거 고르라 그러고 산 모터에 대해서 질문하면 자기네는 상품페이지에 있는거밖에 모른다고 제조사한테 알아서 전화하라네요.. 상담원이라 그런것도 있겠지만 쿼드 자재 구입하면서 받는 스트레스도 장난 아니었습니다. 잘못 구입하면 호구될까봐요 ㅠ

 

암튼, 쿼드에 뭔가 싣고 싶다거나 매달고 싶으신 분들은 450mm이 좋겠구요, 그게아니라 단순 띄우는 게 목적이라면 320mm정도를 추천드립니다.

 

쿼드가 크면 클수록 프롭도 커야되고 그러면 좀 무서워지더라구요.. 지금은 그러려니 하는데 초반에 돌아갈때는 테스트 한번 할때마다 목숨걸고 했습니다 ㅠㅠ

 

그리고 기체가 크면 클수록 안정성이 높다는 글을 봤는데 기체의 크기는 안정성에 미치는 영향이 크지 않다.. 라는게 제 결론입니다. 오히려 다른 자재(센서나 모터나 변속기)의 조합과 정밀도가 훨씬 안정성에 미치는 영향이 커요. 센서 샘플링타임을 10ms로 하고 테스트할 때 아무리 소프트웨어적으로 노력해도 안되길래 '내가 애초에 불가능한 하드웨어로 하고있나' 싶어서 많이 조사해봤는데 결국 얻은 결과는 센서 샘플링타임을 더 짧게, 정밀하게 하는거였습니다. 이거에 대한 내용은 센서 포스팅할때 자세히 다루기로 하고 넘어가겠습니다~

 

프롭의 재질은 APC가 제일 좋은거 같아요. 부러져도 큰 부담 없고 충돌하더라도 프롭이 쉽게 부러지니까 다른 기물이 상할일도 없고요. 하지만 사람피부에 닿으면 피를 볼거 같긴 하네요 ㄷㄷ 아 APC는 플라스틱이구요 다른 재질로는 나무나 카본 등등이 있겠습니다. 이런 재질은 보통 3D기체(맞나요?)에 자주 쓰이던데 큰 프롭 1개로 고출력을 뽑아낼 때 많이 쓰는거 같더라구요.. 우리는 4개고 고출력보다는 안정성과 빠른 회전속도 변화가 중요하다고 이전 포스팅에 말씀 드렸습니다.

 

프롭을 구매하실 때 보시면 10x47이거나 1047이거나 8045등의 숫자가 붙은걸 볼 수 있는데요 이거는 프롭의 사양입니다.

앞 두자리, 뒷 두자리가 정보구요 1047을 예로 들어 설명 드리겠습니다.


 

[프롭 그림]

 

10의 단위는 인치입니다. 프롭의 길이구요, 450mm프레임에 맞는 사이즈입니다.

 

47은 피치라고 하는건데요. 우리가 자주 사용하는 볼트와 너트의 나선형 홈도 피치라고 하죠. 프롭에서 피치란 프롭이 얼마나 비틀어졌냐라고 보시면 되겠습니다. 많이 비틀어져 있으면 바람을 많이 생성 하겠죠? 하지만 모터에 걸리는 토크도 셀겁니다. 피치의 숫자가 클수록 많이 비틀어졌다고 보시면 됩니다.

 

적은 회전수에 고출력을 뽑아내려면 프롭의 길이는 길게, 피치는 크게 하시면 되지만 무작정 크게 할 순 없는게 모터의 토크도 고려를 해야 한다는 점입니다.

 

그리고 프롭 밸런스라는게 있습니다. 모터가 돌아가면 아무래도 진동이 발생할 수 밖에 없는데 이 진동은 최대한 줄일 수 있는 방법입니다.

 

여담을 하자면~ 진동모터라는 말을 들어보셨나요? 진동모터가 따로 있는게 아니라 일반 정상 모터를 가지고 모터축 옆에 납덩어리를 붙혀놓은 격입니다. 모터가 돌 때 무게중심이 모터축이 아니라면 덜덜 떨리게 되는 원리로 진동모터가 작동하게 됩니다. 실제로 여러분들이 들고다니는 스마트폰 내부에도 이런 진동모터가 소형으로 장착되어 있습니다.

 

우리가 지금 프롭을 달아서 진동모터를 만드려고 하는건 아니니까~ 프롭의 균형을 맞춰줘야겠죠?


 

[프롭밸런서 그림]

 

저는 수소문끝에 이런 기구를 사다가 맞췄습니다 ㅠ 자석 사이에 축을 두고 프롭을 끼운다음 전기테이프를 붙혀서 균형을 맞춰갔습니다. 그러니까 훨씬 진동이 덜하더라구요. 진동 방지를 위해 방진고무 등등 이것저것 많이 해봤는데 이것 역시 센서 포스팅할 때 다시 언급하겠습니다. 결과만 미리 말씀드리자면 프롭밸런스나 방진고무 같은 장치들은 안정성이 있는 기체를 좀 더 안정하게 만드는 역할이지 이런 장치로 진동을 없애는건 불가능하다고 미리 말씀드릴게요.


다음 포스팅에서 만나요~



 

 






Posted by 너를위한노래
Quadrotor20132013. 11. 6. 20:19

쿼드콥터에서 제일 기본이 되는 모터입니다.


모터는 BLDC모터를 사용하는데 BLDC모터에 대해 간략한 설명을 해보겠습니다. DC모터와 BLDC모터의 자세한 설명은 http://www.kyungmintech.com/bbs/skin/ggambo7002_boardgallery/print.php?id=techinfo&no=8 를 참고하시면 될거 같습니다. 정말 자세하게 설명 되어있네요.




옛날 달려라부메랑같은 만화가 유행할때 미니카를 해보신 분이라면 이해가 훨씬 쉽겠네요. 거기에 쓰이는 모터가 DC모터(brushed Direct Current Motor)입니다. 분해해보면 가운데 코일이 감겨있고 모터 내벽에 자석이 달려있고 코일이 돌아가는 구조죠. 돌아가면서 코일에 흐르는 전류의 방향이 바뀌면서 계속 한방향으로 돌아가는 구조입니다. 이것의 단점이 왼쪽 그림의 bursh(브러쉬)인데요, 코일이 돌아가면서 저곳에 닿아서 전류의 방향이 바뀌는건데 마찰때문에 뜨거워지고 브러쉬가 닳아서 영구적으로 사용 못한다는 단점이 있습니다.


그에 반해 BLDC모터는 약자인 Brushless Driect Current Motor 처럼 브러쉬가 없고 대신 자석이달린 모터 내벽이 돌아가는 구조로 되어있습니다. 마찰이 없어서 영구적으로 사용 가능한데다가 DC모터보다 더 좋은 속도비 토크를 낼 수 있고 같은 속도비 저소음 이라고 합니다. 


자, 쿼드에 쓰이는 모터는 물론 속도(RPM)도 중요하지만 토크도 중요합니다. 제가 쓴 모터 보면서 설명 할게요.

KV는 v(볼트)당 RPM이라고 보시면 되겠습니다. 물론 전류가 충분히 공급될때 말이죠. 저 모터는 900KV니까 11.1v배터리에 전류, 쿨롱 모두 충분하다면, 그리고 아무것도 달려있지 않아서 부하가 0이라면 9990RPM의 속도로 회전한다 라고 보시면 됩니다. 이거는 높으면 좋다고 생각하시는 분들이 많은데, 보통 모터의 최대 회전속도와 토크는 trade-off관계에 있기 때문에 무작정 높다고 좋은게 아니예요. 자세 제어를 하기에 토크가 모자라면 아무리 신호를 빠르게 주어도 회전속도가 안바뀌기 때문에 제어가 소용없게 되는 불상사가 일어납니다.. 쿼드에서는 최대 회전속도도 중요하지만 회전속도 변화속도(토크)도 중요하다고 알아두세요. 이 중 최대 회전속도는 쿼드의 무게에 따라 결정하셔야됩니다~


shaft지름은 모터 중심에 돌아가는 축의 지름이죠 위 모터는 위에 샤프트 축을 새로 끼기 때문에 3mm이 아니라 5mm입니다. 


나머지 외형에 관한건 읽는 그대로니까 넘어가기로 하고요


Idel Current는 연결후 회전하지 않는 상태, 즉 돌기위해 준비되어있는 상태에서 0.3A가 흐른다는 말입니다. BLDC모터는 일반 DC모터와 달라서 돌기 전에 준비하는 상태가 있다고 하네요.


No.of Cells는 사용 배터리의 셀 개수입니다. 2~4s니까 배터리도 2~4s중에 골라서 써야한단 말이죠. 전압으로는 7.4v~14.5 까지 쓸 수 있단 소리네요.


그리고 Max Contiuous Power은 17A인데 이거는 부하가0이고 11.1v배터리에 900KV모터라면 17A를 공급 받아야 무부하에서 9990RPM까지 돌아갈 수 있단 소립니다.


Max efficiency current는 80%정도로 사용해야 부담 없이 모터가 돌아간단 소리지요. 만약에 10A가 모터에 흐르는데 정해진 속도만큼 회전속도가 안나온다면 더 많이 흐르게 합니다. 이게 변속기의 역할이죠. 

모터가 돌고있는데 손으로 세게 잡는다면 회전속도가 줄어들테고, 변속기는 이를 감지하여 더 전류를 흘려보내서 속도를 높여서 원래 속도를 맞추려고 합니다.  음.. 요부분은 제가 이렇게 알고있는 좀 애매하네요.. 혹시 틀린점이 있다면 지적 부탁드립니다~


이제 위 그림의 표를 보시면 Prop은 장착할 프로펠러의 종류입니다. 프로펠러와 프레임에 대해서는 다음 포스팅에서 다루기로 하고, 저의 경우를 풀어 쓰면 

1047프로펠러를 달고 11.1v전압에 10.5A전류를 공급한다면 한 모터에서 960g의 무게를 들어올릴 수 있다 

라는 말이죠. W나 oz나 능률은 그냥 계산이 이렇다~란 소리니 넘어가겠습니다. 즉, 쿼드는 4개니까 약 4Kg의 무게를 들어올릴 수 있고, 모터 최대 효율을 고려했을 때 80%인 3.2Kg을 들어올릴 수 있단 계산결과가 나옵니다. 하지만 실제 안정성을 위해서는 최대 2.5~3.0이라고 보아야되겠네요..

참고로 제 쿼드는 1.3Kg정도였습니다. 


모터에 관한 설명은 이정도로 하고 변속기 설명을 해볼게요.


변속기 설명을 하기에 앞서, PWM에 대해 아셔야 합니다. (모르시면 http://aerowaysg.tistory.com/14 참고하시구요.) 변속기와 모터가 연결되어있다면, 우리의 할 일은 변속기에게 PWM신호를 주는겁니다. PWM신호란 간단히 말해 모터에 전류를 얼마나 흘려라 라는 신호입니다. 


왜 번거롭게 제어보드에서 변속기로 신호를 보내고 변속기에서 모터로 전류를 보내느냐~ 그냥 제어보드에서 바로 모터로 전류를 보내면 되지 않느냐 라고 생각하시는분들이 계신데 ! 불가능합니다. 제어보드 특히 아두이노같은 경우는 몇십~몇백mA의 전류만 흐르도록 설계되었기 때문에 모터가 필요로 하는 10A이상이나 그 이상의 고전류는 흐르지 못합니다.. 칩이 타버리니까요.. 


DC모터도 마찬가지로 모터드라이브라는게 있죠.. 우리 모두 조심하여 칩을 보호해줍시다 ㅠ


그리고 변속기마다 세팅 방법이 존재하는데요, 보드에서 출력해주는 PWM값이 0~100까지라 가정한다면 어느부분이 최소값인지 변속기한테 알려줘야 합니다. 그래야 어느 PWM에 얼만큼 전류를 보내야하는지 아니까요. 설정 방법은 변속기 제조회사에서 메뉴얼을 받으셔야 할겁니다. 저는 하비윙 스카이워커 20A x4 를 썼는데 메뉴얼이 영어로되어있어서 애먹었어요 ㅠ 


세팅 후 throttle bottom 하신 후 천천히 스로틀을 올리시면 모터속도도 같이 올라가는게 보이실겁니다. 


생각나는 대로 두서없이 막 적었는데.. 한번 검토 해봐야겠습니다.. ㅠ




Posted by 너를위한노래
Quadrotor20132013. 11. 6. 15:51

쿼드콥터나 RC카등 stand-alone이 가능한 기기들은 배터리가 필수입니다.


그리고 전동모터를 사용하는 기기는 배터리의 상태에도 많은 영향을 받습니다.


이번 포스팅에서는 배터리에 관해 알아보려 합니다. 제가 쿼드만들면서 스스로 습득하고 나름대로 정리한 내용을 바탕으로 쓴거라 틀릴 수도 있습니다~ 댓글로 지적해주시면 수정할게요 ㅠ


배터리의 종류에는 여러가지가 있는데 내부에 축전지 재료(?)에 무얼 쓰느냐에 따라 LiPo(리튬폴리머), 리튬이온, NiMH(니켈수소), 수은전지 등이 있습니다.


다른 배터리는 완전 방전 후 충전을 해야 배터리 사용 기간이 길고 용량을 충분히 쓸 수 있는데,(http://blog.daum.net/frei77/14439478 - 메모리효과 참고) 리튬이온, 리튬이온폴리머(=리튬폴리머) 배터리는 완충 또는 방전 주기를 거칠 필요 없이 편할 때 아무 때나 충전해도 최대용량이나 수명에 별로 영향을 끼치지 않는다고 합니다. 또한 가벼우면서도 밀도가 높기 때문에 배터리 사용 시간이 길고 휴대기기에 많이 쓰인다고 합니다.


배터리를 구매할 때 S, V, mAh, C라는 단위가 보이실 겁니다. 차례대로 뭔지 설명 해보겠습니다.


S 는 셀입니다. 배터리 안에 배터리 덩어리 하나가 들어있는게 아니라 여러개가 들어있는 셈이죠.



왼쪽 그림처럼 직렬로 연결하면 각 전지의 전압 합이 출력이 되고, 병렬로 연결하면 출력은 그대로 입니다.


리튬폴리머의 1S은 3.7v입니다. 직렬이니까 2S는 7.4v이고 3S는 11.1v.. 이런 식입니다. 자기가 사용하는 모터에 맞는 전압을 골라야겠죠?


V는 S에 직결되니까 넘어가겠습니다.


mAh 는 밀리 암페어 아워로 2000mAh인 경우에는 "한시간동안 정해진 전압으로 2000mA(2A)를 뿜어낼 수 있다"라는 이야기입니다. 많은 분들이 착각하시는데 이거는 배터리 용량이지 출력이 아닙니다. 용량이 10000000mAh라도 출력이 모자라면 모터가 제 속도를 못낼 수 있습니다.


C 는 쿨롱으로, 바로 출력량입니다. 최대 출력량이므로 RC나 쿼드콥터 할 때는 이게 크면 클수록 좋겠죠. 고등학교 물리에서 배웠던거같은데 단위 시간에 전자가 몇개 지나가느냐 이런 개념인거같은데 이걸 계산해서 최대 A(암페어)출력을 구한 다음에 나누기 모터 개수 하면 각 모터에 공급될 수 있는 최대 전류를 알 수 있겠죠.. 저는 그냥 생각없이 쿼드에 45C을 썼는데 모자르면 큰일날 뻔 했네요 ㅠ 


그리고 배터리에 보시면 +, -로 추정되는 빨간선, 검은선 두개가 나와있고 다른쪽에 검은선, 흰선, 흰선, 빨간선 요렇게 나와있는 부분이 있을겁니다. 두개짜리는 배터리 출력 선이고 여러다발 나와있는건 충전 선입니다. 3S냐 2S냐에 따라 여러다발의 개수는 달라지구요, 각 선을 전압계로 재보면 3.7v, 7.4v, 11.1v로 나오는걸로 봐서 각 셀에 연결되어있는 것 같습니다. 충전시에 각 셀에 똑같이 충전해주기위해 있는거 같구요.


그리고 팁을 드리자면 리튬폴리머라도 완전 방전내는건 비추입니다. 사용하다보니 모터 출력이 눈에 띄게 저하될 때까지 사용해봤는데 배터리가 좀 뜨끈뜨끈해지고 부풀어 오르더라구요.. 적당히 사용하시다가 충전하는게 나은거 같아요.. ㄷㄷ


보통 전기를 물에 비유하시는데 딱 맞는거같아요. 정리 해보겠습니다. 아래 그림을 참고해주세요

배터리는 물탱크입니다. 얼마나 많이 가지고 있느냐(mAh)에 따라 용량이 결정되지만 바닥에 달려있는 배수관(=수도관?)이 작으면 조금씩밖에 물을 내보내지 못합니다.

그리고 전압은 물탱크의 높이죠. 물탱크가 11층짜리 건물 위에 있는거랑 3층짜리 건물 위에 있는거랑 1층에서 나오는 물줄기의 세기는 다릅니다. 11층이 훨씬 세겠죠?

전류는 물입니다. 수도관의 크기가 같다고 가정하면 11층이 3층보다 더 많이 나오겟죠. 더 세게 나올테니까요

저항이 수도관의 크기입니다. 저항이 높다는건 수도관의 크기가 작다는 얘기구요. 전압이 아무리 높아도 저항이 높아서 수도관이 작으면 물줄기는 세지만 물은 조금밖에 못나오게 됩니다.

배터리에 있어서는 저항이 쿨롱이겠네요. 쿨롱이 높으면 수도관이 넓다는 얘기니까 물이 많이 나오게 되는거죠.


마구 휘갈겨 써놨는데 차분히 읽어보시면서 이해해보시길 바랍니다~ 저는 이런게 없어서 고생했어요 ㅠ


------------------------------------------ 11월 11일 추가 ----------------------------------

충전에 관해서 안써놓았네요 ㅠ

리튬폴리머 배터리의 충전은 전용 충전기가 필요합니다. 저는 다행히 기존에 쓰던게 있어서 이어받았지만 없는 분은 사야겠네요 ㄷㄷ




Posted by 너를위한노래
Quadrotor20132013. 11. 4. 17:09

9개월간의 대장정이 끝났습니다~


맨 처음에 쿼드를 만들겠다고 하나 둘씩 알아보던게 엊그제같은데.. 시간이 벌써 이렇게 지났네요 ㅋ


생각해보면 기획 당시에는 너무 막연했던거 같아요 센서 융합만 되면 쿼드 제어는 식은죽 먹기라고 생각했거든요


한번 지난 9개월간 어떤 과정이 있었는지 정리해 볼겸 나열해 보겠습니다.


처음에.. 아두이노로 만들겠다고 생각을 했죠 그런데 요요보드가 눈에 띄어서 요요보드를 구매했습니다. 그리고 디바이스마트(개인적으로 매우 싫어합니다,, 이것들이 배송이면 배송 사후관리면 관리 제대로 할줄 아는게 없어요)에서 쿼드 프레임과 모터 세트를 샀죠. 


그당시에는 모터가 BLDC모터라는것도 모르고 변속기가 필요하다는것도 몰랐습니다. 모터가 도착해보니 선이 세개? 이건 뭐지? 하면서 알아보니 BLDC모터더라구요. 그리고 변속기가 필요하다는것도 그 후에 알았습니다. 그래서 변속기를 주문 하고 그 사이에 센서를 테스트 했습니다.


센서는 연구실에 돌아다니는 아날로그 가속도센서 달랑 하나만 가지고 테스트 했죠. 기울이니까 값이 달라지길래 와~ 이거면 충분하겠는데? 이랬습니다 ㅋㅋ 많이 기울이면 값이 많이 바뀌니까 그만큼 모터 속도만 증가시켜주면 되겠지~ 라고 생각했어요. 처음 접하시는분들이 대부분 이럴겁니다.


그런데 가속도센서를 좀 더 조사하다가 병진운동에 취약한 사실을 알게됬습니다. 센서를 기울였을때 하고 옆으로 이동시켰을때 값이 같다는걸 발견하고 이거 하나로는 안되겠다 싶더라구요 그래서 연구실선배한테 물어봤는데 칼만필터를 이용해서 가속도 자이로센서를 융합하면 그런걸 커버할 수 있다고 하더라구요. 그래서 책보고 칼만필터를 공부하고 구현했습니다.


여기까지 형상은 가속도자이로센서-요요보드-갤럭시s3 이렇게 이어져 있고 칼만필터나 PWM출력 조정 모두 폰에서 이루어 지고 있었습니다. 요요보드하고 센서 입출력 하기위해 TWI통신(I2C)구현하는것도 뼈빠지게 힘들었고 ㅠ 요요보드하고 폰하고 연결하는 어플 개발하는것도 고생했습니다.. 보드가 비주류다 보니까 인터넷에 공개된것도 별로 없고 있다고 해도 죄다 영어라 힘들더라구요 ㅠㅠ 그렇게 구축해놨는데 요요보드가 두번 고장나서 포기하고 아두이노로 갈아 탔습니다.


아두이노는 MPU6050과 연결은 쉬웠지만 휴대폰하고 연결하는게 매우 고생스러웠슴다.. 아두이노측에서는 시리얼통신만 하면 돼서 쉬운데 안드로이드측에서 보내고 받기 힘들어요. 그렇게 궁리를 하다가 usbOTG라는 젠더를 알게 돼서 구매 후 구글링을 통해 아두이노와 안드로이드간의 통신을 구현했습니다. 근데 baudrate가 9600밖에 안되더라구요.. 이때까지만 해도 모든 연산이 안드로이드폰에서 수행됬기 때문에 느린 속도는 큰 문제였습니다. 센서와 아두이노 사이의 통신, 아두이노에서 폰으로 센서 데이터 보내고 폰에서 이걸 연산한 다음 다시 보드로 pwm수치를 보내고 보드는 그걸 가지고 pwm출력을 하고.. 지금 생각해보면 진짜 번거롭고 쓸데없는데 시간을 낭비했네요 ㅠ 그 당시에 교수님이 연산을 보드에서 수행하라고 말한 이유가 있었어요.. 


그래서 연산과정을 보드로 옮기기 시작했습니다. 이 때 센서도 바꿨네요. mpu6050에서 mysen-L센서로 바꿨습니다. mysen-L은 내부에서 roll, pitch, yaw값을 계산한 후 시리얼 통신으로 결과값만 넘겨줍니다. 센서 융합을 해주는 셈이죠. 그리고 샘플링타임도 100Hz였구요. 이게 충분히 빠른건줄 알았습니다.ㅠ 바꾼 센서의 값을 통해 쿼드 날개의 속도를 조절해주는 제어를 해봤습니다. 지금 보면 P제어만 수행한거네요.ㅋ 제어가 잘 안되죠 당연히.. 그래서 쿼드 제어를 조사하기 시작했습니다. 네이버의 쿼드콥터 자작카페를 많이 참고 했네요. 그리고 교수님이 말씀하신 논문도 찾아보고 해석하고 공부하다보니 PID제어가 필요하다는걸 알게 되었습니다. PID제어기를 아두이노에 구현하고 1축 지그(시소놀이)를 만들어서 계속 테스트했습니다. 센서 노이즈와 싸우기도 하고 제어 주기를 줄여도보고 늘려도 보고 진동에 따른 오차를 잡기위해 밤낮없이 고생했던 기억이 있네요. mySen-L센서 자체가 진동에 민감하게 설계되었고 최대 샘플링타임이 100Hz라 진동을 잡기위해 LPF나 이동평균필터를 쓰자니 반응이 너무 느리고, 반응을 빠르게하기위해 필터를 안쓰자니 진동때문에 D제어가 너무 불안정하고.. 이걸 조절하기위해 진짜 엄청난 시간과 노력을 쏟아부었네요 ㅠ 전 100Hz면 충분히 뜰거같았어요 근데 쿼드콥터 자작 카페 글을 읽다보니까 300Hz는 되어야 제어가 된다 라고 하더라구요.. 근처에 이런걸 해본사람이 한마디 해줬으면 훨씬 수월했을텐데.. ㅠ 센서의 한계가 100Hz니까 이 센서 말고 다시 MPU6050으로 돌아왔습니다. 이거는 1000Hz가 넘더라구요. 이제 가속도 자이로 센서를 융합해서 roll, pitch, yaw를 구해야 하는데,


아두이노로 칼만필터를 옮겨봤지만 돌아가질 않아서(이유는 불명.. 부동소수점연산이나 행렬연산이 잘 안됐었는지.. 형변환이 잘 안됐었는지 모르겠네요) 다른 융합방법을 알아보다가 상보필터라는걸 알았습니다. 그리고 그걸 공부하고 구현한 다음 필터를 쿼드에 맞게 설계및 조정했습니다. 이것 또한 PID게인값을 조절하는거라서 많은 테스트 후에 쿼드만을 위한 상보필터를 구현했죠. 기울어진 정도는 시간지연 없이 바로 나오고 모터 진동의 영향도 거의 안받게 설계 했습니다. 그리고 이 값을 이용해서 PID로 자세제어를 하니 뜨긴 뜨더라구요. 그리고 지자기계를 이용해서 yaw축을 제어하려고 했는데, 왜인지 너무 불안정하더라구요.. 자꾸 틀어지고 특히 0에서 360도로 넘어가는 그 순간이 불안하기도 했구요. 그리고 알아보니 주변 환경에 매우 민감하다고 하더라구요.. 그래서 과감히 지자기계를 버리고 자이로센서값을 누적해서 yaw제어를 하니까 아주 잘됐습니다. 오차가 쌓이긴 하겠지만 생각보다 거의 없더라구요. 모터가 안돌아가는 상황보다 돌아갈때 자이로 적분 오차가 덜 누적되는 경향이 있었습니다.


그리고 이제 무선으로 제어하기 위해 장착된 폰과 조종기 폰의 통신을 만들어야하는데, 처음엔 wifi-direct로 만드려고 했습니다. 근데 이게 나온지 얼마 되지 않은 기술이라 그런지 정보가 얼마 없더라구요.. 예제도 달랑 하나 있는데 그대로 실행시켜봐도 잘 안돌아가고.. 그래서 결국 블루투스로 구현했습니다. 무선 환경 갖추고 무게중심 맞춰주고 실내에서 띄우려고 했지만 이게 조종도 어렵고 마음대로 가지도 않고.. 


실내에서 안되는거같아서 실 외로 나가니까 그나마 좀 잘 날아서 동영상 찍고 졸작 준비를 했습니다.


조종이 잘 안됬던게 d게인값이 너무 커서 그런게 아닐까~ 하는 생각이 드네요.


그 동안 더 자잘한 문제도 많고 힘든 과정도 많았지만 대충의 맥락은 이상이네요.. ㅋ 정말 많은걸 배웠습니다. 센서로 현실 물리량을 측정해서 현실 물리량을 제어해 내니까 어려웠지만 보람도 있고 공부도 많이 되었습니다.


최초 목적은 쿼드는 기본적으로 쉽게 날게 하고 폰으로 영상처리하는게 주 목적이었지만 쿼드 제어가 주 목적이 되어버렸어요 ㅠ 좀 아쉽지만 그래도 많이 배웠고, 제가 하고싶은 공부를 했으니 후회는 없습니다 ㅋ


그리고 포기하고 싶은때도 있었지만 포기 안하고 꿋꿋하게 해 낸 제가 자랑스럽기도 하네요 ㅋ 


다음 포스팅부터 당분간은 쿼드 만들기에 필요한 기초 지식, 제가 겪은 경험을 바탕으로 한 조언을 해볼 예정입니다. 자작하시는 분들에게 도움이 됐음 좋겠네요.


Posted by 너를위한노래
Quadrotor20132013. 10. 15. 14:22

현재 쿼드콥터(윙윙이)의 커다란 맥락입니다.

지금은 안드로이드와 연결을 위해 아두이노 MEGA ADK를 사용하려고 준비중입니다.


밑은 아두이노 내부에서 센서 융합하는 맥락입니다.


크게 이렇게 동작시키고 있습니다ㅋ  현재 진행하시는 분들에게 도움이 됐으면 좋겠네요


프로젝트가 끝나고 처음부터 자세히 설명 할 계획입니다~



-------------------------------------------------------- 2013.10.18 추가 ----------------------------




Posted by 너를위한노래
Quadrotor20132013. 10. 11. 15:30

아두이노에서 게인 값 조절하고 모터틀고 돌리고 출력 데이터 그래프로 그려보는 작업의 반복입니다.. 게인 조절이라는게 사람하나 죽이네요 ㅠ

하다가 손으로 테스트하는건 정확하지 않은거같아서 아예 센서 Raw Data만 뽑아놓고 매트랩으로 구현해서 게인값만 조절해서 테스트하고 있습니다. 같은 데이터를 가지고 게인값만 다르게해서 게인값을 정한 후 윙윙이에 적용시키려구요.. 지금 생각해보니 이게 맞는거 같네요


반복 해보니까 P게인 값을 올리면 하이패스필터가 많이 반영되고 I게인을 올리면 로우패스필터를 많이 반영하는 느낌입니다.


이전 포스팅에서 제가 상보필터는 오차가 누적되서 발산하는 자이로센서값을 가속도센서값에 얼마나 빠르게 근접시키냐에 성능이 달라진다고 했는데요, 맞는 말이지만 제가 사용하는 환경(쿼드콥터)에는 좀 더 다른 접근법이 필요한 것 같습니다.


모터가 작동하면 가속도센서에서 감지되는 진동이 심하니까 P게인을 높혀서 가속도센서를 빠르게 따라가봤자 진동값을 따라가게 되더라구요


그리고 P게인을 낮추면 진동을 덜 따라가지만 실제 기울어진 각도와 차이가 나게 되구요.


그러다 든 생각이 어차피 실제 기울어진 각도가 숫자로 필요한게 아니라 많이 기울어졌냐, 적게기울어졌냐가 필요한거였으니까 P게인을 낮추는게 좋겠다는 생각이 들더라구요.


그리고 최대한 낮추되 발산하지만 않게 하면 노이즈도 줄고 발산도 안하니까 쿼드콥터에 딱 맞지 않겠느냐는 생각입니다.




노란색 : 가속도센서값, 파란색 : 자이로센서값, 빨간색 : 낮은P, 초록색 : 높은P


모터를 작동시킨 상태에서 세번 흔들고 끈 상태에서 한번 흔들었습니다. 실제 쿼드가 30도 이상 기울어지는 경우는 거의 없을테지만 필터 성능 테스트를 위해 좌우 30도 이상씩 흔들어서 데이터를 뽑았습니다.


자이로 오차가 좀 극단적으로 쌓였네요.. 다른 실험에는 저렇게 쌓이진 않던데.. ㅠ


P값이 높은 초록색이 빨간색에 비해 노이즈가 좀 있긴 하지만 적분오차가 엄청 쌓일때는 빨간색에 비해 비교적 정확하네요.


이 두 가지 경우는 직접 돌려봐야 알거 같습니다.. 저렇게 적분오차가 쌓이는일이 자주 일어난다면 초록P값이 더 좋을테고 별로 안일어난다면 빨간P값이 더 좋을테니까요.. 저 그래프는 제가 손으로 많이 기울어지게 만든거라 실제 작동하는 쿼드 각도와는 다릅니다


그래서 실험을 하다가!!


끈을 묶은 책상을 옆으로 안밀어놔서 프롭 날려먹었어요... 기울어지긴 했어도 떠있는 상태에선 예전보다 많이 안정적이게 됬습니다!!!



더 주의해서 실험해야겠습니다.. ㅠ 


저 실험때 나온 데이터를 분석해보니 자이로값이 한쪽으로만 이상하게 계속 누적되더라구요 그 데이터는 한 방향으로 roll회전을 계속하고 있다는 소린데 이해가 안가네요.. 작동 전에 자이로 calibration도 했는데.. 왜그럴까요 ㅠ


조금씩 나아지고 있어서 다행이긴한데.. ㅠ 11월 1일이 작품발표회인데 그때까지 할 수 있을까요 ㅠㅠ


Posted by 너를위한노래
Quadrotor20132013. 9. 29. 19:31

(내용을 보완한 글을 새로 올렸습니다~! 하단부 알림글을 먼저 읽어보시기 바랍니다~!)


오늘은 상보필터(complementary filter)또는 보상필터라고 하는 센서 융합방법에 대해 포스팅 하겠습니다~


이전 포스팅에서는 칼만필터로 융합했었는데 수박 겉햝기식이라 내부 구조를 변경하고 이해하기엔 좀 힘들었는데 요 방법은 좀 더 직관적이고 이해하기 쉬워서 제가 맘대로 조절하기도 편하더라고요


왜 다시 융합으로 돌아왔느냐~ 하면요 ㅠ roll, pitch, yaw를 센서가 알아서 계산해서 제공해주는 값을 사용했는데 그게 update rate(샘플링타임)가 100Hz였습니다. 근데 쿼드콥터 네이버 카페에 쌍둥아빠이기성이라는 분이 댓글을 달아주셨는데 최소 200Hz는 되어야 뜬다고 하더라구요.. 전 그것도 모르고 왜안되나~ 삽질만하고.. 오히려 50Hz로 낮춰보기까지.. ㅠ 제 센서가 100Hz인데 더 높일수가 없어서 다시 mpu6050으로 돌아왔습니다. 


mpu6050의 update rate는 가속도, 자이로 각각 4~1000Hz, 4~8000Hz인데 왜 범위냐면 내부의 LPF(Low Pass Filter)를 사용할 여지가 있기 때문인거 같습니다.


아무튼, 더 빠른 센서가 필요해서 MPU6050으로 돌아왔는데, 예전 칼만필터 소스를 아두이노에서 돌리려니까 한 루프에 10ms가 넘더라구요..;;


그래서 다른 필터를 찾다가 상보 필터가 있길래 공부해서 적용시켜봤습니다.


상보 - [명사] 서로 모자란 부분을 보충함. - 네이버 사전


두 센서의 서로 모자란 부분을 보충해서 더 좋은 결과를 만들어내는게 상보 필터입니다.


가속도 센서와 자이로 센서에 대해서는 이전 포스팅을 참고해주세요. -  mpu6050 가속도, 자이로 센서를 융합하기[상보필터] - 1 



이 블록선도를 구현할 건데요. 


먼저, 가속도 센서값을 roll, pitch로 바꿔야 합니다.


바꾸는 수식은 되게 많은데.. 제가 사용한 방법은 아래과 같습니다.



xAngle이 roll이 됩니다. 마찬가지로 pitch도 구할 수 있는데 yValue대신 xValue를 사용하면 되겠죠?


스케일링을 안하는 이유는 어차피 약분될거기 때문입니다. 


다음으로는 자이로 센서를 roll, pitch로 바꿔보겠습니다.


mpu6050은 가속도 자이로 모두 -90도~90도의 값을 -16383~16383로 주기 때문에 스케일링을 해야합니다.  -> (오류 : 하단참고)


 -> (오류 : 하단참고)


참 쉽죠? ㅋ


이걸 dt(시간변화량)으로 곱해서 누적시키면 각도가 나오게 됩니다. 적분하는거죠.



그럼 이제 가속도와 자이로센서 각각의 각도를 구했습니다. mpu6050 가속도, 자이로 센서를 융합하기[상보필터] - 1 제 포스팅에 있는 그래프처럼 서로의 장단점을 보완해 봅시다.




자이로 값이 기준이 됩니다. 가속도 값이 보정값이 되는거구요. 


간단하게 말하면 자이로 값과 가속도센서의 오차를 누적시키고 누적된 오차를 자이로센서값에 더해서 가속도센서값에 근접시키는 겁니다.


다만 얼마나 빠르게 근접시키느냐에 PI제어를 추가한 거라고 보시면 되겠습니다. P게인 I게인 값을 조절하는데, 가속도 값에 빠르게 근접시키면 노이즈까지 따라갈테고 느리게 근접시키면 노이즈는 무시되겠지만 반응이 느려지는 관계를 잘 절충해서 조절해야합니다.


PID제어에 관한 개념도 제 블로그에 있으니 참고바랍니다. - 쿼드콥터 PID제어


식으로 표현하면 



입니다. 이해하기 쉽게 써볼라고 길게 늘려봤는데 이게 수학적 문법에 맞는 식인지 모르겠네요..ㄷㄷ 


식 그대로네요.. 여기에 글로 해설해 봤자 식을 읽는거에 불과하니 괄호 하나하나 이해하면서 해석해보시기 바랍니다.


High Pass Filter와 Low Pass Filter식을 유도하는거는 pinkwink님의 블로그를 참고하시기 바랍니다. - http://pinkwink.kr/78


아두이노에 사용한 소스 코드도 올리니까 한줄 한줄 이해해 보시기 바랍니다.


double x_angle = -atan((double)ay/(double)az)*180.0 / 3.1416; // 가속도 센서 각도 구하기

integral_gx += (-gx/16383.0*90.0) * dt; // 자이로 값 적분해서 자이로센서 각도 저장

cf_err_x = cf_result_x - x_angle; // 전 값과 에러 도출 // P 제어에 사용

cf_err_sum_x += cf_err_x * dt; // 에러를 적분해서 저장 // I 제어에 사용

cf_kp_val_x = cf_err_x * CF_KP;            // P value

cf_ki_val_x = cf_err_sum_x * CF_KI;        // I value

cf_pid_out_x = (-gx/16383.0*90.0) - (cf_kp_val_x + cf_ki_val_x + cf_kd_val_x); // 자이로 각도값을 PID제어를 통해 얼마나 빠르게 가속도 각도값에 맞출 것인지 결정

cf_result_x += cf_pid_out_x * dt; // 상보필터 결과를 저장 // 자이로값이므로 적분으로저장

코드 -> (오류 : 하단참고)

결과는,



이렇습니다. 빨간색이 가속도, 초록색이 자이로, 파란색이 상보필터네요. 여기서는 P게인이 낮아서 부드럽지만 다소 지연이 발생하는걸 보실 수 있습니다. 자기가 사용하는 상황에 맞게 튜닝 해야겠죠? ㅠㅠ 이부분이 제일 어려운거 같습니다 ㅜㅜ


팁으로 아두이노에서 dt(한 루프 걸리는 시간)를 구할 때는 millis()나 micros()를 사용하시면 됩니다.

아, delayMicroseconds(int n)함수는 n에 숫자 제한이 있더라구요.. 그것도모르고 사용하다가 고생했네요 ㅠ



------------------------------------------------------------------ 10월 11일 수정 사항 -------------------

코드에서 에러 적분하는 부분에서 +를 하나 빼먹었네요.. 어쩐지 I가 잘 안되더라 ㅠ 수정했슴니당




------------------------------------------------------------------ 14년 2월 2일 오류 정정 -------------------

 "-> (오류 : 하단참고)" 라고 쓴 부분 모두 한가지 오류를 범했습니다.

MPU6050은 내부 레지스터를 이용해서 출력 값의 범위를 조정할 수 있습니다. (데이터시트 참고)

"-90도~90도의 값을 -16383~16383로 주기 때문에" 이 부분이 바뀔수도 있다는 겁니다.

레지스터 조작에 따라 가속도센서같은 경우는 -16383~16393범위에서 -2g~2g의 값을 출력시킬수도 있고  -8g~8g의 값을 출력시킬수도 있습니다.

자이로센서는 -32768~32768로 -250~250[degree/sec]을 출력하던가 -500~500의 값을 출력할수도 있습니다.

물론 범위를 넓히면 정확도는 그만큼 줄겠죠. 

데이터시트부터 차근차근 볼걸 너무 대충봤다는 생각이 듭니다..

논문 쓰면서 다시 돌아보다가 틀린부분이 있어서 바로잡습니다.


------------------------------------------------------------------ 14년 7월 16일 추가사항 -------------------

예전부터 이상하다고 여긴것에 대한 수정사항입니다.

이 글에서 두 센서의 측정치를 각각 각도으로 변환하는데, 오일러각이 아니고 각 축에 대한 각을 따로따로 구한겁니다.

이 부분 혼동하지 마시길 바랍니다. 작년에는 이런거 모르고 그냥 했는데 쿼드가 떴네요... 아마 0도에서 거의 움직이지 않기때문에 두 좌표계 변환을 고려하지 않아도 된 듯 싶습니다.

책에서는 두 센서 모두 오일러각으로 바꿔주던데.. 변환 식을 얼핏 보니 탄젠트가 들어갔던걸로 기억합니다. 0도에서는 탄젠트로 어떻게 계산하는지 이해가 안가서 덮어뒀던 기억이 나네요.


------------------------------------------------------------------ 15년 4월 25일 추가사항 --------------------


글에 잘못된 점이 많아서 새로 포스팅하고 있습니다. 이 글을 지울까 했지만, 이것도 하나의 시행착오고.. 혹시라도 다른 분들이 겪지 않았음 하는 마음에 그대로 두기로 했습니다. 새로운 포스팅은 

가속도, 자이로 센서값을 오일러각으로 변환 - 1

을 참고해주세요~



--------------------------------------------------------------------------------------






'Quadrotor2013' 카테고리의 다른 글

쿼드콥터 중간점검  (2) 2013.10.15
상보필터 게인값 조절하기  (2) 2013.10.11
mpu6050 가속도, 자이로 센서를 융합하기[상보필터] - 1  (9) 2013.09.29
쿼드콥터 PID제어  (1) 2013.08.25
쿼드콥터 시소놀이  (4) 2013.08.25
Posted by 너를위한노래
Quadrotor20132013. 9. 29. 17:41

상보필터 센서 융합에 관한 글을 적다가 센서 설명하는 부분이 길어져서 아예 따로 포스팅하려고 합니다 ㅋ


쿼드콥터의 자세를 측정하기위해 센서가 필요한데, roll, pitch, yaw중 roll, pitch를 측정하기 위한 센서인 가속도, 자이로센서에 대해 포스팅하겠습니다. yaw는 지자기센서가 있어야 정확한 측정이 되므로 제외하구요 ㅋ


roll, pitch, yaw를 모르신다면 이전 포스팅을 참고하시구요. - 쿼드콥터 동역학 모델링_1(기본원리)




가속도 센서는, --------------------------------------------------------------------------------------


말그대로 가속도를 측정하는 센서입니다. 가만히 고정되어 움직이지 않는 상태라면 센서에 중력 가속도만 작용하는 상태겠죠. 그럼 그 중력 가속도를 x, y, z축 벡터 세개로 나누어서 수치로 크기를 표현해줍니다. MPU6050같은 경우는 각 축에대해 -16383~16383까지의 값이 있네요. 딱 부호있는 16비트네요

밑의 그림을 참고하시면 도움이 되실거 같습니다. (회색 상자가 센서입니다)

 



 


하지만 중력가속도 g뿐만이 아니라 다른 외력에도 너무 민감하다는게 단점입니다. 다른 글에는 병진 운동에 취약하다 라고 되어있는데 이해를 돕기위해 좀 극단적인 예를 하나 들어보면 위 그림의 센서가 자유낙하 하고 있는 경우(공기저항무시) g가 0이겠죠? 그럼 센서가 아무리 기울어져 있어도 측정이 안될겁니다. 이처럼 센서의 회전이 아니라 이동에 취약하고 더 나아가 진동에도 약한 단점이 있습니다. 진동을 변위가 작은 이동이라고 보면 되겠네요. 하지만 두번째 그림인 상태에서 아무리 센서를 흔들고 던지고 회전시킨다음에 다시 두번째 상태로 돌아오더라도 흔들기 전과 후의 값이 같다는 특징이 있습니다. 


출력값을 보시면, (가속도센서값을 roll로 변환한 후 출력)


제가 손으로 임의로 실험한거라 손노이즈(?)도 있는거 같은데 여기서 주의깊게 보실 점은 구불구불한 노이즈들(밑의 자이로출력과 비교해보세요)과 멈췄을 때 값이 일정하게 유지된다는 것입니다.


정리하면 가속도 센서는 노이즈가 심하고 움직임의 값이 왜곡될 수 있지만(=부정확하지만) 시간이 지나도 오차가 누적되지 않는다.


자이로센서는, --------------------------------------------------------------------------------------


가속도센서와는 다르게 각속도를 검출하는 센서입니다. 선속도와 각속도의 차이, 속도와 위치의 관계를 안다는 가정 하에 설명할게요~


 


그림그리기가 좀 힘드네요..;; 위 그림에서 빨간선과 파란선의 각도의 변화량을 x, y, z축 각각의 변화량으로 표현해줍니다. 즉, 아무 움직임도 없다면 x, y, z축 값이 모두 0이라는 거죠. 여기서 중요한 점은 각 속도이기 때문에 기울어진 각도(위치)를 구하려면 적분을 해줘야한다는겁니다. 


출력값을 보시면, (자이로센서값을 roll로 변환한 후 출력)


위의 가속도센서 출력값과 같은 구간입니다. 처음보시는 분들은 가속도센서값이 더 정확해 보이시겠지만 자이로센서값이 실제 제 손 움직임과 더 비슷합니다. 다만, 계속 밑으로(마이너스 쪽으로) 발산해 가는데 이것이 자이로센서가 가진 단점입니다. 계속 적분하는 과정에서 센서의 노이즈도 같이 적분되기 때문에 이렇게 드리프트가 생기더라구요. 


정리하면, 자이로 센서는 실제 값과 비슷하지만(=정확하지만) 누적오차가 발생한다.


자 여기서, 가속도 자이로 값으로 같은 현상(roll, pitch같은)을 측정할 수 있지만 서로 장단점이 있다는걸 알 수 있죠, 그리고 서로의 단점이 상대의 장점이 된다는것도요


이 두 센서의 장점을 합치면 아래 그림의 파란색처럼 됩니다.



이걸 합치는 상보 필터에 대해 다음에 포스팅 하겠습니다.





'Quadrotor2013' 카테고리의 다른 글

상보필터 게인값 조절하기  (2) 2013.10.11
mpu6050 가속도, 자이로 센서를 융합하기[상보필터] - 2  (45) 2013.09.29
쿼드콥터 PID제어  (1) 2013.08.25
쿼드콥터 시소놀이  (4) 2013.08.25
현재 작업 환경  (1) 2013.08.08
Posted by 너를위한노래
Quadrotor20132013. 8. 25. 01:16

아직 제가 만드는 쿼드콥터의 PID제어가 완성된건 아니지만 시간이 좀 나서 포스팅해봅니다.


PID제어의 기본에 대해서는 따로 공부가 필요한 부분입니다. 관련 정보는


위키백과 - PID제어

PID제어 관련 포스팅


요 두군데를 참고하기 바랍니다.


먼저, PID는 Feedback이 일어나기 때문에 무엇을 가지고 무엇을 제어하는가가 첫번째가 되어야 합니다.


제 경우에는 쿼드콥터를 가지고 많은 고민을 했습니다.


쿼드콥터의 경우 센서에서 받아온 자세값을 가공하여 그에 맞는 다음 자세를 출력해야하는데, 출력은 결국 각 모터의 PWM값이 될겁니다.


근데 여기서, 받아온 자세값은 분명 각 모터 자체의 위치값인데 출력은 모터의 회전수란 말이죠. 모터의 회전수는 모터의 추력과 연결되고, 이는 결국 모터 자체의 가속도 값이 되지 않습니까? 위치값을 받아서 가속도값을 출력해야하니까 받아온 위치값을 두번 미분해서 사용해야하나..? 이런 생각이 들더라구요..


그냥 일단 해보자는 식으로 위치값의 오차로 PWM출력을 줘봤는데 잘 되질 않아서 더 저런 생각이 들었던 것 같습니다.


그래서 논문도 찾아보고 여기저기 쿼드콥터 카페도 찾아보고 했는데


결론은 그냥 자세값(roll, pitch, yaw)를 가지고 PWM출력하는게 맞더라구요.. ㅠ


아예 확신을 가지고 논문 참고해서 PID제어기를 다시 만들어서 돌려보니 어느정도 되는거같습니다 ㅠ


그래도 좀 불안정해서 센서값과 P, I, D각 제어값들을 뽑아서 그래프로 그려보니까 문제가 있더라구요..


P는 그냥 센서값에 비례하니때문에 진동에 영향을 덜 받지만 I나 D는 그렇지가 않더라구요. 


그나마 I는 계속 누적되니까 화이트노이즈같은 진동은 어느정도 무시되서 비교적 잘 누적되는 성향을 보이는데


D가 문제예요.. 손으로 누르는 힘에 잘 저항하게 D게인을 높이면 진동에 의한 노이즈까지 잘 반영해서 출력값이 알아볼수도 없게 요동치더라구요.. 


그렇다고 D를 낮추면 반응이 느리고.. 적당히 중간으로 잡아놓으면 수평을 유지하긴하는데 다소 불안하게 왓다갓다하고.. 


그래서 뭔가 변화를 줘보기위해 D제어 입력에만 LPF를 씌워봤습니다. 결과는 한결 나아졌지만 역시 LPF를 통과해서그런지 다소 반응이 느린감이 있더라구요. 


센서를 쿼드 중앙에 나사 한개로만 고정시켜서 그런가~ 싶어서 고정 판도 제작했어요. 오늘 드릴질하고 난리도아니었음 ㅠ


방진 고무나 댐퍼 얘기가 카페같은데서 나오긴 하는데 소프트한걸 쓰면 자세값을 바로 반영 안할거같고 딱딱한걸 쓰면 진동따위 그대로 전달해버릴거같아서 별로 땡기질 않네요 ㅠ


누가 옆에서 이럴땐 이러면 돼~ 하고 조언을 해주면 속편하겠는데.. 그런 사람도 없고.. ㅋ


쓰다보니 푸념으로 바뀌었네요.. 다음 포스팅에서는 좋은 글로... ㅋㅋㅋ



Posted by 너를위한노래
Quadrotor20132013. 8. 25. 00:46

쿼드콥터 Roll축에 대해서만 PID제어를 해보기 위해 시소놀이 중입니다.


말이 놀이지 위험합니다 ㅠ 조심합시다


밑의 동영상은 PID조절도 하기 전이고 심지어 P제어만 약간 넣은 상태인데 일단 평행을 유지하는게 신기해서 찍어봤습니다. (좀 오래된 영상임)



지금 보니까 거의 손으로 세워놓은거네요 ;; 


손으로 조금만 외란을 가해도 맥없이 쓰러지는...


위 영상은 X자 콥터인데 쿼드콥터 제어 관련해서 찾은 논문이 +콥터기반으로 되어있길래 방향을 바꿨습니다. 축도 더 부드럽게 움직여서 실제 떴을 경우랑 비슷하게 실험환경을 바꿨습니다.


밑의 영상은 PID게인 조절 중이었던 영상입니다. 




잘 잡는것 처럼 보이다가 갑자기 값이 튀는데.. 이런것들 잡기위해 현재 노력중입니다.


위위 영상은 열흘 전, 위 영상은 사흘 전 테스트였는데 부족한게 많더라구요


지금은 논문 참고해서 제어기 싹 갈아 엎고.. PID게인 조절도 매틀랩 이용해서 그래프 그리면서 하고 있고.. 오늘은 센서 고정을 더 단디하기 위해 구조물 제작까지 해놓은 상태입니다. 내일 가서 진동이 좀 줄었는지 테스트해봐야겠습니다.


다음번엔 더 좋은 영상을 올려야 할 텐데.. ㅠ




--------------------------------------------------------------- 2014.05.26 수정------------------------

위 영상에서 시소놀이가 제대로 안된 이유는 샘플링타임이 느려서입니다. 최소 200Hz 이상은 되어야 제대로 되는거 같네요.




Posted by 너를위한노래
Quadrotor20132013. 8. 8. 16:50
아두이노로 개발하고 있고 편한 개발을 위해 PC에서 processing프로그램을 통해 그래프 출력 및 디버깅하고 있습니다~

기둥에 쿼드콥터를 매달고(시소) pitch축만 움직이게 한 다음에 pitch축에 대해서만 PID제어 시도하고 있는데 잘 안돼서 센서값과 PWM출력의 상관관계 (위치와 가속도 관계인지)를 생각하고있습니다.


이번달 안에 띄워야하는데...



------------------------------------------- 8월 14일 추가 -------------------

MPU6050 말고 다른 IMU센서로 진행하고 있습니다.


Posted by 너를위한노래
Quadrotor20132013. 4. 22. 12:18

음... 이번이 두번째네요 보드가 고장난거는..

 

한두푼도 아니고 왜 이러는지... ㅠ

 

첫번째꺼는 쿼드콥터의 BLDC모터랑 전원을 같이 써서 고장 났다고 쳐요, 두번째꺼는 아예 배터리도 따로 쓰고 메뉴얼의 전압대로 맞춰서 썼는데 왜 잘 사용하다가 갑자기 그러냐고요 ㅡㅡ

 

IOIO보드는 좋은 보든데.. 쿼드콥터 하실때는 사지 않으시길 추천드립니다.. ㅠ 두번째도 고장나니까 회로 자체가 불안한게 아닌가 하는 생각도 들고..

 

이왕 이렇게 된 김에 어떻게 할까.. 고민하다가 제가 가지고 있는 아두이노 Mega 2560 보드를 사용할 수 있을거같아서 필요한 케이블 주문해 놨습니다.. 이제 포스팅에 아두이노 글도 올리겠네요 ㅎ

 

근데 제가 사용하는 mpu6050안에 LPF가 내장되어있다는데 이거 쓰려면 아두이노가 편하더라구요 LPF써서 잘되면 좋을텐데.. ㅋ

 

위기가 기회가 될지도 모르겠습니다 ㅋㅋ

Posted by 너를위한노래
Quadrotor20132013. 3. 29. 19:36

 

쿼드콥터 제어에 대해 찾다가 동역학에 대해 찾게 되고 현재 동역학에 대해 공부를 하고 있습니다.

 

학교에서 일반물리학 수업을 듣는데 열심히 들어야겠어요 ㅠ 관성좌표계니 모멘트니 하는거를 하나도 모르면 어쩔뻔 했나 싶네요.

 

지금 제가 따로 구축한 개념은 없고 지금 보고 있는 자료를 포스팅 하려고합니다.

 

구글링 하다가 양광웅님의 블로그에 들어갔는데.. 이 분은 천재신듯.. ㅋ 대단하신분 같아요

 

밑에 링크 걸어놓을테니 로봇, 제어등에 관심있으신 분은 들어가 보시길 권합니다.

 

양광웅님의 블로그에 게시되어있는 PDF파일입니다.

 

 

1. 쿼드 로터 무인항공기 동역학 모델링  -

               쿼드콥터_-_동역학_해석.pdf

 

2. 쿼드 로터 무인항공기 제어 및 시뮬레이션 -

               쿼드콥터_-_제어기_설계.pdf

 

좀 더 보다가 얻는게 있으면 또다시 포스팅 하기로 하겠습니다~

 

출처 : 양광웅님의 블로그 - Open Robotics

Posted by 너를위한노래
Quadrotor20132013. 3. 27. 13:20

쿼드콥터의 자세를 추정할 수 있다고 치고.. ㅠ

 

떠있으려면 피드백 받은 자세에 따른 새로운 자세를 만들어 내야겠죠? 각 모터 회전수의 변화로 말이죠

 

이번 글에서는 기본적인 쿼드콥터 작동 원리에 대해 적어 보겠습니다.

 

자, 쿼드콥터를 위에서 바라보면 아래 그림과 같습니다.

 

 

 

 

 

 

이웃한 로터끼리는 반대방향으로 돌아서 각 로터에서 생성되는 반토크를 상쇄시킨다

 

라고 되어있는데.. 로켓 추진체의 작용반작용처럼 직관적으로 확 와닿지는 않네요.

 

각 로터가 100%똑같은 추력을 발생시킨다고 가정하면 쿼드콥터는 지상에 평행하게 뜨게 됩니다.

 

그리고 공중에 떠서 정지해있는 상태일 때는 아래 그림에 따라 움직입니다.

 

 

 

 

 

 

화살표가 굵은 부분 얇은 부분 주의해서 보시길 바랍니다. (각 모터의 상대적 회전수를 나타냄)

 

Roll, Pitch, Yaw는 아래의 그림을 보시면 이해하실 수 있을겁니다~

 

 

(클릭하시면 확대됩니다)

 

 

내용이 추상적이라 거의 그림이네요.. ㅋ

 

이정도면 특정 자세를 만들기위해 어떻게 모터를 조작해야되는지 대충 감이 올거같네요.

 

다음에는 좀더 심도있는 내용을 다뤄보도록 하겠습니다.

 

요새 개강도하고 과제도 슬슬 나올때라 진도가 늦네요 ㅠㅜ

 

 

 

 

Posted by 너를위한노래
Quadrotor20132013. 3. 20. 19:04

 

저번 포스팅에서 못다한 1차 저역 통과 필터 후 칼만필터 거친 포스팅을 해보겠습니다.

 

   
 칼만 필터만 사용  저역 통과 필터만 사용

 

합치면..!!

     

 
 저역 통과 필터 + 칼만필터

 

그냥 칼만필터와 차이가 없죠?? 저도 실망했었습니다 ㅠ 그래도 혹시나 하는 마음에 모터를 작동시켜서 테스트 해봤는데요

 

 

 

 정지한 상태

 

위 그림은 기체를 움직이지 않고 측정한 결과입니다.. 0에서 요동치는 노란색 보이시나요? 저러면 안돼요 ㅠㅠ

 

근데 스치는 생각에 '혹시 정지하지 않고 움직이면 어떨까? 어떤 패턴이라도 나오지 않을까?" 해서 움직여 봤는데 왠걸!

 
 칼만필터만 통한 결과

 

짠~!  그냥 손으로 최대한 일정하게 기울였다 세웠다 한건데요 어느정도 패턴이 보입니다!

 

 

 저역통과필터 + 칼만필터 결과

 

필터 두개를 켜고 측정해봤는데!!

 

생각보다 깔끔하네요!!

 

정지했을 때는 0에 수렴하진 않지만 움직이니까 어느정도 봐줄 만 하네요

 

근데 이게 사람 눈에는 그럴듯 해 보이는데 피드백으로서는 유효할진 모르겠습니다.

 

그래도 가능성이 보이니까!! 이대로 한번 자세추정 해서 제어 해보려고 합니다. 안돼면 그때 다시 문제점을 진단하도록 하구요 ㅋ

 

이번 시도는 수확이 있어서 다행이네요~

 

 

아.. 다 쓰고 보니까 가속도센서에 대해서만 LPF하고 자이로센서는 하질 않았네요??

 

음.. 더 좋아질까요?! 다음 포스팅때는 자이로센서도 같이 필터링해서 찾아오겠습니다!

 

 

----------------------------------------------------------------

여기다 추가할게요

 

자이로도 LPFing해봤는데 성능이 오히려 안좋게 나타나네요ㅋㅋ

 

왜지.. 코딩이 잘못됬었나...

 

 

 

 

 

 

 

Posted by 너를위한노래
Quadrotor20132013. 3. 18. 23:13

간만에 연구실에 놀러오신 선배한테 어떻게하면 진동을 잡을 수 있을까요~ 하고 진동때문에 기울기가 제대로 나오지 않는 그래프를 보여드렸더니, 칼만필터 말고 진동에 대해 강한 필터를 사용하는게 어떠냐고 그러시더라구요

 

그러고 집에와서 곰곰이 생각해보니 진동도 엄연한 물리 작용이더라구요. 무슨 말이냐면, 진동을 감지하기 위해 자이로, 가속도센서를 사용한다 이겁니다.

 

스마트폰이 대표적인 사례겠네요. 흔들어서 잠금해제하기, 만보기 어플 등등 진동을 응용해서 만든 어플이잖아요

 

그렇게 생각하니까 진동도 감지하기 위해 만든 가속도, 자이로 센서인데 주위에다 진동 방지 장치를 하는게 무슨 소용인가 싶더라구요(물론 어느정도는 감소하긴 하지만 한계가.. ㅠ)

 

그래서!

 

소프트웨어적으로 접근해보기로 했습니다.

 

아주 간단히 이동평균 필터를 구현하려다가 별로 효과가 없을거 같아서 저역통과필터(Low Pass Filter)를 구현해 봤습니다.

 

구현은 이동평균필터보다 간단해요.

 

(weight) : 가중치

(measured) : 측정치

(value) : 현재 값

(pre_value) : 이전 값

 

 

 

 

n이 2인 이동평균필터는 위 식에 w만 0.5입니다.  라고 생각했다면 오산입니다.

 

은 여태까지 계산했던 모든 값에 영향을 받아요.

 

만큼 영향을 주고

 

만큼 영향을 줬으니까 만큼 영향을 주고

 

이런식으로 계속 누적되어 가죠 (제곱으로)

 

는 상황에 맞게 조절해야 합니다. 위 식에서 가 크면 클수록 측정치에 영향을 덜 받게 되겠죠

 

주절주절 설명을 길게 했는데, 결론은

 

   

 w = 0.3

 w = 0.7

초록, 빨강 : 필터 통과 전      자주, 노랑 : 필터 통과 후 

 

잘 보이시나요? 왼쪽에 비해 오른쪽이 더 괜찮은 결과가 나왔습니다. 이 결과를 가지고 칼만필터 통과한건 다음 포스팅에... ㅋ

 

 

그리고 혹시나 해서 제가 만든 ㅋㅋ 이름은 거창한 미분필터.. 검색은 안해봤지만 진짜 있다면 만든이한테 미안요 ㅋ

 

이름은 어렵게 미분이라고 써놨지만 실제로는 차(Difference)필터가 더 맞겠네요.

 

"바로 직전 값과 현재 측정치가 d이하라면 현재 측정치를 무시해라" 이거라면 위의 그림처럼 순간적으로 팍 튀는건 무시할 수 있지 않을까 해서 만들어 봤습니다.

 

 

 

 

결과는... 실패..ㅋㅋ 현재 측정치를 무시하니까 이상한 값에서 움직이질 않네요.. 혹시 d를 조정하면 좀 더 나은 결과가 나올까요? ㅋㅋ

 

일단 이 두가지 기본적인 필터 중 바로 쓸 수 있는건 저역통과필터네요. 다음 포스팅에 LPT + kalman으로 돌아오겠습니다~!

 

d도 한번 조절해봐야겠네요 지금 보니 가능성이 ...



------------------------------------------ 2013.08.20 추가

위의 미분필터라고 되어있는 결과는 코딩을 잘못한 결과입니다. 착오 없으시길 바랍니다 ㅠ

 


--------------------------------------------------------2014.06.02 추가

1차 저역 통과 필터(LPF)는 지수 가중 이동 평균 필터라고도 합니다~


ps. 지금보니까 미분필터는 아무짝에서 쓸모없는 실패작이네요.. 그래도 지우는것보단 나을거같아서 냅두고 추가 코멘트만 달아놓습니다.

 

 

 

 


Posted by 너를위한노래
Quadrotor20132013. 3. 13. 18:01

 

원래 네이버 블로그에 있는 글을 모두 옮겨오려고 했지만.. 굳이 그럴 필요 없을거 같아서 이 글에 제목과 링크만 올려두겠습니다.

 

네이버 블로그 주요 포스팅:

쿼드콥터 초기 계획안 

재료, 부품 구매 현황

MPU-6050 3축 자이로 + 3축 가속도 센서 구매 

[스크랩]오일러각 

[스크랩] I2C (Inter-Integrated Circuit) 버스 

[스크랩]칼만 필터(Kalman Filter) - Part 1 : Linear Systems | Robotics 

[스크랩]칼만 필터(Kalman Filter) - Part 2 : Kalman Filter & Algorithm | Robotics 

 

 

현재는 가속도, 자이로 센서 값을 이용해서 칼만필터로 융합한 다음, Q행렬, H행렬을 조정하는 단계입니다.

 

 

노랑, 자주 : 가속도

빨강, 초록 : 가속도 + 자이로 using 칼만필터

 

여러가지 상황에 대해 테스트하고 있는데 쿼드콥터 진동이 장난이 아니더라구요.. ㅠ

 

어느 정도는 칼만필터로 보정할 수 있겠거니~ 했는데 이건 너무 심해서 기구적으로 손을 보고 있습니다.

 

그래서 스펀지로도 방진 해보고 고무줄로 진동을 줄여보고자 노력했지만 별로 효과는 없더라구요..

 

   

 

 RPM은 모두 동일

   

 스펀지 장착

 고무줄 장치 장착

 

위의 테스트에서는 RPM이 낮은데 높게하면 +90도~-90도 화이트노이즈수준으로 심하게 감지되더라구요 ㅠ

모터랑 센서가 싸구려라 그런가... ㅠ

 

아예 모터에서 발생하는 진동을 제거하는 방향으로도 해봐야겠습니다.

 

 

안드로이드 소스파일(accel gyro Kalman Filter, PWM generate):

SimpleAnalogInputActivity.java

GraphView.java

Matrix.java

SnowCube.java

SnowRenderer.java

 

 

 

 

Posted by 너를위한노래