[드론] 펌웨어 분석 [2015.5.23]
-
Upload
chcbaram -
Category
Devices & Hardware
-
view
2.620 -
download
5
Transcript of [드론] 펌웨어 분석 [2015.5.23]
드론 오픈소스
MultiWii 홈페이지 : http://www.multiwii.com/
소스코드 : https://code.google.com/p/multiwii/
ArduPilot/APM 홈페이지 : http://ardupilot.com/
소스코드 : https://github.com/diydrones/ardupilot
AeroQuad 홈페이지 : http://aeroquad.com/
소스코드 : https://github.com/AeroQuad/AeroQuad/
PX4 홈페이지 : https://pixhawk.org
소스코드 : https://github.com/PX4/Firmware
Crazyfile 홈페이지 : https://www.bitcraze.io
소스코드 : https://github.com/bitcraze
3/30
드론 프로젝트
Flexbot • AVR/멀티위 기반으로 기체는 3D프린팅으로 제작하여 스마트폰으로 블루투스통한 조정기능 제공
• SkyRover Nano V1.0의 기본 컨셉 모델
4/30
드론 프로젝트 Crazyfile 2.0
• STM32F405의 빠른 MCU사용하고 소형 쿼드콥터에 최적화된 독자 펌웨어 사용
• NRF51822 RF+블루투스 통합칩을 사용하여 RF통신과 스마트폰을 통한 블루투스 제어 동시 지원
• RF통신을 사용하여 PS3/4 리모트 조종기를 지원
• 확장 포트를 통해서 다양한 주변장치 추가 가능
• SkyRover Nano V2.0의 기본 컨셉 모델
5/30
드론 프로젝트
ERLE-COPTER • Beaglebone black 보드에 리눅스 커널 패치 및 Ardupilot/APM 적용
• ROS 지원
• Linux 베이스의 App을 통한 기능 추가 및 변경
6/30
드론 프로젝트
Phenox2 • Xilinx의 ARM+FPGA구성의 SOC인 Zynq를 사용
• ARM 듀얼코어 중 1개는 Linux사용하고, 나머지 1개는 Realtime 제어용으로 사용
• FPGA를 활용하여 하드웨어 구성이 용이하고, Linux를 통한 고급 기능 추가 가능
7/30
드론 프로젝트
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
드론 프로젝트
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
드론 펌웨어 구조
왜 드론 펌웨어를 분석하는가?
1. 궁금해서.. 2. 드론이 어떻게 움직이는지 알고 싶다. 3. 드론에 새로운 기능을 넣고 싶다.
4. 드론 프로그래밍을 하고 싶다.
5. 졸업 프로젝트..
6. 기타..
12/30
드론 펌웨어 구조 - V1.0
SkyRover Nano V1.0 호출 구조 • FreeRTOS를 사용
• 기존의 멀티위 제어 함수를 하나의 스레드로 구현하고 menu/lcd등 추가 스레드로 기능 추가
main()
thread_main()
thread_mw()
thread_menu()
thread_lcd()
- 멀티위 제어 기능 수행
- USB를 통한 메뉴 기능 수행
- I2C방식의 LCD 출력 기능 수행
14/30
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - V2.0 NRF51822
• RF 2.4Ghz통신과 블루투스 BLE 지원 • Cortex-M0 MCU를 내장하고 다양한 주변장치로 구성됨 • 프로그래밍을 통하여 다양한 기능 추가/변경 가능 • 블루투스는 소프트웨어 스택으로 제공
17/30
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - V2.0
STM32F405 메모리 맵 • 부트로더/펌웨어로 구성
• 부트로더를 통해서 펌웨어 다운로드 가능
0x80000000
16KB
1008KB
0x80100000
펌웨어
1024KB
부트로더
0x80004000
19/30
드론 펌웨어 구조 - V2.0
부팅 순서 • NRF51822가 전원 관리 및 부팅순서를 제어함
펌웨어
STM32F405
부트로더 MBR
부트로더
Softdevice (BLE지원)
펌웨어
MBS
NRF51822
시작
Reset
20/30
드론 펌웨어 구조 - V2.0
호출 구조
main()
platformInit()
systemLaunch()
systemTask()
ledInit() uartInit() systemInit() commInit() commanderInit() stabilizerInit() expbrdInit() memInit()
pass &= systemTest() pass &= commTest() pass &= stabilizerTest()
초기화
기능 테스트
workerLoop() 작업 스레드
21/30
드론 펌웨어 구조 - V2.0
스레드 구성 • 기능별 스레드로 구성하고 IPC를 통해 스레드간 동기화 및 데이터 전달
adcTask()
crtpTxTask() crtpRxTask()
systemTask()
easylinkTask()
infoTask()
logTask()
memTask()
paramTask()
pidCrtlTask()
pmTask() stabilizerTask()
syslinkTask()
usblinkTask()
센서/제어 시스템 관리 정보
Queue Semaphore
Mutex
22/30
통신
드론 펌웨어 구조 - V2.0
통신 • 기본 통신방식은 CRTP(CrazyRealtimeTransferProtocol)을 사용하고 CRTP 패킷을 UART/USB로 송/수신
STM32F405
NRF51822
(Cortex-M0)
syslinkTask()
crtpTxTask() crtpRxTask()
PC
usblinkTask()
23/30
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - 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
드론 펌웨어 구조 - 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