Rover: added BRAKING_SPEEDERR parameter

this controls how much speed error you need before brakes are used
This commit is contained in:
Andrew Tridgell 2014-04-07 08:42:54 +10:00
parent e566802bf3
commit 58cfdebcd0
3 changed files with 18 additions and 3 deletions

View File

@ -46,6 +46,7 @@ public:
// braking // braking
k_param_braking_percent = 30, k_param_braking_percent = 30,
k_param_braking_speederr,
// misc2 // misc2
k_param_log_bitmask = 40, k_param_log_bitmask = 40,
@ -198,6 +199,7 @@ public:
// braking // braking
AP_Int8 braking_percent; AP_Int8 braking_percent;
AP_Float braking_speederr;
// Telemetry control // Telemetry control
// //

View File

@ -154,6 +154,15 @@ const AP_Param::Info var_info[] PROGMEM = {
// @User: Standard // @User: Standard
GSCALAR(braking_percent, "BRAKING_PERCENT", 0), GSCALAR(braking_percent, "BRAKING_PERCENT", 0),
// @Param: BRAKING_SPEEDERR
// @DisplayName: Speed error at which to apply braking
// @Description: The amount of overspeed error at which to start applying braking
// @Units: m/s
// @Range: 0 100
// @Increment: 1
// @User: Standard
GSCALAR(braking_speederr, "BRAKING_SPEEDERR", 3),
// @Param: PIVOT_TURN_ANGLE // @Param: PIVOT_TURN_ANGLE
// @DisplayName: Pivot turn angle // @DisplayName: Pivot turn angle
// @Description: Navigation angle threshold in degrees to switch to pivot steering when SKID_STEER_OUT is 1. This allows you to setup a skid steering rover to turn on the spot in auto mode when the angle it needs to turn it greater than this angle. An angle of zero means to disable pivot turning. Note that you will probably also want to set a low value for WP_RADIUS to get neat turns. // @Description: Navigation angle threshold in degrees to switch to pivot steering when SKID_STEER_OUT is 1. This allows you to setup a skid steering rover to turn on the spot in auto mode when the angle it needs to turn it greater than this angle. An angle of zero means to disable pivot turning. Note that you will probably also want to set a low value for WP_RADIUS to get neat turns.

View File

@ -125,11 +125,15 @@ static void calc_throttle(float target_speed)
channel_throttle->servo_out = constrain_int16(throttle, g.throttle_min, g.throttle_max); channel_throttle->servo_out = constrain_int16(throttle, g.throttle_min, g.throttle_max);
} }
if (!in_reverse && g.braking_percent != 0 && groundspeed_error < -g.speed_cruise/2) { if (!in_reverse && g.braking_percent != 0 && groundspeed_error < -g.braking_speederr) {
// the user has asked to use reverse throttle to brake. Apply // the user has asked to use reverse throttle to brake. Apply
// it in proportion to the ground speed error, but only when // it in proportion to the ground speed error, but only when
// our ground speed error is more than half our cruise speed // our ground speed error is more than BRAKING_SPEEDERR.
float brake_gain = constrain_float(-groundspeed_error / (float)g.speed_cruise, 0, 1); //
// We use a linear gain, with 0 gain at a ground speed error
// of braking_speederr, and 100% gain when groundspeed_error
// is 2*braking_speederr
float brake_gain = constrain_float(((-groundspeed_error)-g.braking_speederr)/g.braking_speederr, 0, 1);
int16_t braking_throttle = g.throttle_max * (g.braking_percent * 0.01f) * brake_gain; int16_t braking_throttle = g.throttle_max * (g.braking_percent * 0.01f) * brake_gain;
channel_throttle->servo_out = constrain_int16(-braking_throttle, -g.throttle_max, -g.throttle_min); channel_throttle->servo_out = constrain_int16(-braking_throttle, -g.throttle_max, -g.throttle_min);