mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-03 13:58:53 +08:00
WeatherVane: only update with last row of rotation matrix
This commit is contained in:
@@ -43,20 +43,18 @@
|
|||||||
|
|
||||||
WeatherVane::WeatherVane() :
|
WeatherVane::WeatherVane() :
|
||||||
ModuleParams(nullptr)
|
ModuleParams(nullptr)
|
||||||
{
|
{ }
|
||||||
_R_sp_prev = matrix::Dcmf();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherVane::update(const matrix::Quatf &q_sp_prev, float yaw)
|
void WeatherVane::update(const matrix::Vector3f &dcm_z_sp_prev, float yaw)
|
||||||
{
|
{
|
||||||
_R_sp_prev = matrix::Dcmf(q_sp_prev);
|
_dcm_z_sp_prev = dcm_z_sp_prev;
|
||||||
_yaw = yaw;
|
_yaw = yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
float WeatherVane::get_weathervane_yawrate()
|
float WeatherVane::get_weathervane_yawrate()
|
||||||
{
|
{
|
||||||
// direction of desired body z axis represented in earth frame
|
// direction of desired body z axis represented in earth frame
|
||||||
matrix::Vector3f body_z_sp(_R_sp_prev(0, 2), _R_sp_prev(1, 2), _R_sp_prev(2, 2));
|
matrix::Vector3f body_z_sp(_dcm_z_sp_prev);
|
||||||
|
|
||||||
// rotate desired body z axis into new frame which is rotated in z by the current
|
// rotate desired body z axis into new frame which is rotated in z by the current
|
||||||
// heading of the vehicle. we refer to this as the heading frame.
|
// heading of the vehicle. we refer to this as the heading frame.
|
||||||
@@ -74,7 +72,6 @@ float WeatherVane::get_weathervane_yawrate()
|
|||||||
|
|
||||||
} else if (roll_sp < -min_roll_rad) {
|
} else if (roll_sp < -min_roll_rad) {
|
||||||
roll_exceeding_treshold = roll_sp + min_roll_rad;
|
roll_exceeding_treshold = roll_sp + min_roll_rad;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return math::constrain(roll_exceeding_treshold * _param_wv_gain.get(), -math::radians(_param_wv_yrate_max.get()),
|
return math::constrain(roll_exceeding_treshold * _param_wv_gain.get(), -math::radians(_param_wv_yrate_max.get()),
|
||||||
|
|||||||
@@ -60,15 +60,15 @@ public:
|
|||||||
|
|
||||||
bool weathervane_enabled() { return _param_wv_en.get(); }
|
bool weathervane_enabled() { return _param_wv_en.get(); }
|
||||||
|
|
||||||
void update(const matrix::Quatf &q_sp_prev, float yaw);
|
void update(const matrix::Vector3f &dcm_z_sp_prev, float yaw);
|
||||||
|
|
||||||
float get_weathervane_yawrate();
|
float get_weathervane_yawrate();
|
||||||
|
|
||||||
void update_parameters() { ModuleParams::updateParams(); }
|
void update_parameters() { ModuleParams::updateParams(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
matrix::Dcmf _R_sp_prev; // previous attitude setpoint rotation matrix
|
matrix::Vector3f _dcm_z_sp_prev; ///< previous attitude setpoint body z axis
|
||||||
float _yaw = 0.0f; // current yaw angle
|
float _yaw = 0.0f; ///< current yaw angle
|
||||||
|
|
||||||
bool _is_active = true;
|
bool _is_active = true;
|
||||||
|
|
||||||
|
|||||||
@@ -555,7 +555,7 @@ MulticopterPositionControl::Run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_wv_controller->update(matrix::Quatf(_att_sp.q_d), _states.yaw);
|
_wv_controller->update(Quatf(_att_sp.q_d).dcm_z(), _states.yaw);
|
||||||
}
|
}
|
||||||
|
|
||||||
// an update is necessary here because otherwise the takeoff state doesn't get skiped with non-altitude-controlled modes
|
// an update is necessary here because otherwise the takeoff state doesn't get skiped with non-altitude-controlled modes
|
||||||
|
|||||||
Reference in New Issue
Block a user