Copter Position Control and Navigation¶
As a reference the diagram below provides a high level code flow view of Copter’s RTL mode
Class Hierarchy and Description¶
At the highest level, AC_WPNav, AC_Circle and AC_Loiter libraries are peers and all make use of the AC_PosControl library
AC_WPNav is made up of three independent controllers (these may be separated into individual libraries in the future):
- Waypoint attempts to fly the vehicle in a straight line to a target waypoints. This interface accepts a 3D target destination specified as a latitude, longitude and altitude or as an offset from the EKF origin
- Spline flies the vehile in a smooth curved path to a 3D target waypoint with a final velocity that will allow it to continue smoothly towards a subsequent waypoint. Its interface is very similar to the Waypoint controller above
- Brake tries to slow the vehicle to a stop as quickly as possible
- Waypoint, Spline and Brake controllers do not use PIDs directly. Instead they update target positions or velocities which are then passed to the Position Controller
Separate interfaces for horizontal (X and Y axis) control and vertical (Z-axis) control. These interfaces are separated because some flight modes (like AltHold mode) only require the Z-axis controller
Layered PID controllers are used
- XY axis uses a Position P to convert position error to a target velocity. A velocity PID converts velocity error into a desired acceleration which is then converted to a desired lean angle which is then sent into the attitude control library.
- The Z axis uses a Position P controller to convert position error to a target vertical velocity (aka climb rate). A Velocity P controller converts velocity error to a desired acceleration. An Acceleration PID converts acceleration error into a desired throttle which is then sent into the attitude control library (which mostly just passes it through to the low level motors library)
AC_PosControl also includes a 3D velocity controller and a 3D Position+Velocity controller
Should I use PosControl or WPNav?¶
Because both AC_PosControl and AC_WPNav allow the caller to move a vehicle to a 3D target point it may not be clear which should be used.
In general the vehicle code (i.e. flight mode code) should use the AC_WPNav library because it will ensure the vehicle flies a straight path to the target. AC_PosControl should normally only be used by other higher level navigation libraries. The exception to this rule is simpler flight modes that simply want Z-axis control - these make direct use of AC_PosControl.