mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-14 22:13:33 +08:00
FlightTaskManual: fixed stick vector index bug and enabled basic yaw setpoint control
This commit is contained in:
@@ -56,9 +56,7 @@ FlightTaskManual::FlightTaskManual(control::SuperBlock *parent, const char *name
|
||||
_z_vel_max_down(parent, "MPC_Z_VEL_MAX_DN", false),
|
||||
_hold_max_xy(parent, "MPC_HOLD_MAX_XY", false),
|
||||
_hold_max_z(parent, "MPC_HOLD_MAX_Z", false)
|
||||
{
|
||||
_hold_position = Vector3f(NAN, NAN, NAN);
|
||||
}
|
||||
{ }
|
||||
|
||||
bool FlightTaskManual::initializeSubscriptions(SubscriptionArray &subscription_array)
|
||||
{
|
||||
@@ -73,6 +71,14 @@ bool FlightTaskManual::initializeSubscriptions(SubscriptionArray &subscription_a
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FlightTaskManual::activate()
|
||||
{
|
||||
bool ret = FlightTask::activate();
|
||||
_hold_position = Vector3f(NAN, NAN, NAN);
|
||||
_hold_yaw = _yaw;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool FlightTaskManual::updateInitialize()
|
||||
{
|
||||
bool ret = FlightTask::updateInitialize();
|
||||
@@ -89,6 +95,7 @@ bool FlightTaskManual::update()
|
||||
{
|
||||
/* prepare stick input */
|
||||
Vector2f stick_xy(_sticks.data()); /**< horizontal two dimensional stick input within a unit circle */
|
||||
float &stick_z = _sticks(2);
|
||||
|
||||
const float stick_xy_norm = stick_xy.norm();
|
||||
|
||||
@@ -98,7 +105,7 @@ bool FlightTaskManual::update()
|
||||
}
|
||||
|
||||
/* rotate stick input to produce velocity setpoint in NED frame */
|
||||
Vector3f velocity_setpoint(stick_xy(0), stick_xy(1), _sticks(2));
|
||||
Vector3f velocity_setpoint(stick_xy(0), stick_xy(1), stick_z);
|
||||
velocity_setpoint = Dcmf(Eulerf(0.0f, 0.0f, _get_input_frame_yaw())) * velocity_setpoint;
|
||||
|
||||
/* scale [0,1] length velocity vector to maximal manual speed (in m/s) */
|
||||
@@ -109,7 +116,7 @@ bool FlightTaskManual::update()
|
||||
|
||||
/* handle position and altitude hold */
|
||||
const bool stick_xy_zero = stick_xy_norm <= FLT_EPSILON;
|
||||
const bool stick_z_zero = fabsf(_sticks(3)) <= FLT_EPSILON;
|
||||
const bool stick_z_zero = fabsf(stick_z) <= FLT_EPSILON;
|
||||
|
||||
float velocity_xy_norm = Vector2f(_velocity.data()).norm();
|
||||
const bool stopped_xy = (_hold_max_xy.get() < FLT_EPSILON || velocity_xy_norm < _hold_max_xy.get());
|
||||
@@ -132,14 +139,23 @@ bool FlightTaskManual::update()
|
||||
}
|
||||
|
||||
_setPositionSetpoint(_hold_position);
|
||||
|
||||
_updateYaw();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FlightTaskManual::_updateYaw()
|
||||
{
|
||||
_hold_yaw += _sticks(3) * _deltatime;
|
||||
_setYawSetpoint(_hold_yaw);
|
||||
}
|
||||
|
||||
void FlightTaskManual::_scaleVelocity(Vector3f &velocity)
|
||||
{
|
||||
const Vector3f velocity_scale(_velocity_hor_manual.get(),
|
||||
_velocity_hor_manual.get(),
|
||||
(velocity(2) > 0.0f) ? _z_vel_max_down.get() : _z_vel_max_up.get());
|
||||
|
||||
velocity = velocity.emult(velocity_scale);
|
||||
}
|
||||
|
||||
@@ -156,6 +172,7 @@ bool FlightTaskManual::_evaluateSticks()
|
||||
_sticks(0) = math::expo_deadzone(_sticks(0), _xy_vel_man_expo.get(), _hold_dz.get());
|
||||
_sticks(1) = math::expo_deadzone(_sticks(1), _xy_vel_man_expo.get(), _hold_dz.get());
|
||||
_sticks(2) = math::expo_deadzone(_sticks(2), _z_vel_man_expo.get(), _hold_dz.get());
|
||||
_sticks(3) = math::deadzone(_sticks(3), _hold_dz.get());
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
@@ -54,6 +54,8 @@ public:
|
||||
|
||||
bool initializeSubscriptions(SubscriptionArray &subscription_array) override;
|
||||
|
||||
bool activate() override;
|
||||
|
||||
bool applyCommandParameters(const vehicle_command_s &command) override { return FlightTask::applyCommandParameters(command); };
|
||||
|
||||
bool updateInitialize() override;
|
||||
@@ -81,6 +83,9 @@ private:
|
||||
control::BlockParamFloat _hold_max_z; /**< velocity threshold to switch into vertical position hold */
|
||||
|
||||
matrix::Vector3f _hold_position; /**< position at which the vehicle stays while the input is zero velocity */
|
||||
float _hold_yaw; /**< absolute yaw which gets updated by the yawspeed input */
|
||||
|
||||
void _updateYaw();
|
||||
|
||||
bool _evaluate_sticks();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user