Browse Source

FlightTaskManualPosition: make position lock simpler; add underline for protected/private

methods
sbg
Dennis Mannhart 7 years ago committed by Beat Küng
parent
commit
72624e14cb
  1. 88
      src/lib/FlightTasks/tasks/FlightTaskManualPosition.cpp
  2. 10
      src/lib/FlightTasks/tasks/FlightTaskManualPosition.hpp

88
src/lib/FlightTasks/tasks/FlightTaskManualPosition.cpp

@ -48,95 +48,67 @@ using namespace matrix;
FlightTaskManualPosition::FlightTaskManualPosition(control::SuperBlock *parent, const char *name) : FlightTaskManualPosition::FlightTaskManualPosition(control::SuperBlock *parent, const char *name) :
FlightTaskManualAltitude(parent, name), FlightTaskManualAltitude(parent, name),
_vel_xy_manual_max(parent, "MPC_VEL_MANUAL", false), _vel_xy_manual_max(parent, "MPC_VEL_MANUAL", false),
_acc_xy_max(parent, "MPC_ACC_HOR_MAX", false) _acc_xy_max(parent, "MPC_ACC_HOR_MAX", false), \
_vel_xy_dz(parent, "MPC_HOLD_MAX_XY", false)
{} {}
bool FlightTaskManualPosition::activate() bool FlightTaskManualPosition::activate()
{ {
_pos_sp_xy = _pos_sp_xy_lock = matrix::Vector2f(_position(0), _position(1)); _pos_sp_xy = matrix::Vector2f(&_position(0));
_vel_sp_xy = matrix::Vector2f(NAN, NAN); _vel_sp_xy = matrix::Vector2f(0.0f, 0.0f);
_lock_time = 0.0f;
_lock_time_max = 1.0f; // 1s time to brake as default
return FlightTaskManualAltitude::activate(); return FlightTaskManualAltitude::activate();
} }
void FlightTaskManualPosition::scaleSticks() void FlightTaskManualPosition::_scaleSticks()
{ {
/* Get velocity in z and yawspeed. */ /* Use same scaling as for FlightTaskManualAltitude to
FlightTaskManualAltitude::scaleSticks(); * get yaw and z */
FlightTaskManualAltitude::_scaleSticks();
/* Constrain length of stick inputs to 1. */ /* Constrain length of stick inputs to 1 for xy*/
matrix::Vector2f stick_xy(_sticks_expo(0), _sticks_expo(1)); matrix::Vector2f stick_xy(_sticks_expo(0), _sticks_expo(1));
float mag = math::constrain(stick_xy.length(), 0.0f, 1.0f); float mag = math::constrain(stick_xy.length(), 0.0f, 1.0f);
stick_xy = stick_xy.normalized() * mag;
if (mag > FLT_EPSILON) {
stick_xy = stick_xy.normalized() * mag;
}
/* Scale to velocity.*/ /* Scale to velocity.*/
_vel_sp_xy = stick_xy * _vel_xy_manual_max.get(); _vel_sp_xy = stick_xy * _vel_xy_manual_max.get();
/* Rotate setpoint into local frame. */ /* Rotate setpoint into local frame. */
matrix::Vector3f vel_sp{_vel_sp_xy(0), _vel_sp_xy(1), 0.0f}; matrix::Vector3f vel_sp{_vel_sp_xy(0), _vel_sp_xy(1), 0.0f};
vel_sp = (matrix::Dcmf(matrix::Eulerf(0.0f, 0.0f, _yaw_sp_predicted)) * vel_sp); vel_sp = (matrix::Dcmf(matrix::Eulerf(0.0f, 0.0f, _yaw)) * vel_sp);
_vel_sp_xy = matrix::Vector2f(vel_sp(0), vel_sp(1)); _vel_sp_xy = matrix::Vector2f(vel_sp(0), vel_sp(1));
} }
void FlightTaskManualPosition::updateXYsetpoints() void FlightTaskManualPosition::_updateXYsetpoints()
{ {
/* If position lock is active, velocity setpoint is set to NAN. Otherwise /* If position lock is not active, position setpoint is set to NAN.*/
* position setpoint is set to NAN. const float vel_xy_norm = Vector2f(&_velocity(0)).length();
*/ const bool stick_zero = matrix::Vector2f(_sticks_expo(0), _sticks_expo(1)).length() < FLT_EPSILON;
const bool stopped = (_vel_xy_dz.get() < FLT_EPSILON || vel_xy_norm < _vel_xy_dz.get());
matrix::Vector2f stick_xy(_sticks_expo(0), _sticks_expo(1)); if (stick_zero && stopped && !PX4_ISFINITE(_pos_sp_xy(0))) {
_pos_sp_xy = matrix::Vector2f(&_position(0));
if (stick_xy.length() < FLT_EPSILON) { } else if (!stick_zero) {
_pos_sp_xy = _pos_sp_xy * NAN;
/* Hold position */
if (_lock_time <= _lock_time_max) {
/* Don't lock: time has not been reached. */
_vel_sp_xy.zero();
_pos_sp_xy = matrix::Vector2f(NAN, NAN);
_pos_sp_xy_lock = matrix::Vector2f(&(_position(0)));
_lock_time += _deltatime;
} else {
/*Lock position. */
_vel_sp_xy = matrix::Vector2f(NAN, NAN);
_pos_sp_xy = matrix::Vector2f(&(_pos_sp_xy_lock(0)));
}
} else {
/* Move based on velocity. Position setpoint
* not used and therefore set to NAN. */
_pos_sp_xy = matrix::Vector2f(NAN, NAN);
/* Always update time to brake. It depends on
* maximum acceleration.
*/
if (PX4_ISFINITE(_acc_xy_max.get())) {
/* We take half max acceleration because it is better to lock
* position setpoint late than early to prevent backward and forward movement.
*/
_lock_time_max = matrix::Vector2f(&(_velocity(0))).length() / (0.5f * _acc_xy_max.get());
} else {
_lock_time_max = 2.0f; // 2 second time to brake if no acceleration is set
}
_lock_time = 0.0f;
} }
} }
void FlightTaskManualPosition::updateSetpoints() void FlightTaskManualPosition::_updateSetpoints()
{ {
/* Apply position lock if required. */ FlightTaskManualAltitude::_updateSetpoints(); // get yaw and z setpoints
FlightTaskManualAltitude::updateSetpoints(); _updateXYsetpoints(); // get xy setpoints
updateXYsetpoints();
} }
bool FlightTaskManualPosition::update() bool FlightTaskManualPosition::update()
{ {
scaleSticks(); _scaleSticks();
updateSetpoints(); _updateSetpoints();
_setPositionSetpoint(Vector3f(_pos_sp_xy(0), _pos_sp_xy(1), _pos_sp_z)); _setPositionSetpoint(Vector3f(_pos_sp_xy(0), _pos_sp_xy(1), _pos_sp_z));
_setVelocitySetpoint(Vector3f(_vel_sp_xy(0), _vel_sp_xy(1), _vel_sp_z)); _setVelocitySetpoint(Vector3f(_vel_sp_xy(0), _vel_sp_xy(1), _vel_sp_z));
_setYawSetpoint(_yaw_sp); _setYawSetpoint(_yaw_sp);

10
src/lib/FlightTasks/tasks/FlightTaskManualPosition.hpp

@ -56,16 +56,14 @@ public:
protected: protected:
matrix::Vector2f _vel_sp_xy{}; /**< Scaled velocity setpoint from stick. NAN during position lock. */ matrix::Vector2f _vel_sp_xy{}; /**< Scaled velocity setpoint from stick. NAN during position lock. */
matrix::Vector2f _pos_sp_xy{}; /**< Position setpoint during lock. Otherwise NAN.*/ matrix::Vector2f _pos_sp_xy{}; /**< Position setpoint during lock. Otherwise NAN.*/
matrix::Vector2f _pos_sp_xy_lock{}; /**< Position setpoint during lock */
control::BlockParamFloat _vel_xy_manual_max; /**< Maximum speed allowed horizontally, */ control::BlockParamFloat _vel_xy_manual_max; /**< Maximum speed allowed horizontally, */
control::BlockParamFloat _acc_xy_max;/**< Maximum acceleration horizontally. Only used to compute lock time. */ control::BlockParamFloat _acc_xy_max;/**< Maximum acceleration horizontally. Only used to compute lock time. */
control::BlockParamFloat _vel_xy_dz; /**< velocity threshold/deadzone to switch into horizontal position hold */
void updateSetpoints() override; void _updateSetpoints() override;
void scaleSticks() override; void _scaleSticks() override;
private: private:
void updateXYsetpoints(); void _updateXYsetpoints();
float _lock_time_max{0.0f}; /**< Defines time when position lock occurs. */
float _lock_time{0.0f}; /**< Time passed when stick are at zero position. */
}; };

Loading…
Cancel
Save