PETRONE / BLE / Protocol / Structs
Modified : 2018.3.6
데이터 송수신 시에 사용하는 구조체들을 소개합니다.
- Protocol::Ack
- Protocol::Request
- Protocol::Control
- Protocol::Command
- Protocol::Command2
- Protocol::Command3
- Protocol::Address
- Protocol::State
- Protocol::Attitude
- Protocol::GyroBias
- Protocol::TrimFlight
- Protocol::TrimDrive
- Protocol::TrimAll
- Protocol::CountFlight
- Protocol::CountDrive
- Protocol::IrMessage
- Protocol::ImuRawAndAngle
- Protocol::Pressure
- Protocol::ImageFlow
- Protocol::Button
- Protocol::Motor
- Protocol::Range
- Protocol::UpdateLookupTarget
- Protocol::UpdateInformation
- Protocol::Update
- Protocol::UpdateLocationCorrect
Protocol::Ack
PETRONE이 데이터를 수신 받았을 때 응답으로 보내는 데이터입니다. PETRONE의 현재 내부 시간과 수신 받은 데이터의 타입을 담아서 반환합니다. Ack와 Control을 제외한 대부분의 명령에 대해 응답으로 전송합니다.
namespace Protocol
{
struct Ack
{
u32 systemTime; // 수신 받은 시각
u8 dataType; // 수신 받은 데이터 타입
};
}
- dataType : Protocol::DataType::Type
Protocol::Request
PETRONE에 데이터를 요청할 때 사용합니다.
namespace Protocol
{
struct Request
{
u8 dataType; // 요청할 데이터 타입
};
}
- dataType : Protocol::DataType::Type
Protocol::Control
PETRONE을 조종할 때 사용하는 입력값입니다.
namespace Protocol
{
struct Control
{
s8 roll; // Roll
s8 pitch; // Pitch
s8 yaw; // Yaw
s8 throttle; // Throttle
};
}
Control 입력 값의 범위는 다음과 같습니다. Drive 모드에서는 throttle(전후)과 roll(좌우)만 사용합니다.
이름 | 형식 | 범위 | 방향 | 음수 값(-) | 양수 값(+) |
---|---|---|---|---|---|
roll | s8 | -100 ~ 100 | 좌우 이동 | 좌측 | 우측 |
pitch | s8 | -100 ~ 100 | 전후 이동 | 후방 | 전방 |
yaw | s8 | -100 ~ 100 | 좌우 회전 | 반시계 | 시계 방향 |
throttle | s8 | -100 ~ 100 | 승하강 | 하강 | 상승 |
Protocol::Command
명령 하나를 전달합니다.
namespace Protocol
{
struct Command
{
CommandBase command;
};
}
- command : Protocol::CommandBase
Protocol::Command2
명령 두 개를 전달합니다.
namespace Protocol
{
struct Command2
{
CommandBase command1;
CommandBase command2;
};
}
- command1, command2 : Protocol::CommandBase
Protocol::Command3
명령 세 개를 전달합니다.
namespace Protocol
{
struct Command3
{
CommandBase command1;
CommandBase command2;
CommandBase command3;
};
}
- command1, command2, command3 : Protocol::CommandBase
Protocol::Address
BLE 주소를 반환합니다.
namespace Protocol
{
struct Address
{
u8 address[6];
};
}
Protocol::State
PETRONE의 현재 상태값을 반환합니다.
namespace Protocol
{
struct State
{
u8 modeVehicle; // 동작 모드
u8 modeSystem; // 시스템 모드
u8 modeFlight; // 비행 모드
u8 modeDrive; // 주행 모드
u8 sensorOrientation; // 센서 방향
u8 coordinate; // 방위
u8 battery; // 배터리량(0 ~ 100)
};
}
- modeVehicle : System::ModeVehicle::Type
- modeSystem : System::ModeSystem::Type
- modeFlight : System::ModeFlight::Type
- modeDrive : System::ModeDrive::Type
- sensorOrientation : System::SensorOrientation::Type
- coordinate : System::Coordinate::Type
Protocol::Attitude
자세값을 반환합니다.
namespace Protocol
{
struct Attitude
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
};
}
드론의 자세를 확인할 때의 사용 범위는 다음과 같습니다.
이름 | 형식 | 범위 | 설명 |
---|---|---|---|
roll | s16 | -180 ~ 180 | 좌우 기울기 각도 |
pitch | s16 | -180 ~ 180 | 전후 기울기 각도 |
yaw | s16 | 0 ~ 360 | 중력 방향을 축으로 회전할 때의 각도 |
자이로 센서 데이터를 확인할 때의 사용 범위는 다음과 같습니다.
이름 | 형식 | 범위 |
---|---|---|
roll | s16 | -32768 ~ 32767 |
pitch | s16 | -32768 ~ 32767 |
yaw | s16 | -32768 ~ 32767 |
Protocol::GyroBias
자이로 바이어스 값을 반환합니다.
namespace Protocol
{
struct GyroBias
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
};
}
Protocol::TrimFlight
비행 Trim을 조정할 때 사용합니다.
namespace Protocol
{
struct TrimFlight
{
s16 roll; // Roll
s16 pitch; // Pitch
s16 yaw; // Yaw
s16 throttle; // Throttle
};
}
Protocol::TrimDrive
자동차 Trim을 조정할 때 사용합니다.
namespace Protocol
{
struct TrimDrive
{
s16 wheel; // Wheel
};
}
Protocol::TrimAll
비행 및 자동차 Trim을 한 번에 조정할 때 사용합니다.
namespace Protocol
{
struct TrimAll
{
TrimFlight flight;
TrimDrive drive;
};
}
- flight : Protocol::TrimFlight
- drive : Protocol::TrimDrive
Protocol::CountFlight
비행과 관련된 저장값을 읽을 때 사용합니다.
namespace Protocol
{
struct CountFlight
{
u64 timeFlight; // 비행 시간
u16 countTakeOff; // 이륙 횟수
u16 countLanding; // 착륙 횟수
u16 countAccident; // 충돌 횟수
};
}
Protocol::CountDrive
주행과 관련된 저장값을 읽을 때 사용합니다.
namespace Protocol
{
struct CountDrive
{
u64 timeDrive; // 주행 시간
u16 countAccident; // 충돌 횟수
};
}
countAccident 변수는 주행 중 충돌을 카운트 하기 위해 만든 변수이나 실제 주행 시 노면이 고르지 못할 때의 충격에 의해서도 카운트가 증가하는 문제가 있습니다. 현재로는 크게 의미가 없는 값으로 생각하시면 됩니다.
Protocol::IrMessage
IR 데이터를 전송하는데 사용하거나, PETRONE이 IR 데이터를 수신 받았을 때 외부 장치로 전송하는 데이터입니다.
namespace Protocol
{
struct IrMessage
{
u8 direction; // 수신 받은 방향
u32 irData; // IR 메세지
};
}
- direction : System::Direction::Type
Protocol::ImuRawAndAngle
자이로 센서에서 출력한 값과 내부에서 계산한 드론의 자세 값을 반환합니다.
namespace Protocol
{
struct ImuRawAndAngle
{
s16 accX;
s16 accY;
s16 accZ;
s16 gyroRoll;
s16 gyroPitch;
s16 gyroYaw;
s16 angleRoll;
s16 anglePitch;
s16 angleYaw;
};
}
Protocol::Pressure
압력 센서의 출력값을 반환합니다. d1과 d2는 MS5607에서만 출력하는 값으로 DPS310이 사용된 기체에서는 0으로 출력됩니다.
namespace Protocol
{
struct Pressure
{
s32 d1;
s32 d2;
s32 temperature;
s32 pressure;
};
}
- pressure 출력 값의 단위는 밀리미터(mm)입니다.
Protocol::ImageFlow
자세 제어에 사용하는 영상 데이터 처리 값입니다.
namespace Protocol
{
struct ImageFlow
{
s32 positionX;
s32 positionY;
};
}
- positionX, positionY 출력 값의 단위는 밀리미터(mm)입니다.
Protocol::Button
버튼 입력 값입니다.
namespace Protocol
{
struct Button
{
u8 button;
};
}
Protocol::Motor
모터를 동작시키거나, 현재 모터에 입력된 값을 확인할 때 사용합니다.
namespace Protocol
{
struct Motor
{
MotorBase motor[4];
};
}
- motor : Protocol::MotorBase::Type
Protocol::Range
거리 센서에서 입력받은 거리 값을 반환합니다. 앞으로 거리센서 모듈이 추가될 예정이어서 6방향에 대한 값을 모두 담는 구조체를 사용합니다.
namespace Protocol
{
struct Range
{
u16 left;
u16 front;
u16 right;
u16 rear;
u16 top;
u16 bottom;
};
}
- 모든 출력 값의 단위는 밀리미터(mm)입니다.
Protocol::UpdateLookupTarget
펌웨어 정보 요청.
페트론은 제어 MCU와 통신 MCU로 구성되어 있습니다. Protocol::UpdateLookupTarget은 원하는 장치의 Protocol::UpdateInformation을 요청할 때 사용합니다.
namespace Protocol
{
struct UpdateLookupTarget
{
u32 deviceType;
};
}
- deviceType : System::DeviceType::Type
Protocol::UpdateInformation
펌웨어 정보.
PC 또는 App 등에서 Protocol::UpdateLookupTarget을 전송한 경우 deviceType이 일치하는 장치가 Protocol::UpdateInformation을 응답으로 전송합니다.
namespace Protocol
{
struct UpdateInformation
{
u8 modeUpdate; // 현재 업데이트 모드
u32 deviceType; // 장치 Type
u8 imageType; // 현재 펌웨어의 이미지 타입
u16 imageVersion; // 현재 펌웨어의 버전
u8 year; // 빌드 년
u8 month; // 빌드 월
u8 day; // 빌드 일
};
}
- modeUpdate : System::ModeUpdate::Type
- deviceType : System::DeviceType::Type
- imageType : System::ImageType::Type
Protocol::Update
펌웨어 업데이트.
펌웨어 업데이트 시에는 파일에서 16바이트씩 데이터를 잘라서 전송합니다. Protocol::Update를 전송하는 동안에 다른 응답은 없습니다. 만약 전송 실패가 발생한 경우 드론이 Protocol::UpdateLocationCorrect를 보냅니다. 해당 패킷을 받으면 지정한 블럭 위치부터 다시 전송을 시작하면 됩니다.
namespace Protocol
{
struct Update
{
u16 indexBlock; // 블럭 번호(16바이트 단위)
u8 dataArray[16]; // 데이터 블럭
};
}
- indexBlock : 파일의 실제 위치에서 16으로 나눈 값
Protocol::UpdateLocationCorrect
펌웨어 업데이트 위치 정정.
펌웨어 업데이트 중 전송에 실패하는 블럭이 발생하는 경우 indexBlockNext부터 다시 전송하라는 요청을 보냅니다.
namespace Protocol
{
struct UpdateLocationCorrect
{
u16 indexBlockNext; // 요청 블럭 번호
};
}
- indexBlockNext : 파일의 실제 위치에서 16으로 나눈 값