mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-22 16:23:33 +08:00
navigator: reject mission if the first waypoint is too far from home
This commit is contained in:
@@ -61,6 +61,7 @@ Mission::Mission(Navigator *navigator, const char *name) :
|
|||||||
MissionBlock(navigator, name),
|
MissionBlock(navigator, name),
|
||||||
_param_onboard_enabled(this, "ONBOARD_EN"),
|
_param_onboard_enabled(this, "ONBOARD_EN"),
|
||||||
_param_takeoff_alt(this, "TAKEOFF_ALT"),
|
_param_takeoff_alt(this, "TAKEOFF_ALT"),
|
||||||
|
_param_dist_1wp(this, "DIST_1WP"),
|
||||||
_onboard_mission({0}),
|
_onboard_mission({0}),
|
||||||
_offboard_mission({0}),
|
_offboard_mission({0}),
|
||||||
_current_onboard_mission_index(-1),
|
_current_onboard_mission_index(-1),
|
||||||
@@ -69,8 +70,10 @@ Mission::Mission(Navigator *navigator, const char *name) :
|
|||||||
_mission_result({0}),
|
_mission_result({0}),
|
||||||
_mission_type(MISSION_TYPE_NONE),
|
_mission_type(MISSION_TYPE_NONE),
|
||||||
_inited(false),
|
_inited(false),
|
||||||
|
_dist_1wp_ok(false),
|
||||||
_need_takeoff(true),
|
_need_takeoff(true),
|
||||||
_takeoff(false)
|
_takeoff(false)
|
||||||
|
|
||||||
{
|
{
|
||||||
/* load initial params */
|
/* load initial params */
|
||||||
updateParams();
|
updateParams();
|
||||||
@@ -246,6 +249,70 @@ Mission::advance_mission()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Mission::check_dist_1wp()
|
||||||
|
{
|
||||||
|
if (_dist_1wp_ok) {
|
||||||
|
/* always return true after at least one successful check */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if first waypoint is not too far from home */
|
||||||
|
bool mission_valid = false;
|
||||||
|
if (_param_dist_1wp.get() > 0.0f) {
|
||||||
|
if (_navigator->get_vstatus()->condition_home_position_valid) {
|
||||||
|
struct mission_item_s mission_item;
|
||||||
|
|
||||||
|
/* find first waypoint (with lat/lon) item in datamanager */
|
||||||
|
for (int i = 0; i < _offboard_mission.count; i++) {
|
||||||
|
if (dm_read(DM_KEY_WAYPOINTS_OFFBOARD(_offboard_mission.dataman_id), i,
|
||||||
|
&mission_item, sizeof(mission_item_s)) == sizeof(mission_item_s)) {
|
||||||
|
|
||||||
|
/* check only items with valid lat/lon */
|
||||||
|
if ( mission_item.nav_cmd == NAV_CMD_WAYPOINT ||
|
||||||
|
mission_item.nav_cmd == NAV_CMD_LOITER_TIME_LIMIT ||
|
||||||
|
mission_item.nav_cmd == NAV_CMD_LOITER_TURN_COUNT ||
|
||||||
|
mission_item.nav_cmd == NAV_CMD_LOITER_UNLIMITED ||
|
||||||
|
mission_item.nav_cmd == NAV_CMD_TAKEOFF ||
|
||||||
|
mission_item.nav_cmd == NAV_CMD_PATHPLANNING) {
|
||||||
|
|
||||||
|
/* check distance from home to item */
|
||||||
|
float dist_to_1wp = get_distance_to_next_waypoint(
|
||||||
|
mission_item.lat, mission_item.lon,
|
||||||
|
_navigator->get_home_position()->lat, _navigator->get_home_position()->lon);
|
||||||
|
|
||||||
|
if (dist_to_1wp < _param_dist_1wp.get()) {
|
||||||
|
_dist_1wp_ok = true;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* item is too far from home */
|
||||||
|
mavlink_log_info(_navigator->get_mavlink_fd(), "first wp is too far from home: %.1fm > %.1fm", dist_to_1wp, _param_dist_1wp.get());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* error reading, mission is invalid */
|
||||||
|
mavlink_log_info(_navigator->get_mavlink_fd(), "error reading offboard mission");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no waypoints found in mission, then we will not fly far away */
|
||||||
|
_dist_1wp_ok = true;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
mavlink_log_info(_navigator->get_mavlink_fd(), "no home position");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Mission::set_mission_items()
|
Mission::set_mission_items()
|
||||||
{
|
{
|
||||||
@@ -266,7 +333,7 @@ Mission::set_mission_items()
|
|||||||
_mission_type = MISSION_TYPE_ONBOARD;
|
_mission_type = MISSION_TYPE_ONBOARD;
|
||||||
|
|
||||||
/* try setting offboard mission item */
|
/* try setting offboard mission item */
|
||||||
} else if (read_mission_item(false, true, &_mission_item)) {
|
} else if (check_dist_1wp() && read_mission_item(false, true, &_mission_item)) {
|
||||||
/* if mission type changed, notify */
|
/* if mission type changed, notify */
|
||||||
if (_mission_type != MISSION_TYPE_OFFBOARD) {
|
if (_mission_type != MISSION_TYPE_OFFBOARD) {
|
||||||
mavlink_log_info(_navigator->get_mavlink_fd(), "#audio: offboard mission running");
|
mavlink_log_info(_navigator->get_mavlink_fd(), "#audio: offboard mission running");
|
||||||
|
|||||||
@@ -91,6 +91,12 @@ private:
|
|||||||
*/
|
*/
|
||||||
void advance_mission();
|
void advance_mission();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check distance to first waypoint (with lat/lon)
|
||||||
|
* @return true only if it's not too far from home (< MIS_DIST_1WP)
|
||||||
|
*/
|
||||||
|
bool check_dist_1wp();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new mission items
|
* Set new mission items
|
||||||
*/
|
*/
|
||||||
@@ -127,8 +133,9 @@ private:
|
|||||||
*/
|
*/
|
||||||
void publish_mission_result();
|
void publish_mission_result();
|
||||||
|
|
||||||
control::BlockParamFloat _param_onboard_enabled;
|
control::BlockParamInt _param_onboard_enabled;
|
||||||
control::BlockParamFloat _param_takeoff_alt;
|
control::BlockParamFloat _param_takeoff_alt;
|
||||||
|
control::BlockParamFloat _param_dist_1wp;
|
||||||
|
|
||||||
struct mission_s _onboard_mission;
|
struct mission_s _onboard_mission;
|
||||||
struct mission_s _offboard_mission;
|
struct mission_s _offboard_mission;
|
||||||
@@ -148,6 +155,7 @@ private:
|
|||||||
} _mission_type;
|
} _mission_type;
|
||||||
|
|
||||||
bool _inited;
|
bool _inited;
|
||||||
|
bool _dist_1wp_ok;
|
||||||
|
|
||||||
MissionFeasibilityChecker missionFeasiblityChecker; /**< class that checks if a mission is feasible */
|
MissionFeasibilityChecker missionFeasiblityChecker; /**< class that checks if a mission is feasible */
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -58,7 +58,6 @@
|
|||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(MIS_TAKEOFF_ALT, 10.0f);
|
PARAM_DEFINE_FLOAT(MIS_TAKEOFF_ALT, 10.0f);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable onboard mission
|
* Enable onboard mission
|
||||||
*
|
*
|
||||||
@@ -67,3 +66,15 @@ PARAM_DEFINE_FLOAT(MIS_TAKEOFF_ALT, 10.0f);
|
|||||||
* @group Mission
|
* @group Mission
|
||||||
*/
|
*/
|
||||||
PARAM_DEFINE_INT32(MIS_ONBOARD_EN, 0);
|
PARAM_DEFINE_INT32(MIS_ONBOARD_EN, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximal horizontal distance from home to first waypoint
|
||||||
|
*
|
||||||
|
* Failsafe check to prevent running mission stored from previous flight on new place.
|
||||||
|
* Value < 0 means that check disabled.
|
||||||
|
*
|
||||||
|
* @min -1
|
||||||
|
* @max 200
|
||||||
|
* @group Mission
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(MIS_DIST_1WP, 50);
|
||||||
|
|||||||
Reference in New Issue
Block a user