mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-07 08:28:30 -04:00
35bf288abd
Before: -> After Stabilize P –> Stabilize P (Use NG values, or 8.3 x the older AC2 value) Stabilize I –> Stabilize I (Stays same value) Stabilize D –> Rate P (Stays same value) –> Rate I (new) Added a new value – an I term for rate. The old stabilization routines did not use this term. Please refer to the config.h file to read more about the new PIDs. Added framework for using DCM corrected Accelerometer rates. Code is commented out for now. Added set home at Arming. Crosstrack is now a full PID loop, rather than just a P gain for more control. Throttle now slews when switching out of Alt hold or Auto modes for less jarring transitions Sonar and Baro PIDs are now combined into a throttle PID Yaw control is completely re-written. Added Octa_Quad support - Max git-svn-id: https://arducopter.googlecode.com/svn/trunk@2836 f9c3cf11-9bcb-44bc-f272-b75c42450872
160 lines
4.9 KiB
Plaintext
160 lines
4.9 KiB
Plaintext
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
|
|
#if FRAME_CONFIG == OCTA_QUAD_FRAME
|
|
|
|
void output_motors_armed()
|
|
{
|
|
int roll_out, pitch_out;
|
|
int out_min = g.rc_3.radio_min;
|
|
|
|
// Throttle is 0 to 1000 only
|
|
g.rc_3.servo_out = constrain(g.rc_3.servo_out, 0, 1000);
|
|
|
|
if(g.rc_3.servo_out > 0)
|
|
out_min = g.rc_3.radio_min + MINIMUM_THROTTLE;
|
|
|
|
g.rc_1.calc_pwm();
|
|
g.rc_2.calc_pwm();
|
|
g.rc_3.calc_pwm();
|
|
g.rc_4.calc_pwm();
|
|
|
|
if(g.frame_orientation == X_FRAME){
|
|
roll_out = (float)g.rc_1.pwm_out * .707;
|
|
pitch_out = (float)g.rc_2.pwm_out * .707;
|
|
|
|
// Front Left
|
|
motor_out[CH_7] = ((g.rc_3.radio_out * g.top_bottom_ratio) + roll_out + pitch_out); // CCW TOP
|
|
motor_out[CH_8] = g.rc_3.radio_out + roll_out + pitch_out; // CW
|
|
|
|
// Front Right
|
|
motor_out[CH_10] = ((g.rc_3.radio_out * g.top_bottom_ratio) - roll_out + pitch_out); // CCW TOP
|
|
motor_out[CH_11] = g.rc_3.radio_out - roll_out + pitch_out; // CW
|
|
|
|
// Back Left
|
|
motor_out[CH_3] = ((g.rc_3.radio_out * g.top_bottom_ratio) + roll_out - pitch_out); // CCW TOP
|
|
motor_out[CH_4] = g.rc_3.radio_out + roll_out - pitch_out; // CW
|
|
|
|
// Back Right
|
|
motor_out[CH_1] = ((g.rc_3.radio_out * g.top_bottom_ratio) - roll_out - pitch_out); // CCW TOP
|
|
motor_out[CH_2] = g.rc_3.radio_out - roll_out - pitch_out; // CW
|
|
|
|
|
|
|
|
}if(g.frame_orientation == PLUS_FRAME){
|
|
roll_out = g.rc_1.pwm_out;
|
|
pitch_out = g.rc_2.pwm_out;
|
|
|
|
// Left
|
|
motor_out[CH_7] = (g.rc_3.radio_out * g.top_bottom_ratio) - roll_out; // CCW TOP
|
|
motor_out[CH_8] = g.rc_3.radio_out - roll_out; // CW
|
|
|
|
// Right
|
|
motor_out[CH_1] = (g.rc_3.radio_out * g.top_bottom_ratio) + roll_out; // CCW TOP
|
|
motor_out[CH_2] = g.rc_3.radio_out + roll_out; // CW
|
|
|
|
// Front
|
|
motor_out[CH_10] = (g.rc_3.radio_out * g.top_bottom_ratio) + pitch_out; // CCW TOP
|
|
motor_out[CH_11] = g.rc_3.radio_out + pitch_out; // CW
|
|
|
|
// Back
|
|
motor_out[CH_3] = (g.rc_3.radio_out * g.top_bottom_ratio) - pitch_out; // CCW TOP
|
|
motor_out[CH_4] = g.rc_3.radio_out - pitch_out; // CW
|
|
|
|
}
|
|
|
|
// Yaw
|
|
motor_out[CH_1] += g.rc_4.pwm_out; // CCW
|
|
motor_out[CH_3] += g.rc_4.pwm_out; // CCW
|
|
motor_out[CH_7] += g.rc_4.pwm_out; // CCW
|
|
motor_out[CH_10] += g.rc_4.pwm_out; // CCW
|
|
|
|
motor_out[CH_2] -= g.rc_4.pwm_out; // CW
|
|
motor_out[CH_4] -= g.rc_4.pwm_out; // CW
|
|
motor_out[CH_8] -= g.rc_4.pwm_out; // CW
|
|
motor_out[CH_11] -= g.rc_4.pwm_out; // CW
|
|
|
|
// limit output so motors don't stop
|
|
motor_out[CH_1] = max(motor_out[CH_1], out_min);
|
|
motor_out[CH_2] = max(motor_out[CH_2], out_min);
|
|
motor_out[CH_3] = max(motor_out[CH_3], out_min);
|
|
motor_out[CH_4] = max(motor_out[CH_4], out_min);
|
|
motor_out[CH_7] = max(motor_out[CH_7], out_min);
|
|
motor_out[CH_8] = max(motor_out[CH_8], out_min);
|
|
motor_out[CH_10] = max(motor_out[CH_10], out_min);
|
|
motor_out[CH_11] = max(motor_out[CH_11], out_min);
|
|
|
|
#if CUT_MOTORS == ENABLED
|
|
// Send commands to motors
|
|
if(g.rc_3.servo_out > 0){
|
|
APM_RC.OutputCh(CH_1, motor_out[CH_1]);
|
|
APM_RC.OutputCh(CH_2, motor_out[CH_2]);
|
|
APM_RC.OutputCh(CH_3, motor_out[CH_3]);
|
|
APM_RC.OutputCh(CH_4, motor_out[CH_4]);
|
|
APM_RC.OutputCh(CH_7, motor_out[CH_7]);
|
|
APM_RC.OutputCh(CH_8, motor_out[CH_8]);
|
|
APM_RC.OutputCh(CH_10, motor_out[CH_10]);
|
|
APM_RC.OutputCh(CH_11, motor_out[CH_11]);
|
|
|
|
// InstantPWM
|
|
APM_RC.Force_Out0_Out1();
|
|
APM_RC.Force_Out6_Out7();
|
|
APM_RC.Force_Out2_Out3();
|
|
}else{
|
|
APM_RC.OutputCh(CH_1, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_2, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_3, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_4, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_7, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_8, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_10, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_11, g.rc_3.radio_min);
|
|
}
|
|
#else
|
|
APM_RC.OutputCh(CH_1, motor_out[CH_1]);
|
|
APM_RC.OutputCh(CH_2, motor_out[CH_2]);
|
|
APM_RC.OutputCh(CH_3, motor_out[CH_3]);
|
|
APM_RC.OutputCh(CH_4, motor_out[CH_4]);
|
|
APM_RC.OutputCh(CH_7, motor_out[CH_7]);
|
|
APM_RC.OutputCh(CH_8, motor_out[CH_8]);
|
|
APM_RC.OutputCh(CH_10, motor_out[CH_10]);
|
|
APM_RC.OutputCh(CH_11, motor_out[CH_11]);
|
|
|
|
// InstantPWM
|
|
APM_RC.Force_Out0_Out1();
|
|
APM_RC.Force_Out6_Out7();
|
|
APM_RC.Force_Out2_Out3();
|
|
#endif
|
|
}
|
|
|
|
void output_motors_disarmed()
|
|
{
|
|
if(g.rc_3.control_in > 0){
|
|
// we have pushed up the throttle
|
|
// remove safety
|
|
motor_auto_armed = true;
|
|
}
|
|
|
|
// fill the motor_out[] array for HIL use
|
|
for (unsigned char i = 0; i < 11; i++) {
|
|
motor_out[i] = g.rc_3.radio_min;
|
|
}
|
|
|
|
// Send commands to motors
|
|
APM_RC.OutputCh(CH_1, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_2, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_3, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_4, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_7, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_8, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_10, g.rc_3.radio_min);
|
|
APM_RC.OutputCh(CH_11, g.rc_3.radio_min);
|
|
}
|
|
|
|
void output_motor_test()
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|