AP_Mission: Accept and store landing aborts in the mission
This commit is contained in:
parent
2bace79025
commit
670eaf8782
@ -773,6 +773,10 @@ MAV_MISSION_RESULT AP_Mission::mavlink_int_to_mission_cmd(const mavlink_mission_
|
|||||||
copy_location = true;
|
copy_location = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAV_CMD_DO_GO_AROUND: // MAV ID: 191
|
||||||
|
copy_location = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case MAV_CMD_DO_SET_ROI: // MAV ID: 201
|
case MAV_CMD_DO_SET_ROI: // MAV ID: 201
|
||||||
copy_location = true;
|
copy_location = true;
|
||||||
cmd.p1 = packet.param1; // 0 = no roi, 1 = next waypoint, 2 = waypoint number, 3 = fixed location, 4 = given target (not supported)
|
cmd.p1 = packet.param1; // 0 = no roi, 1 = next waypoint, 2 = waypoint number, 3 = fixed location, 4 = given target (not supported)
|
||||||
@ -1229,6 +1233,10 @@ bool AP_Mission::mission_cmd_to_mavlink_int(const AP_Mission::Mission_Command& c
|
|||||||
copy_location = true;
|
copy_location = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAV_CMD_DO_GO_AROUND: // MAV ID: 191
|
||||||
|
copy_location = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case MAV_CMD_DO_SET_ROI: // MAV ID: 201
|
case MAV_CMD_DO_SET_ROI: // MAV ID: 201
|
||||||
copy_location = true;
|
copy_location = true;
|
||||||
packet.param1 = cmd.p1; // 0 = no roi, 1 = next waypoint, 2 = waypoint number, 3 = fixed location, 4 = given target (not supported)
|
packet.param1 = cmd.p1; // 0 = no roi, 1 = next waypoint, 2 = waypoint number, 3 = fixed location, 4 = given target (not supported)
|
||||||
@ -1724,7 +1732,7 @@ uint16_t AP_Mission::get_landing_sequence_start()
|
|||||||
float min_distance = -1;
|
float min_distance = -1;
|
||||||
|
|
||||||
// Go through mission looking for nearest landing start command
|
// Go through mission looking for nearest landing start command
|
||||||
for (uint16_t i = 0; i < num_commands(); i++) {
|
for (uint16_t i = 1; i < num_commands(); i++) {
|
||||||
Mission_Command tmp;
|
Mission_Command tmp;
|
||||||
if (!read_cmd_from_storage(i, tmp)) {
|
if (!read_cmd_from_storage(i, tmp)) {
|
||||||
continue;
|
continue;
|
||||||
@ -1764,6 +1772,45 @@ bool AP_Mission::jump_to_landing_sequence(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// jumps the mission to the closest landing abort that is planned, returns false if unable to find a valid abort
|
||||||
|
bool AP_Mission::jump_to_abort_landing_sequence(void)
|
||||||
|
{
|
||||||
|
struct Location current_loc;
|
||||||
|
|
||||||
|
uint16_t abort_index = 0;
|
||||||
|
if (AP::ahrs().get_position(current_loc)) {
|
||||||
|
float min_distance = FLT_MAX;
|
||||||
|
|
||||||
|
for (uint16_t i = 1; i < num_commands(); i++) {
|
||||||
|
Mission_Command tmp;
|
||||||
|
if (!read_cmd_from_storage(i, tmp)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (tmp.id == MAV_CMD_DO_GO_AROUND) {
|
||||||
|
float tmp_distance = get_distance(tmp.content.location, current_loc);
|
||||||
|
if (tmp_distance < min_distance) {
|
||||||
|
min_distance = tmp_distance;
|
||||||
|
abort_index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abort_index != 0 && set_current_cmd(abort_index)) {
|
||||||
|
|
||||||
|
//if the mission has ended it has to be restarted
|
||||||
|
if (state() == AP_Mission::MISSION_STOPPED) {
|
||||||
|
resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
gcs().send_text(MAV_SEVERITY_INFO, "Landing abort sequence start");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
gcs().send_text(MAV_SEVERITY_WARNING, "Unable to start find a landing abort sequence");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const char *AP_Mission::Mission_Command::type() const {
|
const char *AP_Mission::Mission_Command::type() const {
|
||||||
switch(id) {
|
switch(id) {
|
||||||
case MAV_CMD_NAV_WAYPOINT:
|
case MAV_CMD_NAV_WAYPOINT:
|
||||||
|
@ -469,6 +469,9 @@ public:
|
|||||||
// available.
|
// available.
|
||||||
bool jump_to_landing_sequence(void);
|
bool jump_to_landing_sequence(void);
|
||||||
|
|
||||||
|
// jumps the mission to the closest landing abort that is planned, returns false if unable to find a valid abort
|
||||||
|
bool jump_to_abort_landing_sequence(void);
|
||||||
|
|
||||||
// get a reference to the AP_Mission semaphore, allowing an external caller to lock the
|
// get a reference to the AP_Mission semaphore, allowing an external caller to lock the
|
||||||
// storage while working with multiple waypoints
|
// storage while working with multiple waypoints
|
||||||
HAL_Semaphore_Recursive &get_semaphore(void) {
|
HAL_Semaphore_Recursive &get_semaphore(void) {
|
||||||
|
Loading…
Reference in New Issue
Block a user