You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
5.8 KiB
126 lines
5.8 KiB
/// @file AP_Navigation.h |
|
/// @brief generic navigation controller interface |
|
|
|
/* |
|
This defines a generic interface for navigation controllers. Each |
|
specific controller should be a subclass of this generic |
|
interface. All variables used by controllers should be in their |
|
own class. |
|
*/ |
|
#pragma once |
|
|
|
#include <AP_Common/AP_Common.h> |
|
|
|
class AP_Navigation { |
|
public: |
|
// return the desired roll angle in centi-degrees to move towards |
|
// the target waypoint |
|
virtual int32_t nav_roll_cd(void) const = 0; |
|
|
|
// return the desired lateral acceleration in m/s/s to move towards |
|
// the target waypoint |
|
virtual float lateral_acceleration(void) const = 0; |
|
|
|
// note: all centi-degree values returned in AP_Navigation should |
|
// be wrapped at -18000 to 18000 in centi-degrees. |
|
|
|
// return the tracking bearing that the navigation controller is |
|
// using in centi-degrees. This is used to display an arrow on |
|
// ground stations showing the effect of the cross-tracking in the |
|
// controller |
|
virtual int32_t nav_bearing_cd(void) const = 0; |
|
|
|
// return the difference between the vehicles current course and |
|
// the nav_bearing_cd() in centi-degrees. A positive value means |
|
// the vehicle is tracking too far to the left of the correct |
|
// bearing. |
|
virtual int32_t bearing_error_cd(void) const = 0; |
|
|
|
// return the target bearing in centi-degrees. This is the bearing |
|
// from the vehicles current position to the target waypoint. This |
|
// should be calculated in the update_*() functions below. |
|
virtual int32_t target_bearing_cd(void) const = 0; |
|
|
|
// return the crosstrack error in meters. This is the distance in |
|
// the X-Y plane that we are off the desired track |
|
virtual float crosstrack_error(void) const = 0; |
|
virtual float crosstrack_error_integrator(void) const = 0; |
|
|
|
// return the distance in meters at which a turn should commence |
|
// to allow the vehicle to neatly move to the next track in the |
|
// mission when approaching a waypoint. Assumes 90 degree turn |
|
virtual float turn_distance(float wp_radius) const = 0; |
|
|
|
// return the distance in meters at which a turn should commence |
|
// to allow the vehicle to neatly move to the next track in the |
|
// mission when approaching a waypoint |
|
virtual float turn_distance(float wp_radius, float turn_angle) const = 0; |
|
|
|
// return the target loiter radius for the current location that |
|
// will not cause excessive airframe loading |
|
virtual float loiter_radius(const float radius) const = 0; |
|
|
|
// update the internal state of the navigation controller, given |
|
// the previous and next waypoints. This is the step function for |
|
// navigation control for path following between two points. This |
|
// function is called at regular intervals (typically 10Hz). The |
|
// main flight code will call an output function (such as |
|
// nav_roll_cd()) after this function to ask for the new required |
|
// navigation attitude/steering. |
|
virtual void update_waypoint(const struct Location &prev_WP, const struct Location &next_WP, float dist_min = 0.0f) = 0; |
|
|
|
// update the internal state of the navigation controller for when |
|
// the vehicle has been commanded to circle about a point. This |
|
// is the step function for navigation control for circling. This |
|
// function is called at regular intervals (typically 10Hz). The |
|
// main flight code will call an output function (such as |
|
// nav_roll_cd()) after this function to ask for the new required |
|
// navigation attitude/steering. |
|
virtual void update_loiter(const struct Location ¢er_WP, float radius, int8_t loiter_direction) = 0; |
|
|
|
// update the internal state of the navigation controller, given a |
|
// fixed heading. This is the step function for navigation control |
|
// for a fixed heading. This function is called at regular |
|
// intervals (typically 10Hz). The main flight code will call an |
|
// output function (such as nav_roll_cd()) after this function to |
|
// ask for the new required navigation attitude/steering. |
|
virtual void update_heading_hold(int32_t navigation_heading_cd) = 0; |
|
|
|
// update the internal state of the navigation controller for |
|
// level flight on the current heading. This is the step function |
|
// for navigation control for level flight. This function is |
|
// called at regular intervals (typically 10Hz). The main flight |
|
// code will call an output function (such as nav_roll_cd()) after |
|
// this function to ask for the new required navigation |
|
// attitude/steering. |
|
virtual void update_level_flight(void) = 0; |
|
|
|
// return true if we have reached the target loiter location. This |
|
// may be a fuzzy decision, depending on internal navigation |
|
// parameters. For example the controller may return true only |
|
// when on the circular path around the waypoint, and not when |
|
// tracking towards the center. This function is only valid when |
|
// the update_loiter() method is used |
|
virtual bool reached_loiter_target(void) = 0; |
|
|
|
// notify Navigation controller that a new waypoint has just been |
|
// processed. This means that until we handle an update_XXX() function |
|
// the data is stale with old navigation information. |
|
virtual void set_data_is_stale(void) = 0; |
|
|
|
// return true if a new waypoint has been processed by mission |
|
// controller but the navigation controller still has old stale data |
|
// from previous waypoint navigation handling. This gets cleared on |
|
// every update_XXXXXX() call. |
|
virtual bool data_is_stale(void) const = 0; |
|
|
|
virtual void set_reverse(bool reverse) = 0; |
|
|
|
// add new navigation controllers to this enum. Users can then |
|
// select which navigation controller to use by setting the |
|
// NAV_CONTROLLER parameter |
|
enum ControllerType { |
|
CONTROLLER_DEFAULT = 0, |
|
CONTROLLER_L1 = 1 |
|
}; |
|
};
|
|
|