mirror of https://github.com/ArduPilot/ardupilot
Rover: PILOT_STEER_TYPE replaces SKID_STEER_IN
new options allow controlling vehicle's heading while reversing skid-steering vehicles rotate in opposite direction when backing up
This commit is contained in:
parent
c6689fd2e1
commit
26f50f6055
|
@ -142,12 +142,12 @@ const AP_Param::Info Rover::var_info[] = {
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(throttle_cruise, "CRUISE_THROTTLE", 50),
|
GSCALAR(throttle_cruise, "CRUISE_THROTTLE", 50),
|
||||||
|
|
||||||
// @Param: SKID_STEER_IN
|
// @Param: PILOT_STEER_TYPE
|
||||||
// @DisplayName: Skid steering input
|
// @DisplayName: Pilot input steering type
|
||||||
// @Description: Set this to 1 for skid steering input rovers (tank track style in RC controller). When enabled, servo1 is used for the left track control, servo3 is used for right track control
|
// @Description: Set this to 1 for skid steering input rovers (tank track style in RC controller). When enabled, servo1 is used for the left track control, servo3 is used for right track control
|
||||||
// @Values: 0:Disabled, 1:SkidSteeringInput
|
// @Values: 0:Default,1:Two Paddles Input,2:Direction reversed when backing up,3:Direction unchanged when backing up
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(skid_steer_in, "SKID_STEER_IN", 0),
|
GSCALAR(pilot_steer_type, "PILOT_STEER_TYPE", 0),
|
||||||
|
|
||||||
// @Param: FS_ACTION
|
// @Param: FS_ACTION
|
||||||
// @DisplayName: Failsafe Action
|
// @DisplayName: Failsafe Action
|
||||||
|
|
|
@ -129,7 +129,7 @@ public:
|
||||||
k_param_throttle_cruise,
|
k_param_throttle_cruise,
|
||||||
k_param_throttle_slewrate_old, // unused
|
k_param_throttle_slewrate_old, // unused
|
||||||
k_param_throttle_reduction, // unused
|
k_param_throttle_reduction, // unused
|
||||||
k_param_skid_steer_in,
|
k_param_pilot_steer_type,
|
||||||
k_param_skid_steer_out_old, // unused
|
k_param_skid_steer_out_old, // unused
|
||||||
|
|
||||||
// failsafe control
|
// failsafe control
|
||||||
|
@ -238,7 +238,7 @@ public:
|
||||||
// Throttle
|
// Throttle
|
||||||
//
|
//
|
||||||
AP_Int8 throttle_cruise;
|
AP_Int8 throttle_cruise;
|
||||||
AP_Int8 skid_steer_in;
|
AP_Int8 pilot_steer_type;
|
||||||
|
|
||||||
// failsafe control
|
// failsafe control
|
||||||
AP_Int8 fs_action;
|
AP_Int8 fs_action;
|
||||||
|
|
|
@ -121,5 +121,12 @@ enum aux_switch_pos {
|
||||||
AUX_SWITCH_HIGH
|
AUX_SWITCH_HIGH
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum pilot_steer_type_t {
|
||||||
|
PILOT_STEER_TYPE_DEFAULT = 0,
|
||||||
|
PILOT_STEER_TYPE_TWO_PADDLES = 1,
|
||||||
|
PILOT_STEER_TYPE_DIR_REVERSED_WHEN_REVERSING = 2,
|
||||||
|
PILOT_STEER_TYPE_DIR_UNCHANGED_WHEN_REVERSING = 3,
|
||||||
|
};
|
||||||
|
|
||||||
#define AUX_SWITCH_PWM_TRIGGER_HIGH 1800 // pwm value above which the ch7 or ch8 option will be invoked
|
#define AUX_SWITCH_PWM_TRIGGER_HIGH 1800 // pwm value above which the ch7 or ch8 option will be invoked
|
||||||
#define AUX_SWITCH_PWM_TRIGGER_LOW 1200 // pwm value below which the ch7 or ch8 option will be disabled
|
#define AUX_SWITCH_PWM_TRIGGER_LOW 1200 // pwm value below which the ch7 or ch8 option will be disabled
|
||||||
|
|
|
@ -24,6 +24,49 @@ bool Mode::enter()
|
||||||
return _enter();
|
return _enter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mode::get_pilot_desired_steering_and_throttle(float &steering_out, float &throttle_out)
|
||||||
|
{
|
||||||
|
// apply RC skid steer mixing
|
||||||
|
switch ((enum pilot_steer_type_t)rover.g.pilot_steer_type.get())
|
||||||
|
{
|
||||||
|
case PILOT_STEER_TYPE_DEFAULT:
|
||||||
|
default: {
|
||||||
|
// by default regular and skid-steering vehicles reverse their rotation direction when backing up
|
||||||
|
// (this is the same as PILOT_STEER_TYPE_DIR_REVERSED_WHEN_REVERSING below)
|
||||||
|
throttle_out = rover.channel_throttle->get_control_in();
|
||||||
|
steering_out = rover.channel_steer->get_control_in();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PILOT_STEER_TYPE_TWO_PADDLES: {
|
||||||
|
// convert the two radio_in values from skid steering values
|
||||||
|
// left paddle from steering input channel, right paddle from throttle input channel
|
||||||
|
// steering = left-paddle - right-paddle
|
||||||
|
// throttle = average(left-paddle, right-paddle)
|
||||||
|
const float left_paddle = rover.channel_steer->norm_input();
|
||||||
|
const float right_paddle = rover.channel_throttle->norm_input();
|
||||||
|
|
||||||
|
throttle_out = 0.5f * (left_paddle + right_paddle) * 100.0f;
|
||||||
|
|
||||||
|
const float steering_dir = is_negative(throttle_out) ? -1 : 1;
|
||||||
|
steering_out = steering_dir * (left_paddle - right_paddle) * 4500.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PILOT_STEER_TYPE_DIR_REVERSED_WHEN_REVERSING:
|
||||||
|
throttle_out = rover.channel_throttle->get_control_in();
|
||||||
|
steering_out = rover.channel_steer->get_control_in();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PILOT_STEER_TYPE_DIR_UNCHANGED_WHEN_REVERSING: {
|
||||||
|
throttle_out = rover.channel_throttle->get_control_in();
|
||||||
|
const float steering_dir = is_negative(throttle_out) ? -1 : 1;
|
||||||
|
steering_out = steering_dir * rover.channel_steer->get_control_in();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// set desired location
|
// set desired location
|
||||||
void Mode::set_desired_location(const struct Location& destination, float next_leg_bearing_cd)
|
void Mode::set_desired_location(const struct Location& destination, float next_leg_bearing_cd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,10 @@ protected:
|
||||||
// subclasses override this to perform any required cleanup when exiting the mode
|
// subclasses override this to perform any required cleanup when exiting the mode
|
||||||
virtual void _exit() { return; }
|
virtual void _exit() { return; }
|
||||||
|
|
||||||
|
// decode pilot steering held in channel_steer, channel_throttle and return in steer_out and throttle_out arguments
|
||||||
|
// steering_out is in the range -4500 ~ +4500, throttle_out is in the range -100 ~ +100
|
||||||
|
void get_pilot_desired_steering_and_throttle(float &steering_out, float &throttle_out);
|
||||||
|
|
||||||
// calculate steering angle given a desired lateral acceleration
|
// calculate steering angle given a desired lateral acceleration
|
||||||
void calc_steering_from_lateral_acceleration(bool reversed = false);
|
void calc_steering_from_lateral_acceleration(bool reversed = false);
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,11 @@ void ModeManual::update()
|
||||||
g2.motors.set_throttle(0.0f);
|
g2.motors.set_throttle(0.0f);
|
||||||
g2.motors.set_steering(0.0f);
|
g2.motors.set_steering(0.0f);
|
||||||
} else {
|
} else {
|
||||||
|
float desired_steering, desired_throttle;
|
||||||
|
get_pilot_desired_steering_and_throttle(desired_steering, desired_throttle);
|
||||||
// copy RC scaled inputs to outputs
|
// copy RC scaled inputs to outputs
|
||||||
g2.motors.set_throttle(channel_throttle->get_control_in());
|
g2.motors.set_throttle(desired_throttle);
|
||||||
g2.motors.set_steering(channel_steer->get_control_in());
|
g2.motors.set_steering(desired_steering);
|
||||||
}
|
}
|
||||||
|
|
||||||
// mark us as in_reverse when using a negative throttle to stop AHRS getting off
|
// mark us as in_reverse when using a negative throttle to stop AHRS getting off
|
||||||
|
|
|
@ -3,8 +3,11 @@
|
||||||
|
|
||||||
void ModeSteering::update()
|
void ModeSteering::update()
|
||||||
{
|
{
|
||||||
|
float desired_steering, desired_throttle;
|
||||||
|
get_pilot_desired_steering_and_throttle(desired_steering, desired_throttle);
|
||||||
|
|
||||||
// convert pilot throttle input to desired speed (up to twice the cruise speed)
|
// convert pilot throttle input to desired speed (up to twice the cruise speed)
|
||||||
float target_speed = channel_throttle->get_control_in() * 0.01f * calc_speed_max(g.speed_cruise, g.throttle_cruise * 0.01f);
|
float target_speed = desired_steering * 0.01f * calc_speed_max(g.speed_cruise, g.throttle_cruise * 0.01f);
|
||||||
|
|
||||||
// get speed forward
|
// get speed forward
|
||||||
float speed;
|
float speed;
|
||||||
|
@ -17,7 +20,7 @@ void ModeSteering::update()
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine if pilot is requesting pivot turn
|
// determine if pilot is requesting pivot turn
|
||||||
bool is_pivot_turning = g2.motors.have_skid_steering() && is_zero(target_speed) && (channel_steer->get_control_in() != 0);
|
bool is_pivot_turning = g2.motors.have_skid_steering() && is_zero(target_speed) && (!is_zero(desired_steering));
|
||||||
|
|
||||||
// In steering mode we control lateral acceleration directly.
|
// In steering mode we control lateral acceleration directly.
|
||||||
// For pivot steering vehicles we use the TURN_MAX_G parameter
|
// For pivot steering vehicles we use the TURN_MAX_G parameter
|
||||||
|
@ -33,7 +36,7 @@ void ModeSteering::update()
|
||||||
max_g_force = constrain_float(max_g_force, 0.1f, g.turn_max_g * GRAVITY_MSS);
|
max_g_force = constrain_float(max_g_force, 0.1f, g.turn_max_g * GRAVITY_MSS);
|
||||||
|
|
||||||
// convert pilot steering input to desired lateral acceleration
|
// convert pilot steering input to desired lateral acceleration
|
||||||
lateral_acceleration = max_g_force * (channel_steer->get_control_in() / 4500.0f);
|
lateral_acceleration = max_g_force * (desired_steering / 4500.0f);
|
||||||
|
|
||||||
// reverse target lateral acceleration if backing up
|
// reverse target lateral acceleration if backing up
|
||||||
bool reversed = false;
|
bool reversed = false;
|
||||||
|
|
|
@ -113,43 +113,6 @@ void Rover::read_radio()
|
||||||
// check that RC value are valid
|
// check that RC value are valid
|
||||||
control_failsafe(channel_throttle->get_radio_in());
|
control_failsafe(channel_throttle->get_radio_in());
|
||||||
|
|
||||||
// apply RC skid steer mixing
|
|
||||||
if (g.skid_steer_in) {
|
|
||||||
// convert the two radio_in values from skid steering values
|
|
||||||
/*
|
|
||||||
mixing rule:
|
|
||||||
steering = motor1 - motor2
|
|
||||||
throttle = 0.5*(motor1 + motor2)
|
|
||||||
motor1 = throttle + 0.5*steering
|
|
||||||
motor2 = throttle - 0.5*steering
|
|
||||||
*/
|
|
||||||
|
|
||||||
const float left_input = channel_steer->norm_input();
|
|
||||||
const float right_input = channel_throttle->norm_input();
|
|
||||||
const float throttle_scaled = 0.5f * (left_input + right_input);
|
|
||||||
float steering_scaled = constrain_float(left_input - right_input, -1.0f, 1.0f);
|
|
||||||
|
|
||||||
// flip the steering direction if requesting the vehicle reverse (to be consistent with separate steering-throttle frames)
|
|
||||||
if (is_negative(throttle_scaled)) {
|
|
||||||
steering_scaled = -steering_scaled;
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t steer = channel_steer->get_radio_trim();
|
|
||||||
int16_t thr = channel_throttle->get_radio_trim();
|
|
||||||
if (steering_scaled > 0.0f) {
|
|
||||||
steer += steering_scaled * (channel_steer->get_radio_max() - channel_steer->get_radio_trim());
|
|
||||||
} else {
|
|
||||||
steer += steering_scaled * (channel_steer->get_radio_trim() - channel_steer->get_radio_min());
|
|
||||||
}
|
|
||||||
if (throttle_scaled > 0.0f) {
|
|
||||||
thr += throttle_scaled * (channel_throttle->get_radio_max() - channel_throttle->get_radio_trim());
|
|
||||||
} else {
|
|
||||||
thr += throttle_scaled * (channel_throttle->get_radio_trim() - channel_throttle->get_radio_min());
|
|
||||||
}
|
|
||||||
channel_steer->set_pwm(steer);
|
|
||||||
channel_throttle->set_pwm(thr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we try to do RC arm/disarm
|
// check if we try to do RC arm/disarm
|
||||||
rudder_arm_disarm_check();
|
rudder_arm_disarm_check();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue