자작 드론 만들기(DIY Drone) 자이로 캘리브레이션, 모터회전방향, 프로펠러 장착, PID 제어 (소스 제공)
ฝัง
- เผยแพร่เมื่อ 22 ม.ค. 2021
- [소스제공] blog.naver.com...
자작 드론의 피치(Pitch), 롤(Roll) 각도의 정확한 출력을 위한 자이로 캘리브레이션에 대해 소개합니다. 출력되는 각도가 정확한지 체크하는 방법도 소개합니다. 센서 부착에 따른 모터 회전 방향과 프로펠러 간의 장착 방향에 대해 배워 봅니다. 드론의 안정적인 호버링을 위한 이중 PID 제어에 대해 알아봅니다. - วิทยาศาสตร์และเทคโนโลยี
제 영상을 보고 자작하시는 분들이 계시다면 그 개발 과정을 제게 보내주시면 향후 영상 제작시 소개하고 서로 동기부여하였으면 하네요. 서로의 격려는 큰 힘이 됩니다.
안녕하세요. 영상을 보며 아두이노 드론을 따라 만들고 있는 학생입니다. 궁금한게 있어 댓글을 남깁니다.
x, y, z 축을 계속 보정을해도
16:46:39.105 -> Who Am I(0x70) = : 70
16:46:45.096 -> fGyro_X_Cal : -269.49 fGyro_Y_Cal : 14.00 fGyro_Z_Cal : -37.04
16:47:41.133 -> ========= Drone Basic ============
16:47:41.133 -> Who Am I(0x70) = : 70
16:47:47.165 -> fGyro_X_Cal : -269.14 fGyro_Y_Cal : 13.56 fGyro_Z_Cal : -37.13
16:49:36.943 -> ========= Drone Basic ============
16:49:36.943 -> Who Am I(0x70) = : 70
16:49:42.965 -> fGyro_X_Cal : -269.24 fGyro_Y_Cal : 13.41 fGyro_Z_Cal : -36.60
16:50:08.000 -> ========= Drone Basic ============
16:50:08.000 -> Who Am I(0x70) = : 70
16:50:13.971 -> fGyro_X_Cal : -269.27 fGyro_Y_Cal : 13.25 fGyro_Z_Cal : -37.11
이런결과가 나오는데 이유를 알 수 있을까요?
값이 조금씩 다른것은 노이즈 성분으로 그런거고 이를 보정하기위해 필터 알고리즘을 구현 적용합니다.
0이 나와야 좋다고 하시는데 0 값을 나오게 하는 방법이 무엇인가요??
fGyro_X_Cal = -269;
fGyro_Y_Cal = 13;
fGyro_Z_Cal = -37;
이 코드를 수정해도 바뀌지 않습니다.
@user-mi8zo7sl5n 캘 값을 오프셋으로 가감하시어 0으로 맞춥니다. 그게 캘을 하는 목적이구요
아주 유익한 강의 고맙습니다.
늘 영상을 만들고 보면 아쉬움이 남습니다. 하지만 이런 좋은 말씀 보고 힘내서 정주행 계속합니다. 감사합니다.
ㅎㅎ 한편 한편 보면서 따라가니 너무 좋네요 ^^* 저는 기본적인 아두이노 공부 및 드론 공부를 같이 하기로 한 친구들과 마무리 하게 되면 강의해주신 내용 따라가면서 제작해보려고 합니다^^*
제 영상이 도움이 되고 있다니 기분이 좋네요. 나중에 드론 자작하실 때 제게 동영상 보내 주시면 영상 말미에 소개하는것도 좋겠다는 생각이 드네요. 늘 드론 테스트 시, 안전에 유의하시구요. 좋은 댓글 감사합니다.
fGyro_X_Cal -269.25 fGyro_Y_Cal 1.37 fGyro_Z_Cal -32.76
자이로 캘리를 해서 평균 값이 이상태로 나오면
아래와 같이 수정하면 되는건가요??
fGyro_X_Cal = -269.25;
fGyro_Y_Cal = 1.37;
fGyro_Z_Cal = -32.76;
답변 부탁드립니다!!
실데이터에 평균 반대 부호로 더해야 0점에 맞춰지겠죠. 쉽게 생각해 체중계에 아무 물건 없이 눈금을 읽었을때 2킬로를 가리키고 있고 실제 몸무게 재었을 때 73킬로 라면 실제 몸무게 몇인지 알려면 어떻게 할까요. 같은 원리이니 참고하세요
안녕하세요 항상 좋은 영상 감사합니다. 다름이 아니라 자이로 캘리브레이션을 하면 0 . 0 값이 아닌 2.몇 , 2.몇 이 뜨네요 몇번 반복해도 0 , 0은 안되는데 괜찮은걸까요? 그리고 제 조종기가 플라이 스카이 ia6b 모드2 모델이라 왼쪽 조이스틱 3채널 부분이 가운에 정렬이 되지가 않는데 코드를 해석해서 고치는 과정에서 모터 출력부분과 3채널 수신 받는 부분에 있어서 어려움이있네요.. 혹시 변수들이 무슨 역할하는지 알려주실수 있으실까요?
Roll과 pitch 각도를 수평에서 0이 아니면 오프셋 값 적용해 보정해 주시고 소스 코드의 세부 내용을 본인이 일일이 설명드리는데 어려움이 있네요.
왠만해서 다 해결했습니다.. 그런데 앞뒤는 괜찮은데 왼쪽으로 귀울면 오른쪽 프로펠라가 빨라지고 오른쩍은 그 반대입니다 혹시 어떤 부분이 문제일까요…
너무 많이 질문드려 죄송합니다.. 학교 기말시험으로 만들려했는데 쉽지않네요..
좌우 pwm 신호선만 바꾸시고 테스트 해 보시길 바래요. 테스트 시 디버깅 모드는 막고요.
넵 감사합니다
@@ilovealldiy1584 정말 마지막 질문입니다 조종기 쓰로틀을 움직일때 모터가 즉각적으로 반응하게하는 코드가 어떤건가요 쓰로틀을 최대로 올려도 속도가 천천히 올라갑니다
Moving Average 제거:
258번째 줄부터 267번째 줄까지의 코드를 주석 처리하고
248번째 줄의 nThrottleSpeed = nThrottleSpeed + 1;를 nThrottleSpeed = nMV_Throttle;로
255번째 줄의 nThrottleSpeed = nThrottleSpeed - 1;를 nThrottleSpeed = nMV_Throttle;로 변경했습니다. 혹시 이러면 문제가 없을까요?
배경음악이 커서 목소리가 잘 안들리네요
동영상 초반은 인트루 라서 음악이 들어가고 본 영상에서 다시 소개합니다 담 영상은 볼륨을 낮춰야 겠네요. 조언 캄사합니다
혹시 MPU_9250 센서만으로는 mPitch와 mRoll과 같이 mYaw값은 도출해낼 수 없나요?
Yaw같은 경우 오차 각도 값의 누적으로 지자계없인 조금씩 회전하는 것을 개선하긴 힘들겁니다. 본인 역시 이 문제를 해결하고자 했으나 해결책을 찾지 못했네요
자이로 캘리브레이션이 안되면 모터가 작동하지 않을수 있나요?
아니요 자이로 캘과 상관없습니다
영상 잘 보면서 자작하고 있는 학생입니다. 다름이아니라 이 영상에서 제공해주신 소스코드파일에서 조종기 스틱에 따라 모터출력이 달라지는 출력코드가 어디부분인지 알 수 있을까요?
코드 중 PWMC_SetDutyCycle(PWM, ESC_01, nMotorSpeed01);
PWMC_SetDutyCycle(PWM, ESC_02, nMotorSpeed02);
PWMC_SetDutyCycle(PWM, ESC_03, nMotorSpeed03);
PWMC_SetDutyCycle(PWM, ESC_04, nMotorSpeed04); 에서 모터 스피드 변수를 1500씩 변경하면 모터가 1500으로 회전됩니다. nMotorSpeed01 ~ nMotorSpeed04 변수 대신 1500. 테스트시 반드시 프롭은 끼우지말고 테스트 하세요
자이로 캘리브레이션에서 처음 영점을 잡을때 영상을 봐도 이해가 잘안되서 그러는데요.
소스코드에서 어떤것들을 수정해야 할지 모르겠습니다.
전에 자이로영상에서처럼 엑셀값으로 복사해와서 평균값구하고 어디에 빼고 극성은 어떻게 건들이고 하는지 모르겠습니다.
자이로 값이 이상적인 경우에 수평상태라면 x축 y축 z축 값이 모두 0 값이 나와야 합니다. 자이로는 잘 아시다시피 각속도 값이라 움직임이 없다면 각 축을 중심으로 회전하지 않는다면 0이 나와야겠지만 현실에서는 센서마다 조금씩 오차가있어 이 오차를 제거하기 위해 캘리브레이션을 합니다. 예를 들어 가만히 있는 상태에서 x축 값을 재어 보면 200 다시 재어보면 192, 다시 재어 보면 205 이런식으로 값이 일정 부분에서 왔다갔다 합니다. 그래서 몇배개를 모아 평균을 내어 보았더니 195값이 나오면 이값을 가지고 실제 출력되는 자이로 x값에서 빼어주면 거의0에서 왔다 갔다하게 되겠죠.. 즉, 영점이 조정된 것이라 볼 수 있습니다. 평균값을 오프셋 값으로 사용해야 좀더 합리적이니 평균값을 계산해서 빼어 주거나 더해서 영점을 조정합니다. 캘리브레이션 과정이 알고 보면 어려운 것이 아니니 잠깐 고민해보시면 이해가 될 거라 생각되네요.. 화이팅 입니다.
@@ilovealldiy1584 평균값 fGyro_X_Cal : 205.43 fGyro_Y_Cal : 139.47 fGyro_Z_Cal : 13.02으로 나왔는데 실제 출력되는 자이로값을 빼라고 하셨는데 실제 출력되는 자이로값이라는게 소스코드에서 어떤거를 말하는 건가요? 실제 출력되는 자이로값이라는게 정확이 어떤 건지 모르겠어요ㅠ
코드를 보시면 setup 함수 내 for문으로 자이로 값을 여러개 받는 부분 아래 하드코딩된 fGyro_X_Cal = 976.29 대신 구하신 205.43으로 변경해 주세요. 나머지 y, z축도 변경해 주시면 됩니다. 오프셋 계산은 알아서 해 주니 신경 안쓰셔도 됩니다. 참고로 507라인 정도에 오프셋 계산 부분이 코딩되어 있습니다. 화이팅 하세요!
첨부해주신 소스코드에 x,y,z 축을 저희꺼 평균값으로 대체해서 넣어주는것만 바꿨는데 mpitch = -54 정도 나오고 mroll 값은 -12정도 나와서 그러는데 이렇게 나올수도 있는 건가요? 아니면 이것이 0이 되기 위해서 16번 옵셋 코드를 건들여서 맞춰주는게 맞는건가요?
혹시 mpu9250이 고장난거 일까요? 뭐가 문제인지 모르겠어요 지금까지 영상 보면서 A2212/13T 1000KV 이고 변속기는 그냥 30A 아무거나 구매했고, 드론 틀은 f330이고 파워모듈 5V 이것들 빼고 다른 듀에나 mpu9250 그리고 x8r 타라니스 QX7 access 이렇게 입니다.베터리가 11.1V 입니다.
각도 오프셋 값 변경은 의미가 없고 자이로 적분했을 때 대략 각도가 0도에서 +- 2도 정도 틀어져 나와야 정상 입니다. 547라인의 0.9996 하고 0.0004 값을 주석처리 해 주시고 아래 0.98 0.02부분 주석 해제 후 각도를 체크해 보세요
영상 잘봤습니다! 선생님 궁금한게 imu 셋업 하실 때 0x6B가 뭐 하는 친구고 00을 넣던데 왜 넣는거죠?ㅠㅠ(데이터 시트상에 찾을 수가 없어서요..ㅠ) 가속도계랑 자이로계에 config를 하기 위태 0x1b와 c에 데이터를 쓰시는데 0x10, 0x08, 0x03을 넣으신 이유를 잘 모르겠습니다.. 데이터 찾기로도 해보는데 안나와서요..ㅠ
그리구 데이터 값 처리할 때 0.0000이거 왜 곱하는 건가요?? 다른 자료보면 바로 쓰기도 하던데 곱하는 이유가 궁금합니다! 자이로로 각도 만들려고 통신 속도에 대응하는 값을 넣으신건가요??
Mpu6050 register datasheet로 구글링하셔서 해당 데이터시트 문서를 보시면 답이 있습니다. 해당 문서 40페이지 보시면 0x6B주소는 파워 매니지먼트 레지스터로 디바이스 리셋, sleep상태 설정 등 디바이스 초기화와 관련된 레지스터라고 설명되어 있습니다. 이 주소에 00설정해서 초기화 시켜줍니다. 1B 주소는 자이로 설정 레지스터로 08값을 써주는데 데이터시트 문서 14페이지를 보시면 자이로 설정 Full Scale Range가 초당 500도로 설정되었다는 것을 알 수 있습니다. 나머지 주소도 문서를 보시면 알 수 있습니다. 도움이 되었으면 좋겠네요.
0.0000382 이 값을 곱하는 것은 주석을 보시고 이해하시면 됩니다. 자이로 스케일을 +/- 500이고 2바이트로 데이터를 표현하는데 표현할수 있는 범위가 -2의 16승 부터 +2의 16승 -1까지 가능합니다. 500도로 2의 16승을 나누면 1도는 65.536값을 가집니다. 이 기준은 1초에 1도 기준이고 만약 0.0025초(400hz) 처리한다면 0.0000382를 계산할 수 있습니다. 도움이 되길 바래요
@@ilovealldiy1584 설명 대박... 제가 원하던 내용 그대로 다 써주셨어요 정말 감사합니다ㅠㅠ 특히 첫번째 설명 다시 데이터 시트 여신거 같은데 정말 감사합니다..ㅠㅠ
영상 잘 보고 있습니다! 혹시 PID 소스 코드를 넣고 제 드론과 p,i,d 게인 값이 맞지 않는 다면 드론이 작동하지 않을 수 도 있나요?
모터는 도는데 안정적으로 제어가 되지 않겠네요. 결국 모터 회전을 자신의 기체에 맞도록 파라메터 값을 찾는것이 pid튜닝입니다.
@@ilovealldiy1584 감사합니다 그러면 제 상황은 소스코드 문제가 아닌 부품의 문제인것이 더 클까요?
하지만 모터 각각 켈리브레이션했을때는 잘 작동합니다 이 문제를 3일 동안 못 해결하고 있어서 너무 어려워요 ㅜ 소스 코드는 올려주신 파일 그대로 사용하였습니다
만약 pid 게인값을 모두 0으로 준다면 쓰로틀 값만 esc 신호로 사용되어 네개 모터가 동일 속도로 회전이 되는지 체크해 주세요. 이게 되지 않는다면 다른 문제가 있어 보입니다.
저도 같은 증상인데 혹시 해결 하셨나요?
영상 잘보고있습니다.
mpu9250센서를 통하여 spi연결을 하였으며 시리얼 모니터로 확인한 결과
Who Am I(0x70) = : 70
fGyro_X_Cal : -754.54 fGyro_Y_Cal : -545.18 fGyro_Z_Cal : -688.21
이렇게 나와서
343줄에있는 fGyro_X_Cal = 976.29 이 부분대신 -754.54 넣고 y,z축도 위와같이 바꾸었습니다.
코딩을 바꾸고 시리얼 모니터를 켰는데도 계속 fGyro_X_Cal : -754.54 fGyro_Y_Cal : -545.18 fGyro_Z_Cal : -688.21 와 같은 값이 나오는데 혹시 어떤 부분에서 문제가 있는지 알 수 있을까요?
동일한 값이 나오기 힘든데 이상하군요 spi 연결 선중 CS선이 52번 핀에 잘 연결되었는즈ㅣ 확인해 주시기 바랍니다 다른 선들도 연결이 잘 되었는지 확인해 주세요
넵 확인해 보겠습니다. 감사합니다. 이 작업을할때 mpu9250을쓰고 코드는 그대로 쓰더라도 상관은 없는거겠죠?