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

30
드론 펌웨어 분석 조한철(Baram) 2015. 5. 23.

Upload: chcbaram

Post on 07-Aug-2015

2.620 views

Category:

Devices & Hardware


5 download

TRANSCRIPT

드론 펌웨어 분석

조한철(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