2018-01-12 17:27:36 +01:00
/****************************************************************************
*
2018-03-19 11:43:11 +01:00
* Copyright ( c ) 2018 PX4 Development Team . All rights reserved .
2018-01-12 17:27:36 +01:00
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
*
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in
* the documentation and / or other materials provided with the
* distribution .
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING ,
* BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS
* OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
* LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* @ file FlightTaskAuto . hpp
*
* Map from global triplet to local quadruple .
*/
# pragma once
# include "FlightTask.hpp"
# include <uORB/topics/position_setpoint_triplet.h>
# include <uORB/topics/position_setpoint.h>
2018-04-17 13:31:27 +02:00
# include <uORB/topics/home_position.h>
2019-07-08 22:55:21 -05:00
# include <uORB/topics/manual_control_setpoint.h>
2018-09-07 14:59:18 +02:00
# include <uORB/topics/vehicle_status.h>
2018-04-06 09:59:22 +02:00
# include <lib/ecl/geo/geo.h>
2019-03-22 14:53:19 +01:00
# include <ObstacleAvoidance.hpp>
2019-02-28 23:53:24 +01:00
2018-03-29 10:49:09 +02:00
/**
* This enum has to agree with position_setpoint_s type definition
2018-03-19 11:43:11 +01:00
* The only reason for not using the struct position_setpoint is because
2018-03-29 10:49:09 +02:00
* of the size
*/
2018-01-12 17:27:36 +01:00
enum class WaypointType : int {
2018-11-09 14:03:24 -05:00
position = position_setpoint_s : : SETPOINT_TYPE_POSITION ,
velocity = position_setpoint_s : : SETPOINT_TYPE_VELOCITY ,
loiter = position_setpoint_s : : SETPOINT_TYPE_LOITER ,
takeoff = position_setpoint_s : : SETPOINT_TYPE_TAKEOFF ,
land = position_setpoint_s : : SETPOINT_TYPE_LAND ,
idle = position_setpoint_s : : SETPOINT_TYPE_IDLE ,
offboard = position_setpoint_s : : SETPOINT_TYPE_OFFBOARD , // only part of this structure due to legacy reason. It is not used within the Auto flighttasks
follow_target = position_setpoint_s : : SETPOINT_TYPE_FOLLOW_TARGET ,
2018-01-12 17:27:36 +01:00
} ;
2018-07-25 09:40:35 +02:00
enum class State {
offtrack , /**< Vehicle is more than cruise speed away from track */
target_behind , /**< Vehicle is in front of target. */
previous_infront , /**< Vehilce is behind previous waypoint.*/
none /**< Vehicle is in normal tracking mode from triplet previous to triplet target */
} ;
2018-01-12 17:27:36 +01:00
class FlightTaskAuto : public FlightTask
{
public :
2019-02-28 23:53:24 +01:00
FlightTaskAuto ( ) ;
2018-01-12 17:27:36 +01:00
virtual ~ FlightTaskAuto ( ) = default ;
bool initializeSubscriptions ( SubscriptionArray & subscription_array ) override ;
2019-07-15 17:57:40 +02:00
bool activate ( vehicle_local_position_setpoint_s last_setpoint ) override ;
2018-01-12 17:27:36 +01:00
bool updateInitialize ( ) override ;
2019-04-24 14:34:00 +02:00
bool updateFinalize ( ) override ;
2018-01-12 17:27:36 +01:00
2018-09-05 16:05:53 +02:00
/**
* Sets an external yaw handler which can be used to implement a different yaw control strategy .
*/
void setYawHandler ( WeatherVane * ext_yaw_handler ) override { _ext_yaw_handler = ext_yaw_handler ; }
2018-01-12 17:27:36 +01:00
protected :
2018-04-26 11:24:20 +02:00
void _setDefaultConstraints ( ) override ;
2018-04-27 15:10:46 +02:00
matrix : : Vector2f _getTargetVelocityXY ( ) ; /**< only used for follow-me and only here because of legacy reason.*/
2018-07-25 09:40:35 +02:00
void _updateInternalWaypoints ( ) ; /**< Depending on state of vehicle, the internal waypoints might differ from target (for instance if offtrack). */
2018-08-02 10:07:03 +02:00
bool _compute_heading_from_2D_vector ( float & heading , matrix : : Vector2f v ) ; /**< Computes and sets heading a 2D vector */
2018-04-18 11:20:51 +02:00
2018-03-19 11:43:11 +01:00
matrix : : Vector3f _prev_prev_wp { } ; /**< Pre-previous waypoint (local frame). This will be used for smoothing trajectories -> not used yet. */
matrix : : Vector3f _prev_wp { } ; /**< Previous waypoint (local frame). If no previous triplet is available, the prev_wp is set to current position. */
matrix : : Vector3f _target { } ; /**< Target waypoint (local frame).*/
matrix : : Vector3f _next_wp { } ; /**< The next waypoint after target (local frame). If no next setpoint is available, next is set to target. */
float _mc_cruise_speed { 0.0f } ; /**< Requested cruise speed. If not valid, default cruise speed is used. */
2018-01-12 17:27:36 +01:00
WaypointType _type { WaypointType : : idle } ; /**< Type of current target triplet. */
2019-05-18 11:47:17 -04:00
uORB : : SubscriptionPollable < home_position_s > * _sub_home_position { nullptr } ;
2019-07-08 22:55:21 -05:00
uORB : : SubscriptionPollable < manual_control_setpoint_s > * _sub_manual_control_setpoint { nullptr } ;
uORB : : SubscriptionPollable < vehicle_status_s > * _sub_vehicle_status { nullptr } ;
2018-04-17 13:31:27 +02:00
2018-07-25 09:40:35 +02:00
State _current_state { State : : none } ;
2019-06-27 14:23:08 +02:00
float _target_acceptance_radius { 0.0f } ; /**< Acceptances radius of the target */
int _mission_gear { landing_gear_s : : GEAR_KEEP } ;
2018-07-25 09:40:35 +02:00
2019-06-27 14:23:08 +02:00
float _yaw_sp_prev { NAN } ;
2019-06-27 14:07:48 +02:00
bool _yaw_sp_aligned { false } ;
2019-05-09 14:12:11 +02:00
2019-03-22 14:53:19 +01:00
ObstacleAvoidance _obstacle_avoidance ; /**< class adjusting setpoints according to external avoidance module's input */
2019-03-06 13:05:04 +01:00
2018-07-25 09:40:35 +02:00
DEFINE_PARAMETERS_CUSTOM_PARENT ( FlightTask ,
2019-03-20 10:28:17 +01:00
( ParamFloat < px4 : : params : : MPC_XY_CRUISE > ) _param_mpc_xy_cruise ,
( ParamFloat < px4 : : params : : MPC_CRUISE_90 > ) _param_mpc_cruise_90 , // speed at corner when angle is 90 degrees move to line
( ParamFloat < px4 : : params : : NAV_MC_ALT_RAD > )
_param_nav_mc_alt_rad , //vertical acceptance radius at which waypoints are updated
( ParamInt < px4 : : params : : MPC_YAW_MODE > ) _param_mpc_yaw_mode , // defines how heading is executed,
2019-04-24 14:34:00 +02:00
( ParamInt < px4 : : params : : COM_OBS_AVOID > ) _param_com_obs_avoid , // obstacle avoidance active
2019-04-25 10:17:46 +02:00
( ParamFloat < px4 : : params : : MPC_YAWRAUTO_MAX > ) _param_mpc_yawrauto_max
2018-08-02 09:50:59 +02:00
) ;
2018-07-25 09:40:35 +02:00
2018-01-12 17:27:36 +01:00
private :
2018-07-31 10:32:50 +02:00
matrix : : Vector2f _lock_position_xy { NAN , NAN } ; /**< if no valid triplet is received, lock positition to current position */
2019-06-27 14:23:08 +02:00
bool _yaw_lock { false } ; /**< if within acceptance radius, lock yaw to current yaw */
2019-05-18 11:47:17 -04:00
uORB : : SubscriptionPollable < position_setpoint_triplet_s > * _sub_triplet_setpoint { nullptr } ;
2018-04-11 09:20:04 +02:00
2018-07-31 10:32:50 +02:00
matrix : : Vector3f
_triplet_target ; /**< current triplet from navigator which may differ from the intenal one (_target) depending on the vehicle state. */
matrix : : Vector3f
_triplet_prev_wp ; /**< previous triplet from navigator which may differ from the intenal one (_prev_wp) depending on the vehicle state.*/
matrix : : Vector3f
_triplet_next_wp ; /**< next triplet from navigator which may differ from the intenal one (_next_wp) depending on the vehicle state.*/
2018-07-26 15:53:01 +02:00
matrix : : Vector2f _closest_pt ; /**< closest point to the vehicle position on the line previous - target */
2018-04-11 09:20:04 +02:00
2018-03-19 11:43:11 +01:00
map_projection_reference_s _reference_position { } ; /**< Structure used to project lat/lon setpoint into local frame. */
2019-06-27 14:23:08 +02:00
float _reference_altitude { NAN } ; /**< Altitude relative to ground. */
hrt_abstime _time_stamp_reference { 0 } ; /**< time stamp when last reference update occured. */
2018-03-01 14:36:38 +01:00
2019-06-27 14:23:08 +02:00
WeatherVane * _ext_yaw_handler { nullptr } ; /**< external weathervane library, used to implement a yaw control law that turns the vehicle nose into the wind */
2018-09-05 16:05:53 +02:00
2018-08-06 16:27:42 +02:00
2019-04-24 14:34:00 +02:00
void _limitYawRate ( ) ; /**< Limits the rate of change of the yaw setpoint. */
2018-03-19 11:43:11 +01:00
bool _evaluateTriplets ( ) ; /**< Checks and sets triplets. */
2018-08-30 11:51:01 -04:00
bool _isFinite ( const position_setpoint_s & sp ) ; /**< Checks if all waypoint triplets are finite. */
2018-05-24 08:52:43 +02:00
bool _evaluateGlobalReference ( ) ; /**< Check is global reference is available. */
2018-07-26 15:53:01 +02:00
State _getCurrentState ( ) ; /**< Computes the current vehicle state based on the vehicle position and navigator triplets. */
2018-07-23 15:31:58 +02:00
void _set_heading_from_mode ( ) ; /**< @see MPC_YAW_MODE */
2018-01-12 17:27:36 +01:00
} ;