PX4-Malicious ํ๋ก์ ํธ๋ ๋๋ก ๊ณต๊ฒฉ ์ฌ๋ก๋ฅผ ๋ฐํ์ผ๋ก ๊ณต๊ฒฉ ์๋๋ฆฌ์ค๋ฅผ ์ฒด๊ณํํ๊ณ , PX4 Autopilot์ ํ์ฉํด ๊ณต๊ฒฉ ์๋๋ฆฌ์ค์ ํด๋นํ๋ ์ ์ฑ ์ํํธ์จ์ด๋ฅผ ๊ตฌํํจ์ผ๋ก์จ, ์๋น์ค ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๋ค ๊ณต๊ฒฉ์ ๋๋นํด์ผ ํ๋์ง ๋ฐฉํฅ์ ์ ์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
PX4 Autopilot is an Opensource autopilot system for Unmanned Aerial Vehicle
- QGroundControl
- MAVLink Protocol
- 2D/3D aerial maps
- Drag-and-drop waypoints
Content | Description |
---|---|
Drone Aircraft | ๋๋ก ๊ธฐ๊ธฐ ๋ด๋ถ์ ์ํ ์ด์ |
Ground Control System | ๋๋ก ์ ์ธ๋ถ, GCS ์ํ ์ด์ |
Drone Flight Stack | ๋๋ก ๋นํ ๊ณผ์ ์์ ๋์ ์์์ ์ํ ์ํ ์ด์ |
- ๋ฐ๋ชจ ์์: YouTube Link
- ๊ณต๊ฒฉ ์ ํ: Drone Aircraft, Drone Flight Stack
- ๊ณต๊ฒฉ ์ง์ : Drone Firmware, Commander.cpp
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ:
Step 1: ์๋ก์ด Data๊ฐ Publish ๋๋์ง ํ์ธ
if(last_setpoint_x != (int)(_manual_control_setpoint.x * 10000) && last_setpoint_y != (int)(_manual_control_setpoint.y *10000))
Step 2: ์๋ก์ด Setpoint ์ ์ธ & orb_copy๋ฅผ ์ด์ฉํด ๋ณต์ฌ
struct manual_control_setpoint_s temp_setpoint;
orb_copy(ORB_ID(manual_control_setpoint), 1, &temp_setpoint);
Step 3: ์๋ก์ด Setpoint ๊ฐ์ x, y์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์
๋ฐ์ดํธ
temp_setpoint = _manual_control_setpoint;
temp_setpoint.x *= (-1);
temp_setpoint.y *= (-1);
Step 4: ์
๋ฐ์ดํธ๋ Setpoint ๊ฐ Publish
orb_advert_t changed_setpoint = orb_advertise(ORB_ID(manual_control_setpoint), &temp_setpoint);
orb_publish(ORB_ID(manual_control_setpoint), changed_setpoint, &temp_setpoint);
Step 5: ํ์ฌ Setpoint ๊ฐ์ last_setpoint์ ์ ์ฅ
last_setpoint_x = (int)(temp_setpoint.x * 10000);
last_setpoint_y = (int)(temp_setpoint.y * 10000);
- ๋ฐ๋ชจ ์์: YouTube Link
- ๊ณต๊ฒฉ ์ ํ: Drone Aircraft, Ground Control Station, Drone Flight Stack
- ๊ณต๊ฒฉ ์ง์ : Drone Firmware, Commander.cpp
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ:
Step 1: Mission ๊ตฌ์กฐ์ฒด ์ ์ธ
mission_s mission;
Step 2: Dataman์ Data(Mission, Setpoint) ์ฝ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ก ์ ์ธํ Mission์ ์
๋ฐ์ดํธ
if (dm_read(DM_KEY_MISSION_STATE, 0, &mission, sizeof(mission_s)) == sizeof(mission_s)) {
if (mission.dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_0 || mission.dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_1) {
if (mission.count > 0) {
PX4_INFO("Mission #%d loaded, %u WPs, curr: %d", mission.dataman_id, mission.count, mission.current_seq);
}
}
}
Step 3: ์
๋ฐ์ดํธ๋ Mission์ Publish
_mission_pub.publish(mission);
Step 4: Mission์ด ์ ์์ ์ผ๋ก Publish ๋๋์ง ํ์ธ
const bool mission_result_ok = (mission_result.timestamp > _boot_timestamp)
&& (mission_result.instance_count > 0);
Step 5: Mission์ด ์ํ ๊ฐ๋ฅํ ์ํ์ธ์ง ํ์ธ
if (status_flags.condition_home_position_valid &&
(prev_mission_instance_count != mission_result.instance_count)) {
if (!status_flags.condition_auto_mission_available) {
// the mission is invalid
tune_mission_fail(true);
} else if (mission_result.warning) {
// the mission has a warning
tune_mission_fail(true);
} else {
// the mission is valid
tune_mission_ok(true);
}
}
Step 6: Mission ์ํ ๋ชจ๋๋ก ์ ํ & Mission ์ํ๋จ
main_state_transition(status, commander_state_s::MAIN_STATE_AUTO_MISSION, status_flags, &_internal_state);
Step 7: Mission์ด ๋๋๋ฉด MESL02_Mission_flag๋ฅผ false๋ก Set
if(_mission_result_sub.get().finished){
MESL02_Mission_flag = false;
}
- ๋ฐ๋ชจ ์์: YouTube Link
- ๊ณต๊ฒฉ ์ ํ: Ground Control Station, Drone Flight Stack
- ๊ณต๊ฒฉ ์ง์ : Drone Firmware, Commander.cpp
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ:
Step 1: 1000๋ฒ์ Loss Signal์ ๋ณด๋
else if(MESL03_Loss_flag <= 1000)
Step 2: Status ๊ตฌ์กฐ์ฒด์ rc_signal_lost๋ฅผ true๋ก ์ ํ
status.rc_signal_lost = true;
Step 3: set_health_flags() ํจ์๋ฅผ ์ด์ฉํด ์
๋ฐ์ดํธ๋ Status๋ก flag ์ค์
set_health_flags(subsystem_info_s::SUBSYSTEM_TYPE_RCRECEIVER, true, true, false, status);
_status_changed = true;