diff --git a/src/lib/FlightTasks/FlightTasks.cpp b/src/lib/FlightTasks/FlightTasks.cpp index 4e2fb498f21ca8b36481664e4aebac321a1bc8a4..f482aa929b607907bd1b29667f131a3d599f6d6d 100644 --- a/src/lib/FlightTasks/FlightTasks.cpp +++ b/src/lib/FlightTasks/FlightTasks.cpp @@ -15,7 +15,7 @@ bool FlightTasks::update() return false; } -const vehicle_local_position_setpoint_s &FlightTasks::getPositionSetpoint() +const vehicle_local_position_setpoint_s FlightTasks::getPositionSetpoint() { if (isAnyTaskActive()) { return _current_task->getPositionSetpoint(); diff --git a/src/lib/FlightTasks/FlightTasks.hpp b/src/lib/FlightTasks/FlightTasks.hpp index b5abb21e3e845d81ead3466119efa352abacd57a..fe0a650ddde3385b809e7562bfe77f4b0a1c32e7 100644 --- a/src/lib/FlightTasks/FlightTasks.hpp +++ b/src/lib/FlightTasks/FlightTasks.hpp @@ -91,12 +91,7 @@ public: * Get the output data from the current task * @return output setpoint, to be executed by position control */ - const vehicle_local_position_setpoint_s &getPositionSetpoint(); - - /** - * Convenient operator to get the output data from the current task - */ - inline const vehicle_local_position_setpoint_s &operator()() { return getPositionSetpoint(); } + const vehicle_local_position_setpoint_s getPositionSetpoint(); /** * Switch to the next task in the available list (for testing) diff --git a/src/lib/FlightTasks/tasks/FlightTask.cpp b/src/lib/FlightTasks/tasks/FlightTask.cpp index b46ab06dc85b27579651343a35895c25ef7981f6..7d40ebbe5114f8b4af57088fca3de3f9788a1844 100644 --- a/src/lib/FlightTasks/tasks/FlightTask.cpp +++ b/src/lib/FlightTasks/tasks/FlightTask.cpp @@ -16,13 +16,13 @@ bool FlightTask::initializeSubscriptions(SubscriptionArray &subscription_array) bool FlightTask::activate() { + _resetSetpoints(); _time_stamp_activate = hrt_absolute_time(); return true; } bool FlightTask::updateInitialize() { - _resetSetpoint(); _time_stamp_current = hrt_absolute_time(); _time = (_time_stamp_current - _time_stamp_activate) / 1e6f; _deltatime = math::min((_time_stamp_current - _time_stamp_last), _timeout) / 1e6f; @@ -30,6 +30,29 @@ bool FlightTask::updateInitialize() return _evaluateVehiclePosition(); } +const vehicle_local_position_setpoint_s FlightTask::getPositionSetpoint() +{ + /* fill position setpoint message */ + vehicle_local_position_setpoint_s vehicle_local_position_setpoint; + vehicle_local_position_setpoint.timestamp = hrt_absolute_time(); + _position_setpoint.copyToRaw(&vehicle_local_position_setpoint.x); + _velocity_setpoint.copyToRaw(&vehicle_local_position_setpoint.vx); + _acceleration_setpoint.copyToRaw(&vehicle_local_position_setpoint.acc_x); + _thrust_setpoint.copyTo(vehicle_local_position_setpoint.thrust); + vehicle_local_position_setpoint.yaw = _yaw_setpoint; + vehicle_local_position_setpoint.yawspeed = _yawspeed_setpoint; + return vehicle_local_position_setpoint; +} + +void FlightTask::_resetSetpoints() +{ + _position_setpoint *= NAN; + _velocity_setpoint *= NAN; + _acceleration_setpoint *= NAN; + _thrust_setpoint *= NAN; + _yaw_setpoint = _yawspeed_setpoint = NAN; +} + bool FlightTask::_evaluateVehiclePosition() { if ((_time_stamp_current - _sub_vehicle_local_position->get().timestamp) < _timeout) { diff --git a/src/lib/FlightTasks/tasks/FlightTask.hpp b/src/lib/FlightTasks/tasks/FlightTask.hpp index f018b1ad240009d4b55e4cb0fc7992632567e642..bf2da20fb9d3eb0b8dc3022a26cdffb70f1accfb 100644 --- a/src/lib/FlightTasks/tasks/FlightTask.hpp +++ b/src/lib/FlightTasks/tasks/FlightTask.hpp @@ -56,7 +56,7 @@ class FlightTask : public control::Block public: FlightTask(control::SuperBlock *parent, const char *name) : Block(parent, name) - { _resetSetpoint(); } + { _resetSetpoints(); } virtual ~FlightTask() = default; @@ -94,10 +94,7 @@ public: /** * Get the output data */ - const vehicle_local_position_setpoint_s &getPositionSetpoint() - { - return _vehicle_local_position_setpoint; - } + const vehicle_local_position_setpoint_s getPositionSetpoint(); static const vehicle_local_position_setpoint_s empty_setpoint; @@ -110,35 +107,27 @@ protected: hrt_abstime _time_stamp_current = 0; /**< time stamp at the beginning of the current task update */ hrt_abstime _time_stamp_last = 0; /**< time stamp when task was last updated */ - /* Current vehicle position */ + /* Current vehicle state */ matrix::Vector3f _position; /**< current vehicle position */ matrix::Vector3f _velocity; /**< current vehicle velocity */ float _yaw = 0.f; - /* Put the position vector produced by the task into the setpoint message */ - void _setPositionSetpoint(const matrix::Vector3f &position_setpoint) { position_setpoint.copyToRaw(&_vehicle_local_position_setpoint.x); } + /* Setpoints the position controller needs to execute + * NAN values mean the state does not get controlled */ + matrix::Vector3f _position_setpoint; + matrix::Vector3f _velocity_setpoint; + matrix::Vector3f _acceleration_setpoint; + matrix::Vector3f _thrust_setpoint; + float _yaw_setpoint; + float _yawspeed_setpoint; - /* Put the velocity vector produced by the task into the setpoint message */ - void _setVelocitySetpoint(const matrix::Vector3f &velocity_setpoint) { velocity_setpoint.copyToRaw(&_vehicle_local_position_setpoint.vx); } - - /* Put the acceleration vector produced by the task into the setpoint message */ - void _setAccelerationSetpoint(const matrix::Vector3f &acceleration_setpoint) { acceleration_setpoint.copyToRaw(&_vehicle_local_position_setpoint.acc_x); } - - /* Put the yaw angle produced by the task into the setpoint message */ - void _setYawSetpoint(const float yaw) { _vehicle_local_position_setpoint.yaw = yaw; } - - /* Put the yaw anglular rate produced by the task into the setpoint message */ - void _setYawspeedSetpoint(const float &yawspeed) { _vehicle_local_position_setpoint.yawspeed = yawspeed; } - - /* Put the thrust setpoint produced by the task into the setpoint message */ - void _setThrustSetpoint(const matrix::Vector3f &thrust_setpoint) { thrust_setpoint.copyTo(_vehicle_local_position_setpoint.thrust); } + /** + * Get the output data + */ + void _resetSetpoints(); private: uORB::Subscription<vehicle_local_position_s> *_sub_vehicle_local_position{nullptr}; - vehicle_local_position_setpoint_s _vehicle_local_position_setpoint; /**< Output position setpoint that every task has */ - - void _resetSetpoint() { _vehicle_local_position_setpoint = empty_setpoint; } - bool _evaluateVehiclePosition(); }; diff --git a/src/lib/FlightTasks/tasks/FlightTaskManualStabilized.cpp b/src/lib/FlightTasks/tasks/FlightTaskManualStabilized.cpp index 4b3882bae8002a482a3019d714492b3eea8510bb..ea65e577259f01336374eb80186bfe0e6d674ce9 100644 --- a/src/lib/FlightTasks/tasks/FlightTaskManualStabilized.cpp +++ b/src/lib/FlightTasks/tasks/FlightTaskManualStabilized.cpp @@ -147,11 +147,11 @@ bool FlightTaskManualStabilized::update() _scaleSticks(); _updateSetpoints(); - _setPositionSetpoint(_pos_sp); - _setVelocitySetpoint(_vel_sp); - _setThrustSetpoint(_thr_sp); - _setYawSetpoint(_yaw_sp); - _setYawspeedSetpoint(_yaw_rate_sp); + _position_setpoint = _pos_sp; + _velocity_setpoint = _vel_sp; + _thrust_setpoint = _thr_sp; + _yaw_setpoint = _yaw_sp; + _yawspeed_setpoint = _yaw_rate_sp; return true; } diff --git a/src/lib/FlightTasks/tasks/FlightTaskOrbit.cpp b/src/lib/FlightTasks/tasks/FlightTaskOrbit.cpp index 86973dd29d8816cf34440b697e98293e65bf497c..3af14f8147b2a205c031e1b27b2b1fe3c94be284 100644 --- a/src/lib/FlightTasks/tasks/FlightTaskOrbit.cpp +++ b/src/lib/FlightTasks/tasks/FlightTaskOrbit.cpp @@ -79,9 +79,10 @@ bool FlightTaskOrbit::update() _v = math::constrain(_v, -7.f, 7.f); _z += _sticks_expo(2) * _deltatime; - Vector2f center_to_position = Vector2f(_position.data()) - _center; + _position_setpoint = Vector3f(NAN, NAN, _z); /* xy velocity to go around in a circle */ + Vector2f center_to_position = Vector2f(_position.data()) - _center; Vector2f velocity_xy = Vector2f(center_to_position(1), -center_to_position(0)); velocity_xy = velocity_xy.unit_or_zero(); velocity_xy *= _v; @@ -89,10 +90,9 @@ bool FlightTaskOrbit::update() /* xy velocity adjustment to stay on the radius distance */ velocity_xy += (_r - center_to_position.norm()) * center_to_position.unit_or_zero(); - float yaw = atan2f(center_to_position(1), center_to_position(0)) + M_PI_F; + _velocity_setpoint = Vector3f(velocity_xy(0), velocity_xy(1), 0.f); - _setPositionSetpoint(Vector3f(NAN, NAN, _z)); - _setVelocitySetpoint(Vector3f(velocity_xy(0), velocity_xy(1), 0.f)); - _setYawSetpoint(yaw); + /* make vehicle front always point towards the center */ + _yawspeed_setpoint = atan2f(center_to_position(1), center_to_position(0)) + M_PI_F; return true; }