mirror of https://github.com/ArduPilot/ardupilot
Arducopter: Altitude change nav
Split altitude hold into two controls to parallel navigation.
This commit is contained in:
parent
cb1cdcd4a7
commit
aa645afe2b
|
@ -137,7 +137,6 @@ get_acro_yaw(int32_t target_rate)
|
||||||
static int16_t
|
static int16_t
|
||||||
get_acro_yaw2(int32_t target_rate)
|
get_acro_yaw2(int32_t target_rate)
|
||||||
{
|
{
|
||||||
static int32_t last_target_rate = 0; // last iteration's target rate
|
|
||||||
int32_t p,i,d; // used to capture pid values for logging
|
int32_t p,i,d; // used to capture pid values for logging
|
||||||
int32_t rate_error; // current yaw rate error
|
int32_t rate_error; // current yaw rate error
|
||||||
int32_t current_rate; // current real yaw rate
|
int32_t current_rate; // current real yaw rate
|
||||||
|
@ -155,6 +154,7 @@ get_acro_yaw2(int32_t target_rate)
|
||||||
//strengthen the yaw output to slow down the yaw!
|
//strengthen the yaw output to slow down the yaw!
|
||||||
|
|
||||||
#if (FRAME_CONFIG == HELI_FRAME || FRAME_CONFIG == TRI_FRAME)
|
#if (FRAME_CONFIG == HELI_FRAME || FRAME_CONFIG == TRI_FRAME)
|
||||||
|
static int32_t last_target_rate = 0; // last iteration's target rate
|
||||||
if ( target_rate > 0 && last_target_rate > target_rate && rate_error < 0 ){
|
if ( target_rate > 0 && last_target_rate > target_rate && rate_error < 0 ){
|
||||||
decel_boost = 1;
|
decel_boost = 1;
|
||||||
} else if (target_rate < 0 && last_target_rate < target_rate && rate_error > 0 ){
|
} else if (target_rate < 0 && last_target_rate < target_rate && rate_error > 0 ){
|
||||||
|
@ -345,10 +345,7 @@ get_rate_yaw(int32_t target_rate)
|
||||||
static int16_t
|
static int16_t
|
||||||
get_nav_throttle(int32_t z_error)
|
get_nav_throttle(int32_t z_error)
|
||||||
{
|
{
|
||||||
int16_t z_rate_error, z_target_speed, output;
|
int16_t z_target_speed;
|
||||||
|
|
||||||
// a small boost for alt control to improve takeoff
|
|
||||||
//int16_t boost_p = constrain(z_error >> 1, -10, 50);
|
|
||||||
|
|
||||||
// convert to desired Rate:
|
// convert to desired Rate:
|
||||||
z_target_speed = g.pi_alt_hold.get_p(z_error);
|
z_target_speed = g.pi_alt_hold.get_p(z_error);
|
||||||
|
@ -360,6 +357,16 @@ get_nav_throttle(int32_t z_error)
|
||||||
// compensates throttle setpoint error for hovering
|
// compensates throttle setpoint error for hovering
|
||||||
int16_t i_hold = g.pi_alt_hold.get_i(z_error, .02);
|
int16_t i_hold = g.pi_alt_hold.get_i(z_error, .02);
|
||||||
|
|
||||||
|
// output control:
|
||||||
|
return get_throttle_rate(z_target_speed) + i_hold; //+ boost_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int16_t
|
||||||
|
get_throttle_rate(int16_t z_target_speed)
|
||||||
|
{
|
||||||
|
int16_t z_rate_error, output;
|
||||||
|
|
||||||
// calculate rate error
|
// calculate rate error
|
||||||
#if INERTIAL_NAV == ENABLED
|
#if INERTIAL_NAV == ENABLED
|
||||||
z_rate_error = z_target_speed - accels_velocity.z; // calc the speed error
|
z_rate_error = z_target_speed - accels_velocity.z; // calc the speed error
|
||||||
|
@ -367,11 +374,16 @@ get_nav_throttle(int32_t z_error)
|
||||||
z_rate_error = z_target_speed - climb_rate; // calc the speed error
|
z_rate_error = z_target_speed - climb_rate; // calc the speed error
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// limit the rate
|
int32_t tmp = (z_target_speed * z_target_speed * (int32_t)g.throttle_cruise) / 200000;
|
||||||
output = constrain(g.pid_throttle.get_pid(z_rate_error, .02), -80, 120);
|
|
||||||
|
|
||||||
// output control:
|
if(z_target_speed < 0) tmp = -tmp;
|
||||||
return output + i_hold; //+ boost_p;
|
|
||||||
|
output = constrain(tmp, -3200, 3200);
|
||||||
|
|
||||||
|
// limit the rate
|
||||||
|
output += constrain(g.pid_throttle.get_pid(z_rate_error, .02), -80, 120);
|
||||||
|
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keeps old data out of our calculation / logs
|
// Keeps old data out of our calculation / logs
|
||||||
|
@ -777,7 +789,7 @@ void roll_pitch_toy()
|
||||||
//g.rc_4.servo_out = get_stabilize_yaw(nav_yaw);
|
//g.rc_4.servo_out = get_stabilize_yaw(nav_yaw);
|
||||||
|
|
||||||
if(g.rc_1.control_in != 0){ // roll
|
if(g.rc_1.control_in != 0){ // roll
|
||||||
g.rc_4.servo_out = get_acro_yaw(yaw_rate);
|
g.rc_4.servo_out = get_acro_yaw(yaw_rate/2);
|
||||||
yaw_stopped = false;
|
yaw_stopped = false;
|
||||||
yaw_timer = 150;
|
yaw_timer = 150;
|
||||||
}else if (!yaw_stopped){
|
}else if (!yaw_stopped){
|
||||||
|
|
Loading…
Reference in New Issue