교외활동/공모전

바이로봇 패트론 (전기학회 미니드론 자율비행 경진대회) (Byrobot petrone) 후기 및 피드백 (2)

cchucchu 2018. 5. 15. 18:30
반응형

이어서 코드값 뒤의 헥사값에 대한 알아낸 분석 결과입니다.


DataType

이름

정보

None

0x00

 

Ping

0x01

통신확인(reserve)

Ack

0x02

데이터 수신에 대한 응답

Error

0x03

오류(reserve, 비트 플래그는 추후에 지정)

Request

0x04

지정한 타입의 데이터 요청

Passcode

0x05

새로운 페어링 비밀 번호

Control

0x10

조종

Command

0x11

명령

Command2

0x12

다중 명령(2가지 설정을 동시에 변경)

Command3

0x13

다중 명령(3가지 설정을 동시에 변경)

LedMode

0x20

LED 모드 지정

LedMode2

0x21

LED 모드 2개 지정

LedModeCommand

0x22

LED 모드, 커맨드

LedModeCommandIr

0x23

LED 모드, 커맨드, IR 데이터 송신

LedModeColor

0x24

LED 모드 3색 직접 지정

LedModeColor2

0x25

LED 모드 3색 직접 지정 2

LedEvent

0x26

LED 이벤트

LedEvent2

0x27

LED 이벤트 2

LedEventCommand

0x28

LED 이벤트, 커맨드

LedEventCommandIr

0x29

LED 이벤트, 커맨드, IR 데이터 송신

LedEventColor

0x2A

LED 이벤트 3색 직접 지정

LedEventColor2

0x2B

LED 이벤트 3색 직접 지정 2

LedModeDefaultColor

0x2C

LED 초기 모드 3색 직접 지정

LedModeDefaultColor2

0x2D

LED 초기 모드 3색 직접 지정 2

Address

0x30

IEEE address

State

0x31

드론의 상태(비행 모드, 방위기준, 배터리량)

Attitude

0x32

드론의 자세

GyroBias

0x33

자이로 바이어스 값

TrimAll

0x34

전체 트림

TrimFlight

0x35

비행 트림

TrimDrive

0x36

주행 트림

IrMessage

0x40

IR 데이터 송수신

 

 

 

CommandType

None

0x00

이벤트 없음

ModePetrone

0x10

페트론 동작 모드 전환

Coordinate

0x20

방위 기준 변경

Trim

0x21

트림 변경

FlightEvent

0x22

비행 이벤트 실행

DriveEvent

0x23

주행 이벤트 실행

Stop

0x24

정지

ResetHeading

0x50

방향을 리셋(앱솔루트 모드 일 때 현재 heading0도로 변경)

ClearGyroBiasAndTrim

0x51

자이로 바이어스와 트림 설정 초기화

PairingActivate

0x80

페어링 활성화

PairingDeactivate

0x81

페어링 비활성화

TerminateConnection

0x82

연결 종료

Request

0x90

지정한 타입의 데이터 요청

 

 

 

ModePetrone

None

0x00

 

Flight

0x10

비행 모드(가드 포함)

FlightNoGuard

0x11

비행 모드(가드 없음)

FlightFPV

0x12

비행 모드(FPV)

Drive

0x20

주행 모드

DriveFPV

0x21

주행 모드(FPV)

Test

0x30

테스트 모드

Coordinate

None

0x00

 

Absolute

0x01

고정 좌표계

Relative

0x02

상대 좌표계

 

 

 

Trim

None

0x00

 

RollIncrease

0x01

Roll 증가

RollDecrease

0x02

Roll 감소

PitchIncrease

0x03

Pitch 증가

PitchDecrease

0x04

Pitch 감소

YawIncrease

0x05

Yaw 증가

YawDecrease

0x06

Yaw 감소

ThrottleIncrease

0x07

Throttle 증가

ThrottleDecrease

0x08

Throttle 감소

 

 

 

FlightEvent

None

0x00

 

TakeOff

0x01

이륙

FlipFront

0x02

회전

FlipRear

0x03

회전

FlipLeft

0x04

회전

FlipRight

0x05

회전

Stop

0x06

정지

Landing

0x07

착륙

Reverse

0x08

뒤집기

Shot

0x09

미사일을 쏠 때 움직임

UnderAttack

0x0A

미사일을 맞을 때 움직임

Square

0x0B

정방향 돌기

CircleLeft

0x0C

왼쪽으로 회전

CircleRight

0x0D

오른쪽으로 회전

Rotate180

0x0E

180도 회전

 

 

 

Request

Address

0x30

IEEE address

State

0x31

드론의 상태(비행 모드, 방위기준, 배터리량)

Attitude

0x32

드론의 자세(Vector)

GyroBias

0x33

자이로 바이어스 값(Vector)

TrimAll

0x34

전체 트림

TrimFlight

0x35

비행 트림

TrimDrive

0x36

주행 트림

 

 

 

LEDMode

None

0x00

 

EyeNone

0x10

 

EyeHold

0x11

지정한 색상을 계속 켬

EyeMix

0x12

순차적으로 LED 색 변경

EyeFlicker

0x13

깜빡임

EyeFlickerDouble

0x14

깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)

EyeDimming

0x15

밝기 제어하여 천천히 깜빡임

ArmNone

0x40

 

ArmHold

0x41

지정한 색상을 계속 켬

ArmMix

0x42

순차적으로 LED 색 변경

ArmFlicker

0x43

깜빡임

ArmFlickerDouble

0x44

깜빡임(두 번 깜빡이고 깜빡인 시간만큼 꺼짐)

ArmDimming

0x45

밝기 제어하여 천천히 깜빡임

ArmFlow

0x46

앞에서 뒤로 흐름

ArmFlowReverse

0x47

뒤에서 앞으로 흐름

Colors(0~141 == 0x00~0x8D)

ModeFlight

None

0x00

 

Ready

0x01

비행 준비

TakeOff

0x02

이륙 (Flight로 자동전환)

Flight

0x03

비행

Flip

0x04

회전

Stop

0x05

강제 정지

Landing

0x06

착륙

Reverse

0x07

뒤집기

Accident

0x08

사고 (Ready로 자동전환)

Error

0x09

오류

 

 

 

ModeDrive

None

0x00

 

Ready

0x01

준비

Start

0x02

출발

Drive

0x03

주행Stop, 강제 정지

Accident

0x04

사고 (Ready로 자동전환)

Error

0x05

오류

 

 

 

SensorOrientation

None

0x00

 

Normal

0x01

정상

ReverseStart

0x02

뒤집히기 시작

Reverse

0x03

뒤집힘


이 값은 제가 아닌 팀원이 자료조사를 하면서 알아낸 값입니다.


아래 자료도 팀원이 C#에 대한 기본 명령어를 정리해둔 목록입니다. (위 아래 자료 모두 동의하에 포스팅


한 자료입니다.)


C# 명령어

 

* F2 : 파일 이름 변경

* F6 : 컴파일 수행

* Window+R : 실행 창 띄우기

cmd를 입력하여 명령 프롬프트 창 출력

 

using System;

 

* using : C#의 키워드(C#의 규격에 미리 정의되어 있는 특별한 단어) 중 하나

그 다음에 따라오는 System을 사용하겠다는 뜻

* System : 데이터를 다룰 수 있는 기본적인 데이터 처리 클래스를 비롯한 C# 코드가 기본적으로 필요로 하는

클래스 담고 있는 네임스페이스

* 세미콜론(;) : 컴파일러에게 문장의 끝을 알리는 기호

 

네임 스페이스

성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 델리게이트, 열거 형식 등을 하나의 이름 아래 묶는 일을 수행

 

namespace 네임스페이스_이름

{

// 클래스, 구조체, 인터페이스 등...

}

 

* namespace BrainCSharp : BrainCSharp이라는 네임스페이스를 만들고 괄호 { }BrainCSharp 네임스페이스에

HelloWorld 클래스를 담는다.

 

class HelloWorld { }

HelloWorld라는 이름의 클래스를 만든다.

 

* class : C#을 구성하는 기본 단위로 데이터와 데이터를 처리하는 기능(메소드)으로 이루어진다.

C#프로그램은 최소한 하나 이상의 클래스로 이루어진다.

 

주석(Comment)

소스 안에 기록하는 메모로 컴파일할 때 주석을 만나면 무시하고 지나간다.

//은 한줄로 끝나는 주석을 입력할 때 사용하고 /**/는 사이를 주석으로 처리한다.

 

static void Main(string[] args) { }

특별한 메소드로 프로그램의 진입점으서 프로그램을 시작하면 실행되고 이 메소드가 종료되면 프로그램도

종료된다.

따라서 모든 프로그램은 반드시 Main이라는 이름을 가진 메소드를 하나 가지고 있어야 한다.

Main() 메소드가 static 키워드로 수식되어 있지 않으면 CLR은 진입점을 찾지 못했다는 에러를 남긴다.

 

* static : 한정자(다른 요소들을 꾸며주는 역할을 하는 성분)로서 메소드나 변수 등을 수식한다.

static 키워드로 수식되는 코드는 프로그램이 처음 구동될 때 메모리에 할당된다.

* void : 메소드의 반환 형식으로 어떤 결과도 돌려주지 않을 것이라는 것을 컴파일러에게 알려주는 기능

* Main : 메소드 이름

string[] args : 매개 변수로 Main() 메소드의 매개 변수는 프로그램을 실행할 때 입력하는 매개변수가 입력.

* { } : 코드 블록으로 메소드의 실행할 세부 코드를 담는다.

CLR

C#으로 만든 프로그램이 실행되는 환경으로 각 언어로 작성된 프로그램의 실행뿐 아니라 서로 다른 언어로 작성 된 언어 사이의 호환성을 제공하기도 한다.

C# 프로그램을 실행해주는 또 다른 프로그램

IL 언어로 쓰여진 코드를 CLR이 다시 자신이 설치된 플랫폼에 최적화시켜 컴파일한 후 실행.

CLR은 환경 기능 외에 프로그램의 오류가 발생했을 때 처리하도록 도와주는 기능, 언어간의 상속 지원, COM과의

상호 운영성 지원, 자동 메모리 관리 등의 기능을 제공한다.

 

* 적시 컴파일(JIT 컴파일) : 파일을 실행시키면 CLR이 중간 코드를 읽어 들여 다시 OS가 이해할 수 있는 네이티브 코드로 컴파일한 후 실행시키는 것.

실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행한다는 뜻.

* IL(중간 언어) : 서로 다른 언어들이 만나기 위한 지점

* 가비지 컬렉셜 : 자동 메모리 관리로 프로그램에서 더 이상 사용하지 않는 메모리를 쓰레기로 간주하고 수거하는

기능.


또 드론을 제어하기 위해 가장 기초적으로 알아야할


row(기체를 정면에서 봤을때 날개 부분이 시계, 반시계 방향으로 회전하는 각도의 정도), 


pitch기체를 수평에서 보았을때 앞으로 기울어지거나, 뒤로기울어지는 정도), 


yaw(기체를 중심으로 시계, 반시계 방향으로 변하는 각도), 


throttle(기체의 높이)

비행기 모형에서 보면 위와 같은 값들이 row, pitch, yaw라는 것을 확인할 수 있습니다.


또 호버링 상태를 유지하기 위해서는 PID제어, 상보필터에 대한 개념을 알고 있어야 됩니다.


PID제어의 사전적인 의미는


. pid제어

제어 변수와 기준 입력 사이의 오차에 근거하여 계통의 출력이 기준 전압을 유지하도록 하는 피드백 제어의 일종으로, 비례(Proportional) 제어와 비례 적분(Proportional-Integral) 제어, 비례 미분(Proportional-Derivative) 제어를 조합한 것. P 제어(비례)는 기준 신호와 현재 신호 사이의 오차 신호에 적당한 비례 상수 이득을 곱해서 제어 신호를 만든다.


[요약] 기존의 ON, OFF 제어 방식과 달리 비례(P: Proportional), 적분(I: (Proportional) Integral), 미분(D: (Proportional) Derivative)을 조합하여 제어하는 방식


즉, 원하는 값에 도달하기 위한 기초적인 자동 피드백 제어 방법 중 하나입니다. 출력 값과 설정 값과의


오차를 이용하여 제어 값을 계산해내는 방식입니다.


PID 제어


 목표로한 물리량을 자연스럽게 수렴시키는 제어 방법으로 자율주행 차량, 로봇, 센서값 보정 등에

필수적인 함수

  목표값과 현재값의 차이인 에러값을 줄여주는 방향으로 현재값을 보정하며, 에러값은 PID값으로

변환된 후 현재값을 보정하는 데 사용한다.


 P제어

 proportinal 비례항

 현재 제어값이 오차에 비례하여 제어량을 변화시키는 방법

오차에 따라 출력이 출력을 바꾼다.

 장점 : 편차는 점점 줄어든다.

 단점 : 오차가 0이 되지 않고 근사값에 가까워지면서 진동도 발생한다.


 I제어

 integral 적분항

 일정한 상태로 유지되는 오차를 없애는 작용

 장점 : 오차가 클 경우 적분항에 의해 시간이 지나면 오차의 합이 쌓여 출력은 빠르게 변해 오차를 제거하기 때문에 P제어의 단점을 보완하기에 적합하다.


 D제어

 differential 미분항

 오차 변화율을 계산하고 그 결과를 출력에 더한다.

 미분항은 시스템의 진동을 최소화 시키기 위해 오차 변화율을 계산하고 그 값을 출력에 더해준다.

 오차의 변화에 따라 미분값도 변화한다.


 이 값들의 합으로 보정값을 수렴한다.


 PID는 목표하는 위치, 속도, 방향, 온도 등 센서값과 같은 물리량을 기계적으로 자동 제어하는

데 필수적인 알고리즘.


 PID 제어는 아날로그량(연속)을 제어하는 것이 기본이나 컴퓨터의 프로그램으로는 연속적인 양을

취급할 수 없다. 그래서 샘플링 방식(이산값)에 적합한 PID 연산 방식을 사용한다.


 샘플링 방식

 조작량 = Kp x 편차(비례항) + Ki x 편차의 누적값(적분항) + Kd x 전회 편차와의 차(미분항)




상보필터 : 연속적으로 입력 받은 값에 있어서 그 값의 이전 값을 이용하여 보정된 값을 구하는 


재귀 필터 중 하나로 서로 보완되는 특징을 가진 센서들을 이용하여 더 정확한 측정 결과를 얻고자


할 때 사용되는 것을 말합니다.


패트론에 있어서 사용되는 각도 공식이 있습니다.


angle = (0.95 * (angle + (dgy_x * 0.001)))+(0.05 * deg);


angle은 출력할 각도, dgy_x는 자이로 값, deg는 각도 값, dge는 가속도 센서를 이용해서 값을 구합니다.


인터넷에서 조사한 자료들은 이외에도 여러가지 있지만 대략적으로 알고있어야 되는 큰 개념들을 


설명해보았습니다.


이론적으로도 그렇고 코딩 소스들은 예상보다 많이 않기 때문에 구글에서 여러번 다양한 키워드로 검색해


찾으실 수 있습니다. 조사한 파일들도 여러가지 있지만 혹시모를 저작권에 대해 문제가 생길수도 있으니 


따로 올리지는 않도록 하겠습니다.


다음 포스팅에서는 미니드론 자율비행 경진대회 준비과정을 보여드리겠습니다.




반응형