Control Libraries¶
This section covers the control libraries for PID controllers, attitude control, and waypoint navigation.
AC_PID (PID Controller)¶
Header: libraries/AC_PID/AC_PID.h
Inheritance: None (top-level class)
Description: Generic PID (Proportional-Integral-Derivative) controller implementation. Used throughout ArduPilot for rate control, position control, and many other control loops.
Key Features:
P, I, D, FF (Feedforward) terms
Configurable filter frequencies
Integral windup protection
Slew rate limiting
Detailed Documentation:
AC_PID Detailed Reference - Detailed AC_PID API Reference
Class Definition:
-
class AC_PID
Copter PID control class.
Subclassed by AC_HELI_PID
Public Functions
-
AC_PID(float initial_p, float initial_i, float initial_d, float initial_ff, float initial_imax, float initial_filt_T_hz, float initial_filt_E_hz, float initial_filt_D_hz, float initial_srmax = 0, float initial_srtau = 1.0, float initial_dff = 0)
Constructor for PID controller with EEPROM-backed gain. Parameters are initialized from defaults or EEPROM at runtime.
-
struct ac_pid_flags
-
struct Defaults
-
AC_PID(float initial_p, float initial_i, float initial_d, float initial_ff, float initial_imax, float initial_filt_T_hz, float initial_filt_E_hz, float initial_filt_D_hz, float initial_srmax = 0, float initial_srtau = 1.0, float initial_dff = 0)
Constructor:
-
AC_PID::AC_PID(float initial_p, float initial_i, float initial_d, float initial_ff, float initial_imax, float initial_filt_T_hz, float initial_filt_E_hz, float initial_filt_D_hz, float initial_srmax, float initial_srtau, float initial_dff)
Constructor with all parameters.
- Parameters:
initial_p – Initial proportional gain (P)
initial_i – Initial integral gain (I)
initial_d – Initial derivative gain (D)
initial_ff – Initial feedforward gain (FF)
initial_imax – Initial integral limit (imax)
initial_filt_T_hz – Initial derivative filter frequency (Hz)
initial_filt_E_hz – Initial error filter frequency (Hz)
initial_filt_D_hz – Initial derivative input filter frequency (Hz)
initial_srmax – Slew rate maximum
initial_srtau – Slew rate time constant
initial_dff – Initial derivative feedforward gain
Main Control Methods:
-
float AC_PID::update_all(float target, float measurement, float dt)¶
Run full PID update combining P, I, D terms.
- Parameters:
target – Target value (setpoint)
measurement – Measured value (feedback)
dt – Time delta since last update in seconds
- Returns:
Control output (sum of P + I + D + FF)
-
float AC_PID::update_error(float error, float dt)¶
Run PID with error input (target - measurement).
- Parameters:
error – Error (target - measurement)
dt – Time delta in seconds
- Returns:
Control output
-
void AC_PID::reset_I()
Reset integral term to zero. Call when changing setpoints or entering new flight mode.
-
void AC_PID::reset_I(float value)¶
Reset integral term to specific value.
- Parameters:
value – Initial integral value
Gain Setting Methods:
-
void AC_PID::set_kP(float v)
Set proportional gain.
- Parameters:
v – Proportional gain value
-
void AC_PID::set_kI(float v)
Set integral gain.
- Parameters:
v – Integral gain value
-
void AC_PID::set_kD(float v)
Set derivative gain.
- Parameters:
v – Derivative gain value
-
void AC_PID::set_imax(float v)
Set integral limit (maximum absolute integral term).
- Parameters:
v – Maximum integral value
-
void AC_PID::set_filt_T(float hz)¶
Set derivative filter time constant.
- Parameters:
hz – Filter frequency in Hz
Gain Getting Methods:
-
float AC_PID::get_p() const
Get proportional term from last update.
- Returns:
P term value
-
float AC_PID::get_i() const
Get integral term from last update.
- Returns:
I term value
-
float AC_PID::get_d() const
Get derivative term from last update.
- Returns:
D term value
-
float AC_PID::get_ff() const
Get feedforward term from last update.
- Returns:
FF term value
Usage Example:
AC_PID pid;
pid.set_kP(1.0f);
pid.set_kI(0.5f);
pid.set_kD(0.1f);
pid.set_kFF(0.0f);
pid.set_imax(1000.0f);
// In control loop (e.g., 100Hz)
float target = 100.0f;
float measurement = 80.0f;
float dt = 0.01f; // 10ms
float output = pid.update_all(target, measurement, dt);
// When changing modes or setpoints
pid.reset_I();
Related Classes:
AC_PID_2D
AC_PI
AC_P
AC_AttitudeControl (Attitude Controller)¶
Header: libraries/AC_AttitudeControl/AC_AttitudeControl.h
Inheritance: Inherits from :doxygen:`AC_AttitudeControl_Backend`
Description: Attitude control for multirotor aircraft. Provides rate control and angle control for roll, pitch, and yaw axes.
Key Features:
Rate control (100Hz+)
Angle control with quaternion support
Attitude feedback control
Throttle control
Class Definition:
-
class AC_AttitudeControl¶
Subclassed by AC_AttitudeControl_Heli, AC_AttitudeControl_Multi, AC_AttitudeControl_Sub
-
struct HeadingCommand¶
-
struct HeadingCommand¶
Constructor:
-
AC_AttitudeControl::AC_AttitudeControl(AP_AHRS &ahrs, AP_Motors &motors)¶
Constructor.
- Parameters:
ahrs – Reference to AHRS instance
motors – Reference to Motors instance
Main Control Methods:
-
void AC_AttitudeControl::set_attitude_target(const Quaternion &att_target)¶
Set target attitude as quaternion.
- Parameters:
att_target – Target quaternion (w, x, y, z)
-
void AC_AttitudeControl::set_attitude_target_euler(float roll, float pitch, float yaw)¶
Set target attitude as euler angles.
- Parameters:
roll – Target roll angle in radians
pitch – Target pitch angle in radians
yaw – Target yaw angle in radians
-
void AC_AttitudeControl::rate_controller_run()¶
Run rate controllers (main control loop). Must be called at 100Hz+. Reads pilot input and runs rate PID controllers.
-
void AC_AttitudeControl::angle_controller_run()¶
Run angle controllers. Converts angle targets to rate targets and runs rate controllers.
Rate Control Methods:
-
void AC_AttitudeControl::set_rate_roll(float rate_rads)¶
Set roll rate target.
- Parameters:
rate_rads – Target rate in rad/s
-
void AC_AttitudeControl::set_rate_pitch(float rate_rads)¶
Set pitch rate target.
- Parameters:
rate_rads – Target rate in rad/s
-
void AC_AttitudeControl::set_rate_yaw(float rate_rads)¶
Set yaw rate target.
- Parameters:
rate_rads – Target rate in rad/s
Angle Control Methods:
-
void AC_AttitudeControl::set_roll(float roll_rad)¶
Set roll angle target.
- Parameters:
roll_rad – Target roll in radians
-
void AC_AttitudeControl::set_pitch(float pitch_rad)¶
Set pitch angle target.
- Parameters:
pitch_rad – Target pitch in radians
-
void AC_AttitudeControl::set_yaw(float yaw_rad)¶
Set yaw angle target.
- Parameters:
yaw_rad – Target yaw in radians
-
void AC_AttitudeControl::set_throttle(float throttle)¶
Set motor throttle (0-1 range).
- Parameters:
throttle – Throttle value (0 to 1)
Specialized Classes:
AC_AttitudeControl_Multi (Multicopter)
AC_AttitudeControl_Heli (Helicopter)
AC_AttitudeControl_Sub (Submarine)
Usage Example:
AC_AttitudeControl *attitude = AC_AttitudeControl::get_singleton();
// Method 1: Rate control
attitude->set_rate_roll(input.roll);
attitude->set_rate_pitch(input.pitch);
attitude->set_rate_yaw(input.yaw);
attitude->set_throttle(input.throttle);
attitude->rate_controller_run();
// Method 2: Angle control
attitude->set_attitude_target_euler(roll, pitch, yaw);
attitude->angle_controller_run();
// Get current attitude
Vector3f euler = attitude->get_roll_pitch_yaw();
AC_Loiter (Loiter Controller)¶
Header: libraries/AC_WPNav/AC_Loiter.h
Inheritance: Part of AC_AttitudeControl
Description: Position hold controller using GPS. Maintains hover position using position and velocity control.
Class Definition:
-
class AC_Loiter¶
Public Functions
-
AC_Loiter(const AP_AHRS_View &ahrs, AC_PosControl &pos_control, const AC_AttitudeControl &attitude_control)¶
Constructor.
-
AC_Loiter(const AP_AHRS_View &ahrs, AC_PosControl &pos_control, const AC_AttitudeControl &attitude_control)¶
Main Control Methods:
Target Setting:
-
void AC_Loiter::set_desired_position(float x, float y, float z)¶
Set desired position.
- Parameters:
x – North position in meters
y – East position in meters
z – Altitude in meters
-
void AC_Loiter::set_desired_velocity(Vector2f velocity_ef)¶
Set desired velocity.
- Parameters:
velocity_ef – Target velocity
State Checking:
Speed Control:
-
void AC_Loiter::set_speed_xy(float speed_cms)¶
Set horizontal speed limit.
- Parameters:
speed_cms – Speed in cm/s
-
void AC_Loiter::set_speed_z(float speed_cms)¶
Set vertical speed limit.
- Parameters:
speed_cms – Speed in cm/s
Usage Example:
AC_Loiter *loiter = AC_Loiter::get_singleton();
// Start loiter at current position
loiter->init();
loiter->pos_control_start();
// In main loop
loiter->update();
// Check if active
if (loiter->is_active()) {
// Currently holding position
}
// Set new target position
loiter->set_desired_position(x, y, z);
AC_PosControl (Position Control)¶
Header: libraries/AC_AttitudeControl/AC_PosControl.h
Inheritance: Part of AC_AttitudeControl
Description: Position control for vehicles.
Class Definition:
-
class AC_PosControl¶
Public Functions
-
AC_PosControl(AP_AHRS_View &ahrs, const class AP_Motors &motors, AC_AttitudeControl &attitude_control)¶
Constructor.
-
void update_estimates(bool high_vibes = false)¶
System methods
-
void input_pos_NED_m(const Vector3p &pos_ned_m, float pos_terrain_target_d_m, float terrain_margin_m)¶
3D position shaper
-
void NE_set_max_speed_accel_cm(float speed_cms, float accel_cmss)¶
Lateral position controller
-
void D_set_max_speed_accel_cm(float decent_speed_max_cms, float climb_speed_max_cms, float accel_max_u_cmss)¶
Vertical position controller
-
inline float get_max_speed_down_ms() const¶
Returns maximum descent rate in m/s (zero or positive).
-
void set_pos_vel_accel_NED_m(const Vector3p &pos_ned_m, const Vector3f &vel_ned_ms, const Vector3f &accel_ned_mss)¶
Accessors
-
inline const Vector3p &get_pos_estimate_NED_m() const¶
Position.
-
void get_stopping_point_NE_m(Vector2p &stopping_point_ne_m) const¶
Stopping Point.
-
inline const Vector3f get_pos_error_NED_m() const¶
Position Error.
-
inline const Vector3f &get_vel_estimate_NED_ms() const¶
Velocity.
-
inline void set_accel_desired_NE_mss(const Vector2f &accel_desired_ne_mss)¶
Acceleration.
-
inline void set_pos_terrain_target_U_cm(float pos_terrain_target_u_cm)¶
Terrain.
-
void set_posvelaccel_offset_target_NE_m(const Vector2p &pos_offset_target_ne_m, const Vector2f &vel_offset_target_ne_ms, const Vector2f &accel_offset_target_ne_mss)¶
Offset.
-
inline float get_roll_rad() const¶
Outputs.
-
float get_lean_angle_max_rad() const¶
Accessors
-
inline AC_P_2D &NE_get_pos_p()¶
Other.
-
AC_PosControl(AP_AHRS_View &ahrs, const class AP_Motors &motors, AC_AttitudeControl &attitude_control)¶