Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/libraries/AC_AttitudeControl/AC_AttitudeControl_Sub.h
9644 views
1
#pragma once
2
3
/// @file AC_AttitudeControl_Sub.h
4
/// @brief ArduSub attitude control library
5
6
#include "AC_AttitudeControl.h"
7
#include <AP_Motors/AP_MotorsMulticopter.h>
8
9
// default angle controller PID gains
10
// (Sub-specific defaults for parent class)
11
#define AC_ATC_SUB_ANGLE_P 6.0f
12
#define AC_ATC_SUB_ACCEL_Y_MAX 110000.0f
13
14
// default rate controller PID gains
15
#define AC_ATC_SUB_RATE_RP_P 0.135f
16
#define AC_ATC_SUB_RATE_RP_I 0.090f
17
#define AC_ATC_SUB_RATE_RP_D 0.0036f
18
#define AC_ATC_SUB_RATE_RP_IMAX 0.444f
19
#define AC_ATC_SUB_RATE_RP_FILT_HZ 30.0f
20
#define AC_ATC_SUB_RATE_YAW_P 0.180f
21
#define AC_ATC_SUB_RATE_YAW_I 0.018f
22
#define AC_ATC_SUB_RATE_YAW_D 0.0f
23
#define AC_ATC_SUB_RATE_YAW_IMAX 0.222f
24
#define AC_ATC_SUB_RATE_YAW_FILT_HZ 5.0f
25
26
#define MAX_YAW_ERROR radians(5)
27
28
class AC_AttitudeControl_Sub : public AC_AttitudeControl {
29
public:
30
AC_AttitudeControl_Sub(AP_AHRS_View &ahrs, AP_MotorsMulticopter& motors);
31
32
// empty destructor to suppress compiler warning
33
virtual ~AC_AttitudeControl_Sub() {}
34
35
// pid accessors
36
AC_PID& get_rate_roll_pid() override { return _pid_rate_roll; }
37
AC_PID& get_rate_pitch_pid() override { return _pid_rate_pitch; }
38
AC_PID& get_rate_yaw_pid() override { return _pid_rate_yaw; }
39
const AC_PID& get_rate_roll_pid() const override { return _pid_rate_roll; }
40
const AC_PID& get_rate_pitch_pid() const override { return _pid_rate_pitch; }
41
const AC_PID& get_rate_yaw_pid() const override { return _pid_rate_yaw; }
42
43
// Update Alt_Hold angle maximum
44
void update_althold_lean_angle_max(float throttle_in) override;
45
46
// Set output throttle
47
void set_throttle_out(float throttle_in, bool apply_angle_boost, float filt_cutoff) override;
48
49
// Calculate body-frame throttle required to produce the given earth-frame throttle input (accounts for vehicle tilt)
50
float get_throttle_boosted(float throttle_in);
51
52
// Set desired throttle vs attitude mixing (actual mix is slewed toward this value over 1~2 seconds)
53
// Low values favor pilot/autopilot throttle over attitude control; high values prioritize attitude control
54
// Has no effect when throttle is above hover throttle
55
void set_throttle_mix_min() override { _throttle_rpy_mix_desired = _thr_mix_min; }
56
void set_throttle_mix_man() override { _throttle_rpy_mix_desired = _thr_mix_man; }
57
void set_throttle_mix_max(float ratio) override { _throttle_rpy_mix_desired = _thr_mix_max; }
58
59
// Returns true if throttle mix is near minimum (i.e., attitude control is deprioritised)
60
bool is_throttle_mix_min() const override { return (_throttle_rpy_mix < 1.25f*_thr_mix_min); }
61
62
// run lowest level body-frame rate controller and send outputs to the motors
63
void rate_controller_run() override;
64
65
// sanity check parameters. should be called once before take-off
66
void parameter_sanity_check() override;
67
68
// set the PID notch sample rates
69
void set_notch_sample_rate(float sample_rate) override;
70
71
// Sets desired roll, pitch, and yaw angles (in centidegrees), with yaw slewing.
72
// Slews toward target yaw at a fixed rate (in centidegrees/s) until the error is within 5 degrees.
73
// Used to enforce consistent heading changes without large instantaneous yaw errors.
74
void input_euler_angle_roll_pitch_slew_yaw_cd(float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_angle_cd, float slew_yaw_rate_cds);
75
76
// user settable parameters
77
static const struct AP_Param::GroupInfo var_info[];
78
79
protected:
80
81
// Slews the throttle-to-attitude mix ratio (_throttle_rpy_mix) toward the requested value (_throttle_rpy_mix_desired).
82
// Increases rapidly and decreases more slowly to ensure stability during transitions.
83
void update_throttle_rpy_mix();
84
85
// Returns a throttle value that accounts for the priority of attitude control over throttle.
86
// This allows graceful reduction of control authority as thrust approaches its minimum.
87
// returns a throttle including compensation for roll/pitch angle
88
// throttle value should be 0 ~ 1
89
float get_throttle_avg_max(float throttle_in);
90
91
AP_MotorsMulticopter& _motors_multi;
92
93
// Roll and Pitch rate PIDs share the same defaults:
94
const AC_PID::Defaults rp_defaults {
95
AC_PID::Defaults{
96
.p = AC_ATC_SUB_RATE_RP_P,
97
.i = AC_ATC_SUB_RATE_RP_I,
98
.d = AC_ATC_SUB_RATE_RP_D,
99
.ff = 0.0f,
100
.imax = AC_ATC_SUB_RATE_RP_IMAX,
101
.filt_T_hz = AC_ATC_SUB_RATE_RP_FILT_HZ,
102
.filt_E_hz = 0.0,
103
.filt_D_hz = AC_ATC_SUB_RATE_RP_FILT_HZ,
104
.srmax = 0,
105
.srtau = 1.0
106
}
107
};
108
AC_PID _pid_rate_roll { rp_defaults };
109
AC_PID _pid_rate_pitch { rp_defaults };
110
111
AC_PID _pid_rate_yaw {
112
AC_PID::Defaults{
113
.p = AC_ATC_SUB_RATE_YAW_P,
114
.i = AC_ATC_SUB_RATE_YAW_I,
115
.d = AC_ATC_SUB_RATE_YAW_D,
116
.ff = 0.0f,
117
.imax = AC_ATC_SUB_RATE_YAW_IMAX,
118
.filt_T_hz = AC_ATC_SUB_RATE_YAW_FILT_HZ,
119
.filt_E_hz = 0.0f,
120
.filt_D_hz = AC_ATC_SUB_RATE_YAW_FILT_HZ,
121
.srmax = 0,
122
.srtau = 1.0
123
}
124
};
125
126
AP_Float _thr_mix_man; // throttle vs attitude control prioritisation used when using manual throttle (higher values mean we prioritise attitude control over throttle)
127
AP_Float _thr_mix_min; // throttle vs attitude control prioritisation used when landing (higher values mean we prioritise attitude control over throttle)
128
AP_Float _thr_mix_max; // throttle vs attitude control prioritisation used during active flight (higher values mean we prioritise attitude control over throttle)
129
};
130
131