4. 드론 프로젝트
Flexbot
• AVR/멀티위 기반으로 기체는 3D프린팅으로 제작하여 스마트폰으로 블루투스통한 조정기능 제공
• SkyRover Nano V1.0의 기본 컨셉 모델
4/30
5. 드론 프로젝트
Crazyfile 2.0
• STM32F405의 빠른 MCU사용하고 소형 쿼드콥터에 최적화된 독자 펌웨어 사용
• NRF51822 RF+블루투스 통합칩을 사용하여 RF통신과 스마트폰을 통한 블루투스 제어 동시 지원
• RF통신을 사용하여 PS3/4 리모트 조종기를 지원
• 확장 포트를 통해서 다양한 주변장치 추가 가능
• SkyRover Nano V2.0의 기본 컨셉 모델
5/30
6. 드론 프로젝트
ERLE-COPTER
• Beaglebone black 보드에 리눅스 커널 패치 및 Ardupilot/APM 적용
• ROS 지원
• Linux 베이스의 App을 통한 기능 추가 및 변경
6/30
7. 드론 프로젝트
Phenox2
• Xilinx의 ARM+FPGA구성의 SOC인 Zynq를 사용
• ARM 듀얼코어 중 1개는 Linux사용하고, 나머지 1개는 Realtime 제어용으로 사용
• FPGA를 활용하여 하드웨어 구성이 용이하고, Linux를 통한 고급 기능 추가 가능
7/30
8. 드론 프로젝트
SkyRover Nano V1.0
• Multiwii를 STM32로 포팅한 Afroflight32 펌웨어 기반
• Flexbot 프로젝트에서 사용한 App의 프로토콜 적용으로 스마트폰으로 조정
• FreeRTOS적용하여 기능 추가
Multiwii 2.3
Arduino
AVR
SkyRover
Nano
+
Flexbot 통신
I/F
Afroflight32
GCC
STM32F103 부트로더 추가
+ +
FreeRTOS 적용
USB 통신
+
LCD Lib
(u8glib)
+
8/30
9. 드론 프로젝트
SkyRover Nano V2.0
• H/W, F/W는 Crazyfile 2.0에 기반
• Flexbot 통신 I/F를 추가하여 기존 SkyRover App에서도 동작하도록 변경
• 향후 SkyRover 1.0펌웨어를 포팅하여 Multiwii 기반으로도 테스트 가능하도록 변경 예정
SkyRover Nano V2.0+
Flexbot 통신
I/F
Crazyfile 2.0
+
V2.0 보드에 포팅
SkyRover 1.0 SkyRover Nano V2.2
9/30
10. 드론 프로젝트
1. 드론 오픈소스 프로젝트 증가
2. 추구하는 방향성도 다양함
3. 성능/기능 발전
4. 커뮤니티 활성화
국내는?
10/30
14. 드론 펌웨어 구조 - V1.0
SkyRover Nano V1.0 호출 구조
• FreeRTOS를 사용
• 기존의 멀티위 제어 함수를 하나의 스레드로 구현하고 menu/lcd등 추가 스레드로 기능 추가
main()
thread_main()
thread_mw()
thread_menu()
thread_lcd()
- 멀티위 제어 기능 수행
- USB를 통한 메뉴 기능 수행
- I2C방식의 LCD 출력 기능 수행
14/30
15. 드론 펌웨어 구조 - V1.0
SkyRover Nano V1.0 제어구조
• Multiwii 스레드에서 하나의 loop함수에 기능 구현
hexairbotFrameComplete()
computeRC()
• 블루투스로 조종 데이터가 수신되었는지 검사
• 수신된 조종값(롤,피치,요,스로틀,AUX1,AUX2,AUX3,AUX4)을 rcData[] 배열에 저장50Hz
computeIMU() • 가속도/자이로/지자계 센서로 부터 자세값 계산
annexCode() • 수신된 조종값 rcData[]의 범위는 1000~2000이며(중립은 1500), 제어범위 값
rcCommand[]에 0~500 값으로 변환
pid_controller()
mixTable()
writeServos()
writeMotors()
• rcCommnad[]값을 기준으로 PID제어에 따른 제어량값 계산
• 기체 종류에 따라 PID제어를 통해 나온 제어량은 모터 PWM으로 변환
• PWM값에 따른 모터 구동
280Hz
15/30
16. 드론 펌웨어 구조 - V2.0
SkyRover Nano V2.0 시스템 구성
• NRF51822 RF/블루투스 통합칩을 사용하여 RF/BLE 동시 지원
• NRF51822칩과는 UART로 시리얼통신
• PC와는 USB 통신
• Main 프로세서로 STM32F405사용
STM32F405
NRF51822
(Cortex-M0)
UART
RF통신 블루투스 4.0 BLE
PC
USB
I2C
UART
SPI
MPU9250
(IMU)
LPS25H
I2C
16/30
17. 드론 펌웨어 구조 - V2.0
NRF51822
• RF 2.4Ghz통신과 블루투스 BLE 지원
• Cortex-M0 MCU를 내장하고 다양한 주변장치로 구성됨
• 프로그래밍을 통하여 다양한 기능 추가/변경 가능
• 블루투스는 소프트웨어 스택으로 제공
17/30
18. 드론 펌웨어 구조 - V2.0
NRF51822 메모리 맵
• 펌웨어는 MBS/부트로더/펌웨어/Softdevice 4개로 구성됨
• 부트순서 : MBR -> MBS -> 부트로더 -> 펌웨어
MBR
0x00000000
0x00016000
부트로더
88KB
23KB
4KB
0x0001F000
0x00020000
Softdevice
(BLE지원)
펌웨어
MBS
13KB
0x0001BC00
128KB
전원 버튼관리 및 부트로더/펌웨어 실행 분기
STM32F405부트로더 실행 및 통신데이터 송/수신
통신 기능
전원관리
확장보드 메모리 관리
블루투스 BLE 스택
18/30
19. 드론 펌웨어 구조 - V2.0
STM32F405 메모리 맵
• 부트로더/펌웨어로 구성
• 부트로더를 통해서 펌웨어 다운로드 가능
0x80000000
16KB
1008KB
0x80100000
펌웨어
1024KB
부트로더
0x80004000
19/30
20. 드론 펌웨어 구조 - V2.0
부팅 순서
• NRF51822가 전원 관리 및 부팅순서를 제어함
펌웨어
STM32F405
부트로더
MBR
부트로더
Softdevice
(BLE지원)
펌웨어
MBS
NRF51822
시작
Reset
20/30
21. 드론 펌웨어 구조 - V2.0
호출 구조
main()
platformInit()
systemLaunch()
systemTask()
ledInit()
uartInit()
systemInit()
commInit()
commanderInit()
stabilizerInit()
expbrdInit()
memInit()
pass &= systemTest()
pass &= commTest()
pass &= stabilizerTest()
초기화
기능 테스트
workerLoop() 작업 스레드
21/30
22. 드론 펌웨어 구조 - V2.0
스레드 구성
• 기능별 스레드로 구성하고 IPC를 통해 스레드간 동기화 및 데이터 전달
adcTask()
crtpTxTask()
crtpRxTask()
systemTask()
easylinkTask()
infoTask()
logTask()
memTask()
paramTask()
pidCrtlTask()
pmTask() stabilizerTask()
syslinkTask()
usblinkTask()
센서/제어시스템 관리정보
Queue
Semaphore
Mutex
22/30
통신
23. 드론 펌웨어 구조 - V2.0
통신
• 기본 통신방식은 CRTP(CrazyRealtimeTransferProtocol)을 사용하고 CRTP 패킷을 UART/USB로 송/수신
STM32F405
NRF51822
(Cortex-M0)
syslinkTask()
crtpTxTask()
crtpRxTask()
PC
usblinkTask()
23/30
24. 드론 펌웨어 구조 - V2.0
제어 스레드
• stabilizerTask()
• MPU9250 IMU센서에서 데이터 읽기imu9Read(&gyro, &acc, &mag)
commanderGetRPY()
500Hz
sensfusion6UpdateQ()
sensfusion6GetEulerRPY()
sensfusion6GetAccZWithoutGravity()
controllerCorrectAttitudePID()
250Hz
distributePower()500Hz
• RF/BLE로 부터 Roll/Pitch/Yaw/스로틀 값 읽기
• IMU센서로 부터 Roll/Pitch/Yaw 자세값 계산
• 목표자세값과 현재 자세값과의 차이를 PID 제어량값 계산
• PID제어량으로 부터 계산된값으로 모터 출력 변경
24/30
25. 드론 펌웨어 구조 - V2.0
파라메터
• PARAM_GROUP_START/PARAM_GROUP_STOP으로 그룹 지정
• PARAM_ADD로 파라메터 항목 추가
• 두개의 매크로를 사용하여 하나의 구조체를 생성하고 생성된 구조체를 참조
• 파라메터 그룹을 추가하면 PC 클라이언트 프로그램에 표시가 되고 값 수정이 가능
PARAM_GROUP_START(ring)
PARAM_ADD(PARAM_UINT8, effect, &effect)
PARAM_ADD(PARAM_UINT32 | PARAM_RONLY, neffect, &neffect)
PARAM_ADD(PARAM_UINT8, solidRed, &solidRed)
PARAM_ADD(PARAM_UINT8, solidGreen, &solidGreen)
PARAM_ADD(PARAM_UINT8, solidBlue, &solidBlue)
PARAM_ADD(PARAM_UINT8, headlightEnable, &headlightEnable)
PARAM_ADD(PARAM_FLOAT, glowstep, &glowstep)
PARAM_ADD(PARAM_FLOAT, emptyCharge, &emptyCharge)
PARAM_ADD(PARAM_FLOAT, fullCharge, &fullCharge)
PARAM_GROUP_STOP(ring)
25/30
26. 드론 펌웨어 구조 - V2.0
로그
• LOG_GROUP_START/LOG_GROUP_STOP으로 그룹 지정
• LOG_ADD로 파라메터 항목 추가
LOG_GROUP_START(mag_raw)
LOG_ADD(LOG_INT16, x, &mag.x)
LOG_ADD(LOG_INT16, y, &mag.y)
LOG_ADD(LOG_INT16, z, &mag.z)
LOG_GROUP_STOP(mag_raw)
26/30
27. 드론 펌웨어 구조 - V2.0
로그
• 로그 항목은 PC 클라이언트에서 실시간으로 값을 보거나 파일로 저장이 가능
실시간 모니터링 로그 파일로 저장
27/30
28. 드론 펌웨어 구조 - V2.0
조종 방법
블루투스 4.0 BLE스마트폰
• 스마트폰 터치 + 블루투스 통신
블루투스 4.0 BLE스마트폰
• 스마트폰 + OTG + PS4 리모트 컨트롤러
PS4
컨트롤러
OTG
RF스마트폰
• 스마트폰 + OTG + USB RF + PS4 리모트 컨트롤러
PS4
컨트롤러
OTG
USB RF
RF
PC
• PC + USB RF + PS4 리모트 컨트롤러
PS4
컨트롤러
USB
USB RF
OTG
RF
PC
• PC + USB RF + Open API(파이썬/C++) + 자동조종
USB RF
28/30
29. 드론 펌웨어 구조 - V2.0
응용
• OpenCV와 카메라를 이용한 호버링
• https://youtu.be/gsH1JjfWzX0
• 사운드를 활용한 댄싱
• https://youtu.be/kZfJgUAIzUo
• Crazyfile Hover Control using SLAM
• https://youtu.be/PYuhrNMYlfk
• Crazyfile Position Control
• https://youtu.be/kC0z7a7aisg
• Flying the Crazyfile with Leap Motion
• https://youtu.be/xdm1qp1BYyo
29/30