/// set_wp_destination waypoint using position vector (distance from home in cm) /// terrain_alt should be true if destination.z is a desired altitude above terrain bool AC_WPNav::set_wp_destination(const Vector3f& destination, bool terrain_alt) { Vector3f origin; // if waypoint controller is active use the existing position target as the origin if ((AP_HAL::millis() - _wp_last_update) < 1000) { origin = _pos_control.get_pos_target(); } else { // if waypoint controller is not active, set origin to reasonable stopping point (using curr pos and velocity) _pos_control.get_stopping_point_xy(origin); _pos_control.get_stopping_point_z(origin); } // convert origin to alt-above-terrain if (terrain_alt) { float origin_terr_offset; if (!get_terrain_offset(origin_terr_offset)) { return false; } origin.z -= origin_terr_offset; } // set origin and destination return set_wp_origin_and_destination(origin, destination, terrain_alt); }
/// set_destination - set destination using cm from home void AC_WPNav::set_wp_destination(const Vector3f& destination) { Vector3f origin; // if waypoint controller is active use the existing position target as the origin if ((hal.scheduler->millis() - _wp_last_update) < 1000) { origin = _pos_control.get_pos_target(); } else { // if waypoint controller is not active, set origin to reasonable stopping point (using curr pos and velocity) _pos_control.get_stopping_point_xy(origin); _pos_control.get_stopping_point_z(origin); } // set origin and destination set_wp_origin_and_destination(origin, destination); }