Skip to content

Commit 72d1f41

Browse files
committed
PidStatePID_s
1 parent 2618562 commit 72d1f41

8 files changed

Lines changed: 104 additions & 129 deletions

File tree

examples/11.QuadcopterAdvanced/main_quadadv.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,9 @@ Yaw right (CCW+ CW-) -++-
201201
out.set_output(motor_outputs[3], thr);
202202
}else{
203203
// Quad mixing
204-
out.set_output(motor_outputs[0], thr - pid.pitch - pid.roll - pid.yaw); //M1 Back Right CW
205-
out.set_output(motor_outputs[1], thr + pid.pitch - pid.roll + pid.yaw); //M2 Front Right CCW
206-
out.set_output(motor_outputs[2], thr - pid.pitch + pid.roll + pid.yaw); //M3 Back Left CCW
207-
out.set_output(motor_outputs[3], thr + pid.pitch + pid.roll - pid.yaw); //M4 Front Left CW
204+
out.set_output(motor_outputs[0], thr - pid.pitch.sum - pid.roll.sum - pid.yaw.sum); //M1 Back Right CW
205+
out.set_output(motor_outputs[1], thr + pid.pitch.sum - pid.roll.sum + pid.yaw.sum); //M2 Front Right CCW
206+
out.set_output(motor_outputs[2], thr - pid.pitch.sum + pid.roll.sum + pid.yaw.sum); //M3 Back Left CCW
207+
out.set_output(motor_outputs[3], thr + pid.pitch.sum + pid.roll.sum - pid.yaw.sum); //M4 Front Left CW
208208
}
209209
}

src/bbx/bbx.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -271,20 +271,18 @@ void Bbx::log_pid(PidState *pid_s) {
271271
BinLog bl("PID");
272272
bl.keepFree = QUEUE_LENGTH/4; //keep 25% of queue free for other messages
273273
bl.TimeUS(pid_s->ts);
274-
bl.i16("rp", pid_s->roll_p * 1000, 1e-3);
275-
bl.i16("ri", pid_s->roll_i * 1000, 1e-3);
276-
bl.i16("rd", pid_s->roll_d * 1000, 1e-3);
277-
bl.i16("roll", pid_s->roll * 1000, 1e-3);
278-
bl.i16("pp", pid_s->pitch_p * 1000, 1e-3);
279-
bl.i16("pi", pid_s->pitch_i * 1000, 1e-3);
280-
bl.i16("pd", pid_s->pitch_d * 1000, 1e-3);
281-
bl.i16("pitch", pid_s->pitch * 1000, 1e-3);
282-
bl.i16("yp", pid_s->yaw_p * 1000, 1e-3);
283-
bl.i16("yi", pid_s->yaw_i * 1000, 1e-3);
284-
bl.i16("yd", pid_s->yaw_d * 1000, 1e-3);
285-
bl.i16("yaw", pid_s->yaw * 1000, 1e-3);
286-
bl.i16("throttle", pid_s->throttle * 1000, 1e-3);
287-
bl.flt("debug", pid_s->debug);
274+
bl.i16("rp", pid_s->roll.p * 1000, 1e-3);
275+
bl.i16("ri", pid_s->roll.i * 1000, 1e-3);
276+
bl.i16("rd", pid_s->roll.d * 1000, 1e-3);
277+
bl.i16("roll", pid_s->roll.sum * 1000, 1e-3);
278+
bl.i16("pp", pid_s->pitch.p * 1000, 1e-3);
279+
bl.i16("pi", pid_s->pitch.i * 1000, 1e-3);
280+
bl.i16("pd", pid_s->pitch.d * 1000, 1e-3);
281+
bl.i16("pitch", pid_s->pitch.sum * 1000, 1e-3);
282+
bl.i16("yp", pid_s->yaw.p * 1000, 1e-3);
283+
bl.i16("yi", pid_s->yaw.i * 1000, 1e-3);
284+
bl.i16("yd", pid_s->yaw.d * 1000, 1e-3);
285+
bl.i16("yaw", pid_s->yaw.sum * 1000, 1e-3);
288286
}
289287

290288
//MODE - flight mode

src/cli/cli.cpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -199,40 +199,42 @@ static void cli_pah() {
199199
static void cli_ppid() {
200200
PidState pid_s;
201201
pid.topic.pull_last(&pid_s); //get a consistent copy
202-
Serial.printf("pid.roll:%+.3f\t",pid_s.roll);
203-
Serial.printf("pitch:%+.3f\t",pid_s.pitch);
204-
Serial.printf("yaw:%+.3f\t",pid_s.yaw);
205-
Serial.printf("debug:%f\t",pid_s.debug);
202+
Serial.printf("pid.roll:%+.3f\t",pid_s.roll.sum);
203+
Serial.printf("pitch:%+.3f\t",pid_s.pitch.sum);
204+
Serial.printf("yaw:%+.3f\t",pid_s.yaw.sum);
206205
}
207206

208207
static void cli_ppidr() {
209208
PidState pid_s;
210209
pid.topic.pull_last(&pid_s); //get a consistent copy
211-
Serial.printf("pidr.roll:%+.3f\t",pid_s.roll);
212-
Serial.printf("P:%+.3f\t",pid_s.roll_p);
213-
Serial.printf("I:%+.3f\t",pid_s.roll_i);
214-
Serial.printf("D:%+.3f\t",pid_s.roll_d);
215-
Serial.printf("F:%+.3f\t",pid_s.roll_f);
210+
Serial.printf("pidr.roll:%+.3f\t",pid_s.roll.sum);
211+
Serial.printf("P:%+.3f\t",pid_s.roll.p);
212+
Serial.printf("I:%+.3f\t",pid_s.roll.i);
213+
Serial.printf("D:%+.3f\t",pid_s.roll.d);
214+
Serial.printf("A:%+.3f\t",pid_s.roll.a);
215+
Serial.printf("B:%+.3f\t",pid_s.roll.b);
216216
}
217217

218218
static void cli_ppidp() {
219219
PidState pid_s;
220220
pid.topic.pull_last(&pid_s); //get a consistent copy
221-
Serial.printf("pidp.pitch:%+.3f\t",pid.pitch);
222-
Serial.printf("P:%+.3f\t",pid_s.pitch_p);
223-
Serial.printf("I:%+.3f\t",pid_s.pitch_i);
224-
Serial.printf("D:%+.3f\t",pid_s.pitch_d);
225-
Serial.printf("F:%+.3f\t",pid_s.pitch_f);
221+
Serial.printf("pidp.pitch:%+.3f\t",pid.pitch.sum);
222+
Serial.printf("P:%+.3f\t",pid_s.pitch.p);
223+
Serial.printf("I:%+.3f\t",pid_s.pitch.i);
224+
Serial.printf("D:%+.3f\t",pid_s.pitch.d);
225+
Serial.printf("A:%+.3f\t",pid_s.pitch.a);
226+
Serial.printf("B:%+.3f\t",pid_s.pitch.b);
226227
}
227228

228229
static void cli_ppidy() {
229230
PidState pid_s;
230231
pid.topic.pull_last(&pid_s); //get a consistent copy
231-
Serial.printf("pidy.yaw:%+.3f\t",pid_s.yaw);
232-
Serial.printf("P:%+.3f\t",pid_s.yaw_p);
233-
Serial.printf("I:%+.3f\t",pid_s.yaw_i);
234-
Serial.printf("D:%+.3f\t",pid_s.yaw_d);
235-
Serial.printf("F:%+.3f\t",pid_s.yaw_f);
232+
Serial.printf("pidy.yaw:%+.3f\t",pid_s.yaw.sum);
233+
Serial.printf("P:%+.3f\t",pid_s.yaw.p);
234+
Serial.printf("I:%+.3f\t",pid_s.yaw.i);
235+
Serial.printf("D:%+.3f\t",pid_s.yaw.d);
236+
Serial.printf("A:%+.3f\t",pid_s.yaw.a);
237+
Serial.printf("B:%+.3f\t",pid_s.yaw.b);
236238
}
237239

238240
static void cli_pout() {

src/pid/PidGizmoMF0.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,20 @@ void PidGizmoMF0::control_Angle(bool zero_integrators) {
127127
integral_roll += error_roll * imu.dt;
128128
integral_roll = constrain(integral_roll, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
129129
float derivative_roll = ahr.gx;
130-
pid.roll_p = Kp_ro_pi_angle * error_roll;
131-
pid.roll_i = Ki_ro_pi_angle * integral_roll;
132-
pid.roll_d = -Kd_ro_pi_angle * derivative_roll;
133-
pid.roll = pid.roll_p + pid.roll_i + pid.roll_d;
130+
pid.roll.p = Kp_ro_pi_angle * error_roll;
131+
pid.roll.i = Ki_ro_pi_angle * integral_roll;
132+
pid.roll.d = -Kd_ro_pi_angle * derivative_roll;
133+
pid.roll.sum = pid.roll.p + pid.roll.i + pid.roll.d;
134134

135135
//Pitch PID
136136
float error_pitch = pitch_des - ahr.pitch;
137137
integral_pitch += error_pitch * imu.dt;
138138
integral_pitch = constrain(integral_pitch, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
139139
float derivative_pitch = ahr.gy;
140-
pid.pitch_p = Kp_ro_pi_angle * error_pitch;
141-
pid.pitch_i = Ki_ro_pi_angle * integral_pitch;
142-
pid.pitch_d = -Kd_ro_pi_angle * derivative_pitch;
143-
pid.pitch = pid.pitch_p + pid.pitch_i + pid.pitch_d;
140+
pid.pitch.p = Kp_ro_pi_angle * error_pitch;
141+
pid.pitch.i = Ki_ro_pi_angle * integral_pitch;
142+
pid.pitch.d = -Kd_ro_pi_angle * derivative_pitch;
143+
pid.pitch.sum = pid.pitch.p + pid.pitch.i + pid.pitch.d;
144144

145145
//Yaw PID
146146
if(-0.02 < rcl.yaw && rcl.yaw < 0.02) {
@@ -151,10 +151,10 @@ void PidGizmoMF0::control_Angle(bool zero_integrators) {
151151
float error_yaw = degreeModulus(yaw_desired - ahr.yaw);
152152
float desired_yawRate = error_yaw / 0.5; //set desired yawRate such that it gets us to desired yaw in 0.5 second
153153
float derivative_yaw = desired_yawRate - ahr.gz;
154-
pid.yaw_p = Kp_yaw_angle * error_yaw;
155-
pid.yaw_i = Kd_yaw_angle * derivative_yaw;
156-
pid.yaw_d = 0;
157-
pid.yaw = pid.yaw_p + pid.yaw_i + pid.yaw_d;
154+
pid.yaw.p = Kp_yaw_angle * error_yaw;
155+
pid.yaw.i = Kd_yaw_angle * derivative_yaw;
156+
pid.yaw.d = 0;
157+
pid.yaw.sum = pid.yaw.p + pid.yaw.i + pid.yaw.d;
158158

159159
//update yaw rate controller
160160
error_yawRate_prev = 0;
@@ -164,10 +164,10 @@ void PidGizmoMF0::control_Angle(bool zero_integrators) {
164164
integral_yawRate += error_yawRate * imu.dt;
165165
integral_yawRate = constrain(integral_yawRate, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
166166
float derivative_yawRate = (error_yawRate - error_yawRate_prev) / imu.dt;
167-
pid.yaw_p = Kp_yaw_rate * error_yawRate;
168-
pid.yaw_i = Ki_yaw_rate * integral_yawRate;
169-
pid.yaw_d = Kd_yaw_rate * derivative_yawRate;
170-
pid.yaw = pid.yaw_p + pid.yaw_i + pid.yaw_d;
167+
pid.yaw.p = Kp_yaw_rate * error_yawRate;
168+
pid.yaw.i = Ki_yaw_rate * integral_yawRate;
169+
pid.yaw.d = Kd_yaw_rate * derivative_yawRate;
170+
pid.yaw.sum = pid.yaw.p + pid.yaw.i + pid.yaw.d;
171171

172172
//Update derivative variables
173173
error_yawRate_prev = error_yawRate;
@@ -206,30 +206,30 @@ void PidGizmoMF0::control_Rate(bool zero_integrators) {
206206
integral_roll += error_roll * imu.dt;
207207
integral_roll = constrain(integral_roll, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
208208
float derivative_roll = (error_roll - error_roll_prev) / imu.dt;
209-
pid.roll_p = Kp_ro_pi_rate * error_roll;
210-
pid.roll_i = Ki_ro_pi_rate * integral_roll;
211-
pid.roll_d = Kd_ro_pi_rate * derivative_roll;
212-
pid.roll = pid.roll_p + pid.roll_i + pid.roll_d;
209+
pid.roll.p = Kp_ro_pi_rate * error_roll;
210+
pid.roll.i = Ki_ro_pi_rate * integral_roll;
211+
pid.roll.d = Kd_ro_pi_rate * derivative_roll;
212+
pid.roll.sum = pid.roll.p + pid.roll.i + pid.roll.d;
213213

214214
//Pitch
215215
float error_pitch = pitchRate_des - ahr.gy;
216216
integral_pitch += error_pitch * imu.dt;
217217
integral_pitch = constrain(integral_pitch, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
218218
float derivative_pitch = (error_pitch - error_pitch_prev) / imu.dt;
219-
pid.pitch_p = Kp_ro_pi_rate * error_pitch;
220-
pid.pitch_i = Ki_ro_pi_rate * integral_pitch;
221-
pid.pitch_d = Kd_ro_pi_rate * derivative_pitch;
222-
pid.pitch = pid.pitch_p + pid.pitch_i + pid.pitch_d;
219+
pid.pitch.p = Kp_ro_pi_rate * error_pitch;
220+
pid.pitch.i = Ki_ro_pi_rate * integral_pitch;
221+
pid.pitch.d = Kd_ro_pi_rate * derivative_pitch;
222+
pid.pitch.sum = pid.pitch.p + pid.pitch.i + pid.pitch.d;
223223

224224
//Yaw, stablize on rate from GyroZ
225225
float error_yaw = yawRate_des - ahr.gz;
226226
integral_yaw += error_yaw * imu.dt;
227227
integral_yaw = constrain(integral_yaw, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
228228
float derivative_yaw = (error_yaw - error_yaw_prev) / imu.dt;
229-
pid.yaw_p = Kp_yaw_rate * error_yaw;
230-
pid.yaw_i = Ki_yaw_rate * integral_yaw;
231-
pid.yaw_d = Kd_yaw_rate * derivative_yaw;
232-
pid.yaw = pid.yaw_p + pid.yaw_i + pid.yaw_d;
229+
pid.yaw.p = Kp_yaw_rate * error_yaw;
230+
pid.yaw.i = Ki_yaw_rate * integral_yaw;
231+
pid.yaw.d = Kd_yaw_rate * derivative_yaw;
232+
pid.yaw.sum = pid.yaw.p + pid.yaw.i + pid.yaw.d;
233233

234234
//Update derivative variables
235235
error_roll_prev = error_roll;

src/pid/PidGizmoMF1.cpp

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,21 @@ void PidGizmoMF1::control_Angle() {
117117
integral_roll += Ki_ro_pi_angle * error_roll * imu.dt;
118118
integral_roll = constrain(integral_roll, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
119119
float derivative_roll = ahr.gx;
120-
pid.roll_p = Kp_ro_pi_angle * error_roll;
121-
pid.roll_i = integral_roll;
122-
pid.roll_d = -Kd_ro_pi_angle * derivative_roll;
123-
pid.roll = pid.roll_p + pid.roll_i + pid.roll_d;
120+
pid.roll.p = Kp_ro_pi_angle * error_roll;
121+
pid.roll.i = integral_roll;
122+
pid.roll.d = -Kd_ro_pi_angle * derivative_roll;
123+
pid.roll.sum = pid.roll.p + pid.roll.i + pid.roll.d;
124124

125125
//Pitch Angle PID
126126
float pitch_des = rcl.pitch * maxPitch; //Desired pitch angle, between -maxPitch and +maxPitch
127127
float error_pitch = pitch_des - ahr.pitch;
128128
integral_pitch += Ki_ro_pi_angle * error_pitch * imu.dt;
129129
integral_pitch = constrain(integral_pitch, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
130130
float derivative_pitch = ahr.gy;
131-
pid.pitch_p = Kp_ro_pi_angle * error_pitch;
132-
pid.pitch_i = integral_pitch;
133-
pid.pitch_d = -Kd_ro_pi_angle * derivative_pitch;
134-
pid.pitch = pid.pitch_p + pid.pitch_i + pid.pitch_d;
131+
pid.pitch.p = Kp_ro_pi_angle * error_pitch;
132+
pid.pitch.i = integral_pitch;
133+
pid.pitch.d = -Kd_ro_pi_angle * derivative_pitch;
134+
pid.pitch.sum = pid.pitch.p + pid.pitch.i + pid.pitch.d;
135135

136136
//Yaw Angle PID
137137
if(-0.02 < rcl.yaw && rcl.yaw < 0.02) {
@@ -141,14 +141,18 @@ void PidGizmoMF1::control_Angle() {
141141
//do not update desired yaw angle (keep position when got out of yaw-rate mode)
142142
integral_yaw_rate = 0; //reset yaw rate integrator
143143
control_YawRate(yawRate_des, &integral_yaw_angle); //use angle integrator
144-
pid.debug = FLAG_ANGLE_YAWCENTER;
144+
145+
//debug
146+
pid.yaw.a = FLAG_ANGLE_YAWCENTER;
145147
}else{
146148
//stick off-center - control yaw rate
147149
float yawRate_des = rcl.yaw * maxYawRate; //Desired yaw rate, between -maxYawRate and +maxYawRate
148150
yaw_angle_desired = ahr.yaw; //set desired yaw to current yaw, the yaw angle controller will hold this value
149151
integral_yaw_angle = 0; //reset angle integrator
150152
control_YawRate(yawRate_des, &integral_yaw_rate); //use rate integrator
151-
pid.debug = FLAG_ANGLE_YAW;
153+
154+
//debug
155+
pid.yaw.a = FLAG_ANGLE_YAW;
152156
}
153157
}
154158

@@ -159,10 +163,10 @@ void PidGizmoMF1::control_Rate() {
159163
integral_roll += Ki_ro_pi_rate * error_roll * imu.dt;
160164
integral_roll = constrain(integral_roll, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
161165
float derivative_roll = (error_roll - error_roll_prev) / imu.dt;
162-
pid.roll_p = Kp_ro_pi_rate * error_roll;
163-
pid.roll_i = integral_roll;
164-
pid.roll_d = Kd_ro_pi_rate * derivative_roll;
165-
pid.roll = pid.roll_p + pid.roll_i + pid.roll_d;
166+
pid.roll.p = Kp_ro_pi_rate * error_roll;
167+
pid.roll.i = integral_roll;
168+
pid.roll.d = Kd_ro_pi_rate * derivative_roll;
169+
pid.roll.sum = pid.roll.p + pid.roll.i + pid.roll.d;
166170
error_roll_prev = error_roll; //Update derivative variable
167171

168172
//Pitch Rate - Stabilize on rate from GyroY
@@ -171,17 +175,18 @@ void PidGizmoMF1::control_Rate() {
171175
integral_pitch += Ki_ro_pi_rate * error_pitch * imu.dt;
172176
integral_pitch = constrain(integral_pitch, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
173177
float derivative_pitch = (error_pitch - error_pitch_prev) / imu.dt;
174-
pid.pitch_p = Kp_ro_pi_rate * error_pitch;
175-
pid.pitch_i = integral_pitch;
176-
pid.pitch_d = Kd_ro_pi_rate * derivative_pitch;
177-
pid.pitch = pid.pitch_p + pid.pitch_i + pid.pitch_d;
178+
pid.pitch.p = Kp_ro_pi_rate * error_pitch;
179+
pid.pitch.i = integral_pitch;
180+
pid.pitch.d = Kd_ro_pi_rate * derivative_pitch;
181+
pid.pitch.sum = pid.pitch.p + pid.pitch.i + pid.pitch.d;
178182
error_pitch_prev = error_pitch; //Update derivative variable
179183

180184
//Yaw Rate
181185
float yawRate_des = rcl.yaw * maxYawRate;
182186
control_YawRate(yawRate_des, &integral_yaw_rate);
183187

184-
pid.debug = FLAG_RATE;
188+
//debug
189+
pid.yaw.a = FLAG_RATE;
185190
}
186191

187192
//Yaw Rate - Stabilize on rate from GyroZ, yawRate_des = Desired Yaw Rate, between-maxYawRate and +maxYawRate
@@ -190,9 +195,9 @@ void PidGizmoMF1::control_YawRate(float yawRate_des, float* integral_yaw) {
190195
*integral_yaw += Ki_yaw_rate * error_yaw * imu.dt;
191196
*integral_yaw = constrain(*integral_yaw, -i_limit, i_limit); //Saturate integrator to prevent unsafe buildup
192197
float derivative_yaw = (error_yaw - error_yaw_prev) / imu.dt;
193-
pid.yaw_p = Kp_yaw_rate * error_yaw;
194-
pid.yaw_i = *integral_yaw;
195-
pid.yaw_d = Kd_yaw_rate * derivative_yaw;
196-
pid.yaw = pid.yaw_p + pid.yaw_i + pid.yaw_d;
198+
pid.yaw.p = Kp_yaw_rate * error_yaw;
199+
pid.yaw.i = *integral_yaw;
200+
pid.yaw.d = Kd_yaw_rate * derivative_yaw;
201+
pid.yaw.sum = pid.yaw.p + pid.yaw.i + pid.yaw.d;
197202
error_yaw_prev = error_yaw; //Update derivative variable
198203
}

src/pid/PidGizmoMF2.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void PidGizmoMF2::setup() {
7676
stick = &rcl.roll;
7777
gyro = &ahr.gx;
7878
ahrs_angle = &ahr.roll;
79-
state = (PidStatePIDFS_s*)(&pid.roll_p);
79+
state = (PidStatePID_s*) &pid.roll;
8080
pid_dt = 1.0f / imu.getSampleRate();
8181
load_param();
8282
zeroIntegrators();
@@ -139,8 +139,7 @@ void PidGizmoMF2::control_axis(int axis, float setpoint) {
139139
state[axis].sum = state[axis].p + state[axis].i + state[axis].d;
140140
p[axis].error_prev = error;
141141

142-
//if(axis==0) pid.debug = p[axis].kp * 1000000;
143-
//if(axis==0) pid.debug = state[axis].p * 1000;
144-
//pid.debug = pid_dt;
145-
if(axis==0) pid.debug = state[axis].p * 1000;
142+
//debug
143+
state[axis].a = p[axis].ki;
144+
state[axis].b = pid_dt;
146145
}

src/pid/PidGizmoMF2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ class PidGizmoMF2 : public PidGizmo {
6464
float *stick; //roll/pitch/yaw stick
6565
float *gyro; //gx,gy,gz
6666
float *ahrs_angle; //roll/pitch/yaw
67-
PidStatePIDFS_s *state; //roll/pitch/yaw P,I,D,F,Sum
67+
PidStatePID_s *state; //roll/pitch/yaw
6868
};

0 commit comments

Comments
 (0)