Yaw updates. 2.0.13

git-svn-id: https://arducopter.googlecode.com/svn/trunk@2403 f9c3cf11-9bcb-44bc-f272-b75c42450872
This commit is contained in:
jasonshort 2011-05-26 05:58:17 +00:00
parent 1ff40b053a
commit 8088f24427
4 changed files with 28 additions and 20 deletions

View File

@ -518,6 +518,11 @@ void fast_loop()
if (delta_ms_fast_loop > G_Dt_max)
G_Dt_max = delta_ms_fast_loop;
// Read radio
// ----------
if (APM_RC.GetState() == 1)
read_radio(); // read the radio first
// custom code/exceptions for flight modes
// ---------------------------------------
update_current_flight_mode();
@ -538,9 +543,6 @@ void fast_loop()
void medium_loop()
{
// Read radio
// ----------
read_radio(); // read the radio first
// reads all of the necessary trig functions for cameras, throttle, etc.
update_trig();
@ -984,6 +986,10 @@ void update_current_flight_mode(void)
// Output Pitch, Roll, Yaw and Throttle
// ------------------------------------
// are we at rest? reset nav_yaw
if(g.rc_3.control_in == 0){
nav_yaw = dcm.yaw_sensor;
}
// Yaw control
output_manual_yaw();
@ -1031,6 +1037,11 @@ void update_current_flight_mode(void)
limit_nav_pitch_roll(4500);
}
// are we at rest? reset nav_yaw
if(g.rc_3.control_in == 0){
nav_yaw = dcm.yaw_sensor;
}
// Output Pitch, Roll, Yaw and Throttle
// ------------------------------------
// Yaw control
@ -1052,6 +1063,7 @@ void update_current_flight_mode(void)
nav_pitch = 0;
nav_roll = 0;
// allow interactive changing of atitude
adjust_altitude();
// Yaw control
@ -1095,7 +1107,7 @@ void update_current_flight_mode(void)
break;
case LOITER:
// allow interactive changing of atitude
adjust_altitude();
#if AUTO_RESET_LOITER == 1

View File

@ -243,7 +243,7 @@ output_yaw_with_hold(boolean hold)
yaw_error = constrain(yaw_error, -4000, 4000); // limit error to 60 degees
// Apply PID and save the new angle back to RC_Channel
g.rc_4.servo_out = g.pid_yaw.get_pid(yaw_error, delta_ms_fast_loop, 1.0); // .4 * 4000 = 1600
g.rc_4.servo_out = g.pid_yaw.get_pi(yaw_error, delta_ms_fast_loop, 1.0); // .4 * 4000 = 1600
// add in yaw dampener
g.rc_4.servo_out -= constrain(dampener, -1600, 1600);
@ -277,19 +277,15 @@ output_yaw_with_hold(boolean hold)
void
output_yaw_with_hold(boolean hold)
{
long rate = degrees(omega.z) * 100; // 3rad = 17188 , 6rad = 34377
rate = constrain(rate, -36000, 36000); // limit to something fun!
int dampener = rate * g.pid_yaw.kD(); // 34377 * .175 = 6000
// re-define nav_yaw if we have stick input
if(g.rc_4.control_in != 0){
// set nav_yaw + or - the current location
nav_yaw = (long)g.rc_4.control_in + dcm.yaw_sensor;
// we need to wrap our value so we can be 0 to 360 (*100)
nav_yaw = wrap_360(nav_yaw);
}
// we need to wrap our value so we can be 0 to 360 (*100)
nav_yaw = wrap_360(nav_yaw);
// how far off is nav_yaw from our current yaw?
yaw_error = nav_yaw - dcm.yaw_sensor;
@ -297,13 +293,13 @@ output_yaw_with_hold(boolean hold)
yaw_error = wrap_180(yaw_error);
// limit the error we're feeding to the PID
yaw_error = constrain(yaw_error, -4000, 4000); // limit error to 60 degees
yaw_error = constrain(yaw_error, -3500, 3500); // limit error to 60 degees
// Apply PID and save the new angle back to RC_Channel
g.rc_4.servo_out = g.pid_yaw.get_pid(yaw_error, delta_ms_fast_loop, 1.0); // .4 * 4000 = 1600
g.rc_4.servo_out = g.pid_yaw.get_pi(yaw_error, delta_ms_fast_loop, 1.0); // .4 * 4000 = 1600
// add in yaw dampener
g.rc_4.servo_out -= constrain(dampener, -1600, 1600);
yaw_debug = YAW_HOLD; //0
g.rc_4.servo_out -= degrees(omega.z) * 100 * g.pid_yaw.kD();
yaw_error = constrain(yaw_error, -2500, 2500); // limit error to 60 degees
}
#endif

View File

@ -357,13 +357,13 @@
# define YAW_P 0.4 // increase for more aggressive Yaw Hold, decrease if it's bouncy
#endif
#ifndef YAW_I
# define YAW_I 0.0001 // set to .0001 to try and get over user's steady state error caused by poor balance
# define YAW_I 0.01 // set to .0001 to try and get over user's steady state error caused by poor balance
#endif
#ifndef YAW_D
# define YAW_D 0.05 // Trying a lower value to prevent odd behavior
#endif
#ifndef YAW_IMAX
# define YAW_IMAX .5 // degrees * 100
# define YAW_IMAX 1 // degrees * 100
#endif
//////////////////////////////////////////////////////////////////////////////
@ -427,7 +427,7 @@
# define THROTTLE_BARO_P 0.25
#endif
#ifndef THROTTLE_BARO_I
# define THROTTLE_BARO_I 0.0045
# define THROTTLE_BARO_I 0.01 //with 4m error, 12.5s windup
#endif
#ifndef THROTTLE_BARO_D
# define THROTTLE_BARO_D 0.03

View File

@ -37,7 +37,7 @@ const struct Menu::command main_menu_commands[] PROGMEM = {
};
// Create the top-level menu object.
MENU(main_menu, "AC 2.0.12 Beta", main_menu_commands);
MENU(main_menu, "AC 2.0.13 Beta", main_menu_commands);
void init_ardupilot()
{