mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-21 02:33:34 +08:00
mission feasibility checker: add check for waypoint altitude relative to home position altitude
This commit is contained in:
@@ -62,7 +62,7 @@ MissionFeasibilityChecker::MissionFeasibilityChecker() : _mavlink_fd(-1), _capab
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MissionFeasibilityChecker::checkMissionFeasible(bool isRotarywing, dm_item_t dm_current, size_t nMissionItems, Geofence &geofence)
|
bool MissionFeasibilityChecker::checkMissionFeasible(bool isRotarywing, dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt)
|
||||||
{
|
{
|
||||||
/* Init if not done yet */
|
/* Init if not done yet */
|
||||||
init();
|
init();
|
||||||
@@ -75,24 +75,24 @@ bool MissionFeasibilityChecker::checkMissionFeasible(bool isRotarywing, dm_item_
|
|||||||
|
|
||||||
|
|
||||||
if (isRotarywing)
|
if (isRotarywing)
|
||||||
return checkMissionFeasibleRotarywing(dm_current, nMissionItems, geofence);
|
return checkMissionFeasibleRotarywing(dm_current, nMissionItems, geofence, home_alt);
|
||||||
else
|
else
|
||||||
return checkMissionFeasibleFixedwing(dm_current, nMissionItems, geofence);
|
return checkMissionFeasibleFixedwing(dm_current, nMissionItems, geofence, home_alt);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MissionFeasibilityChecker::checkMissionFeasibleRotarywing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence)
|
bool MissionFeasibilityChecker::checkMissionFeasibleRotarywing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt)
|
||||||
{
|
{
|
||||||
|
|
||||||
return checkGeofence(dm_current, nMissionItems, geofence);
|
return (checkGeofence(dm_current, nMissionItems, geofence) && checkHomePositionAltitude(dm_current, nMissionItems, home_alt));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MissionFeasibilityChecker::checkMissionFeasibleFixedwing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence)
|
bool MissionFeasibilityChecker::checkMissionFeasibleFixedwing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt)
|
||||||
{
|
{
|
||||||
/* Update fixed wing navigation capabilites */
|
/* Update fixed wing navigation capabilites */
|
||||||
updateNavigationCapabilities();
|
updateNavigationCapabilities();
|
||||||
// warnx("_nav_caps.landing_slope_angle_rad %.4f, _nav_caps.landing_horizontal_slope_displacement %.4f", _nav_caps.landing_slope_angle_rad, _nav_caps.landing_horizontal_slope_displacement);
|
// warnx("_nav_caps.landing_slope_angle_rad %.4f, _nav_caps.landing_horizontal_slope_displacement %.4f", _nav_caps.landing_slope_angle_rad, _nav_caps.landing_horizontal_slope_displacement);
|
||||||
|
|
||||||
return (checkFixedWingLanding(dm_current, nMissionItems) && checkGeofence(dm_current, nMissionItems, geofence));
|
return (checkFixedWingLanding(dm_current, nMissionItems) && checkGeofence(dm_current, nMissionItems, geofence) && checkHomePositionAltitude(dm_current, nMissionItems, home_alt));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MissionFeasibilityChecker::checkGeofence(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence)
|
bool MissionFeasibilityChecker::checkGeofence(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence)
|
||||||
@@ -108,7 +108,7 @@ bool MissionFeasibilityChecker::checkGeofence(dm_item_t dm_current, size_t nMiss
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!geofence.inside(missionitem.lat, missionitem.lon, missionitem.altitude)) { //xxx: handle relative altitude
|
if (!geofence.inside(missionitem.lat, missionitem.lon, missionitem.altitude)) {
|
||||||
mavlink_log_info(_mavlink_fd, "#audio: Geofence violation waypoint %d", i);
|
mavlink_log_info(_mavlink_fd, "#audio: Geofence violation waypoint %d", i);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -118,6 +118,33 @@ bool MissionFeasibilityChecker::checkGeofence(dm_item_t dm_current, size_t nMiss
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MissionFeasibilityChecker::checkHomePositionAltitude(dm_item_t dm_current, size_t nMissionItems, float home_alt, bool throw_error)
|
||||||
|
{
|
||||||
|
/* Check if all all waypoints are above the home altitude, only return false if bool throw_error = true */
|
||||||
|
for (size_t i = 0; i < nMissionItems; i++) {
|
||||||
|
static struct mission_item_s missionitem;
|
||||||
|
const ssize_t len = sizeof(struct mission_item_s);
|
||||||
|
|
||||||
|
if (dm_read(dm_current, i, &missionitem, len) != len) {
|
||||||
|
/* not supposed to happen unless the datamanager can't access the SD card, etc. */
|
||||||
|
if (throw_error) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (home_alt > missionitem.altitude) {
|
||||||
|
mavlink_log_info(_mavlink_fd, "#audio: warning waypoint %d below home", i);
|
||||||
|
if (throw_error) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool MissionFeasibilityChecker::checkFixedWingLanding(dm_item_t dm_current, size_t nMissionItems)
|
bool MissionFeasibilityChecker::checkFixedWingLanding(dm_item_t dm_current, size_t nMissionItems)
|
||||||
{
|
{
|
||||||
/* Go through all mission items and search for a landing waypoint
|
/* Go through all mission items and search for a landing waypoint
|
||||||
|
|||||||
@@ -59,14 +59,15 @@ private:
|
|||||||
|
|
||||||
/* Checks for all airframes */
|
/* Checks for all airframes */
|
||||||
bool checkGeofence(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence);
|
bool checkGeofence(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence);
|
||||||
|
bool checkHomePositionAltitude(dm_item_t dm_current, size_t nMissionItems, float home_alt, bool throw_error = false);
|
||||||
|
|
||||||
/* Checks specific to fixedwing airframes */
|
/* Checks specific to fixedwing airframes */
|
||||||
bool checkMissionFeasibleFixedwing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence);
|
bool checkMissionFeasibleFixedwing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt);
|
||||||
bool checkFixedWingLanding(dm_item_t dm_current, size_t nMissionItems);
|
bool checkFixedWingLanding(dm_item_t dm_current, size_t nMissionItems);
|
||||||
void updateNavigationCapabilities();
|
void updateNavigationCapabilities();
|
||||||
|
|
||||||
/* Checks specific to rotarywing airframes */
|
/* Checks specific to rotarywing airframes */
|
||||||
bool checkMissionFeasibleRotarywing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence);
|
bool checkMissionFeasibleRotarywing(dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt);
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MissionFeasibilityChecker();
|
MissionFeasibilityChecker();
|
||||||
@@ -75,7 +76,7 @@ public:
|
|||||||
/*
|
/*
|
||||||
* Returns true if mission is feasible and false otherwise
|
* Returns true if mission is feasible and false otherwise
|
||||||
*/
|
*/
|
||||||
bool checkMissionFeasible(bool isRotarywing, dm_item_t dm_current, size_t nMissionItems, Geofence &geofence);
|
bool checkMissionFeasible(bool isRotarywing, dm_item_t dm_current, size_t nMissionItems, Geofence &geofence, float home_alt);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -521,7 +521,7 @@ Navigator::offboard_mission_update(bool isrotaryWing)
|
|||||||
dm_current = DM_KEY_WAYPOINTS_OFFBOARD_1;
|
dm_current = DM_KEY_WAYPOINTS_OFFBOARD_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
missionFeasiblityChecker.checkMissionFeasible(isrotaryWing, dm_current, (size_t)offboard_mission.count, _geofence);
|
missionFeasiblityChecker.checkMissionFeasible(isrotaryWing, dm_current, (size_t)offboard_mission.count, _geofence, _home_pos.alt);
|
||||||
|
|
||||||
_mission.set_offboard_dataman_id(offboard_mission.dataman_id);
|
_mission.set_offboard_dataman_id(offboard_mission.dataman_id);
|
||||||
_mission.set_current_offboard_mission_index(offboard_mission.current_index);
|
_mission.set_current_offboard_mission_index(offboard_mission.current_index);
|
||||||
|
|||||||
Reference in New Issue
Block a user