SlideShare a Scribd company logo
1 of 30
Download to read offline
드론 펌웨어 분석
조한철(Baram)
2015. 5. 23.
목차
 드론 오픈소스
 드론 프로젝트
 드론 펌웨어 구조
2/30
드론 오픈소스
 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. 커뮤니티 활성화
국내는?
10/30
드론 프로젝트
11/30
드론 펌웨어 구조
왜 드론 펌웨어를 분석하는가?
1. 궁금해서..
2. 드론이 어떻게 움직이는지 알고 싶다.
3. 드론에 새로운 기능을 넣고 싶다.
4. 드론 프로그래밍을 하고 싶다.
5. 졸업 프로젝트..
6. 기타..
12/30
드론 펌웨어 구조
컴퓨터공학
제어공학
메카트로닉스
인공지능
드론
드론은 다양한 기술들의 결합물
13/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
 로그
• 로그 항목은 PC 클라이언트에서 실시간으로 값을 보거나 파일로 저장이 가능
실시간 모니터링 로그 파일로 저장
27/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
감사합니다.
30/30

More Related Content

What's hot

LCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted FirmwareLCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted FirmwareLinaro
 
The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421Linaro
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device driversHoucheng Lin
 
Tegra 186のu-boot & Linux
Tegra 186のu-boot & LinuxTegra 186のu-boot & Linux
Tegra 186のu-boot & LinuxMr. Vengineer
 
Introduction to Linux
Introduction to LinuxIntroduction to Linux
Introduction to Linuxsureskal
 
linux device driver
linux device driverlinux device driver
linux device driverRahul Batra
 
HKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting ReviewHKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting ReviewLinaro
 
Programming Embedded linux
Programming Embedded linuxProgramming Embedded linux
Programming Embedded linuxLiran Ben Haim
 
Uboot startup sequence
Uboot startup sequenceUboot startup sequence
Uboot startup sequenceHoucheng Lin
 
Linux Kernel Module - For NLKB
Linux Kernel Module - For NLKBLinux Kernel Module - For NLKB
Linux Kernel Module - For NLKBshimosawa
 
Linux Initialization Process (1)
Linux Initialization Process (1)Linux Initialization Process (1)
Linux Initialization Process (1)shimosawa
 
OpenWRT manual
OpenWRT manualOpenWRT manual
OpenWRT manualfosk
 
LCU14 500 ARM Trusted Firmware
LCU14 500 ARM Trusted FirmwareLCU14 500 ARM Trusted Firmware
LCU14 500 ARM Trusted FirmwareLinaro
 
Linux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBLinux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBshimosawa
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot) Omkar Rane
 
Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)Thomas Petazzoni
 

What's hot (20)

LCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted FirmwareLCU13: An Introduction to ARM Trusted Firmware
LCU13: An Introduction to ARM Trusted Firmware
 
The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421The Linux Kernel Scheduler (For Beginners) - SFO17-421
The Linux Kernel Scheduler (For Beginners) - SFO17-421
 
Arm device tree and linux device drivers
Arm device tree and linux device driversArm device tree and linux device drivers
Arm device tree and linux device drivers
 
Tegra 186のu-boot & Linux
Tegra 186のu-boot & LinuxTegra 186のu-boot & Linux
Tegra 186のu-boot & Linux
 
Introduction to Linux
Introduction to LinuxIntroduction to Linux
Introduction to Linux
 
Timer
TimerTimer
Timer
 
linux device driver
linux device driverlinux device driver
linux device driver
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOS
 
Making Linux do Hard Real-time
Making Linux do Hard Real-timeMaking Linux do Hard Real-time
Making Linux do Hard Real-time
 
HKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting ReviewHKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting Review
 
Programming Embedded linux
Programming Embedded linuxProgramming Embedded linux
Programming Embedded linux
 
Uboot startup sequence
Uboot startup sequenceUboot startup sequence
Uboot startup sequence
 
Linux Kernel Module - For NLKB
Linux Kernel Module - For NLKBLinux Kernel Module - For NLKB
Linux Kernel Module - For NLKB
 
Linux Initialization Process (1)
Linux Initialization Process (1)Linux Initialization Process (1)
Linux Initialization Process (1)
 
OpenWRT manual
OpenWRT manualOpenWRT manual
OpenWRT manual
 
LCU14 500 ARM Trusted Firmware
LCU14 500 ARM Trusted FirmwareLCU14 500 ARM Trusted Firmware
LCU14 500 ARM Trusted Firmware
 
Linux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBLinux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKB
 
Embedded Linux Kernel - Build your custom kernel
Embedded Linux Kernel - Build your custom kernelEmbedded Linux Kernel - Build your custom kernel
Embedded Linux Kernel - Build your custom kernel
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot)
 
Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)Device Tree for Dummies (ELC 2014)
Device Tree for Dummies (ELC 2014)
 

Similar to [드론] 펌웨어 분석 [2015.5.23]

컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.chcbaram
 
오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개SungTae Moon
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmwarechcbaram
 
Cortex M3에서 Wi-Fi 사용하기
Cortex M3에서 Wi-Fi 사용하기Cortex M3에서 Wi-Fi 사용하기
Cortex M3에서 Wi-Fi 사용하기동은 곽
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS충섭 김
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Steve Shim
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD활 김
 
도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집Daegwon Kim
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324종인 전
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9종인 전
 
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신WooSangHwang
 
Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)wonyong hwang
 

Similar to [드론] 펌웨어 분석 [2015.5.23] (20)

컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
 
오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개오픈소스 기반 비행제어컴퓨터 PX4 소개
오픈소스 기반 비행제어컴퓨터 PX4 소개
 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmware
 
Cortex M3에서 Wi-Fi 사용하기
Cortex M3에서 Wi-Fi 사용하기Cortex M3에서 Wi-Fi 사용하기
Cortex M3에서 Wi-Fi 사용하기
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1
 
Maker 오해와 진실
Maker 오해와 진실Maker 오해와 진실
Maker 오해와 진실
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD
 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
 
도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9
 
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
 
Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)
 

[드론] 펌웨어 분석 [2015.5.23]

  • 2. 목차  드론 오픈소스  드론 프로젝트  드론 펌웨어 구조 2/30
  • 3. 드론 오픈소스  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
  • 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
  • 12. 드론 펌웨어 구조 왜 드론 펌웨어를 분석하는가? 1. 궁금해서.. 2. 드론이 어떻게 움직이는지 알고 싶다. 3. 드론에 새로운 기능을 넣고 싶다. 4. 드론 프로그래밍을 하고 싶다. 5. 졸업 프로젝트.. 6. 기타.. 12/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