mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-09 17:34:01 -04:00
AP_Mount: Implement roll control on Solo gimbal
This commit is contained in:
parent
9020c79677
commit
174700b7ad
@ -122,7 +122,7 @@ void SoloGimbal::send_controls(mavlink_channel_t chan)
|
||||
}
|
||||
case GIMBAL_MODE_STABILIZE: {
|
||||
_ang_vel_dem_rads += get_ang_vel_dem_yaw(quatEst);
|
||||
_ang_vel_dem_rads += get_ang_vel_dem_tilt(quatEst);
|
||||
_ang_vel_dem_rads += get_ang_vel_dem_roll_tilt(quatEst);
|
||||
_ang_vel_dem_rads += get_ang_vel_dem_feedforward(quatEst);
|
||||
_ang_vel_dem_rads += get_ang_vel_dem_gyro_bias();
|
||||
float ang_vel_dem_norm = _ang_vel_dem_rads.length();
|
||||
@ -313,7 +313,7 @@ Vector3f SoloGimbal::get_ang_vel_dem_yaw(const Quaternion &quatEst)
|
||||
return gimbalRateDemVecYaw;
|
||||
}
|
||||
|
||||
Vector3f SoloGimbal::get_ang_vel_dem_tilt(const Quaternion &quatEst)
|
||||
Vector3f SoloGimbal::get_ang_vel_dem_roll_tilt(const Quaternion &quatEst)
|
||||
{
|
||||
// Calculate the gimbal 321 Euler angle estimates relative to earth frame
|
||||
Vector3f eulerEst = quatEst.to_vector312();
|
||||
@ -340,14 +340,22 @@ Vector3f SoloGimbal::get_ang_vel_dem_tilt(const Quaternion &quatEst)
|
||||
Vector3f SoloGimbal::get_ang_vel_dem_feedforward(const Quaternion &quatEst)
|
||||
{
|
||||
// quaternion demanded at the previous time step
|
||||
static float lastDem;
|
||||
static float lastDemY;
|
||||
|
||||
// calculate the delta rotation from the last to the current demand where the demand does not incorporate the copters yaw rotation
|
||||
float delta = _att_target_euler_rad.y - lastDem;
|
||||
lastDem = _att_target_euler_rad.y;
|
||||
float deltaY = _att_target_euler_rad.y - lastDemY;
|
||||
lastDemY = _att_target_euler_rad.y;
|
||||
|
||||
// quaternion demanded at the previous time step
|
||||
static float lastDemX;
|
||||
|
||||
// calculate the delta rotation from the last to the current demand where the demand does not incorporate the copters yaw rotation
|
||||
float deltaX = _att_target_euler_rad.x - lastDemX;
|
||||
lastDemX = _att_target_euler_rad.x;
|
||||
|
||||
Vector3f gimbalRateDemVecForward;
|
||||
gimbalRateDemVecForward.y = delta / _measurement.delta_time;
|
||||
gimbalRateDemVecForward.x = deltaX / _measurement.delta_time;
|
||||
gimbalRateDemVecForward.y = deltaY / _measurement.delta_time;
|
||||
return gimbalRateDemVecForward;
|
||||
}
|
||||
|
||||
@ -383,6 +391,12 @@ void SoloGimbal::update_target(const Vector3f &newTarget)
|
||||
_att_target_euler_rad.y = _att_target_euler_rad.y + 0.02f*(newTarget.y - _att_target_euler_rad.y);
|
||||
// Update tilt
|
||||
_att_target_euler_rad.y = constrain_float(_att_target_euler_rad.y,radians(-90),radians(0));
|
||||
|
||||
// For roll angle
|
||||
// Low-pass filter
|
||||
_att_target_euler_rad.x = _att_target_euler_rad.x + 0.02f*(newTarget.x - _att_target_euler_rad.x);
|
||||
// Update roll
|
||||
_att_target_euler_rad.x = constrain_float(_att_target_euler_rad.x,radians(-30),radians(30));
|
||||
}
|
||||
|
||||
void SoloGimbal::write_logs()
|
||||
|
@ -83,7 +83,7 @@ private:
|
||||
void update_joint_angle_est();
|
||||
|
||||
Vector3f get_ang_vel_dem_yaw(const Quaternion &quatEst);
|
||||
Vector3f get_ang_vel_dem_tilt(const Quaternion &quatEst);
|
||||
Vector3f get_ang_vel_dem_roll_tilt(const Quaternion &quatEst);
|
||||
Vector3f get_ang_vel_dem_feedforward(const Quaternion &quatEst);
|
||||
Vector3f get_ang_vel_dem_gyro_bias();
|
||||
Vector3f get_ang_vel_dem_body_lock();
|
||||
|
Loading…
Reference in New Issue
Block a user