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>
2018-04-06 09:59:22 +02:00
# include <lib/ecl/geo/geo.h>
2018-01-12 17:27:36 +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 {
position = 0 ,
velocity ,
loiter ,
takeoff ,
land ,
2018-04-27 15:10:46 +02:00
idle ,
offboard , // only part of this structure due to legacy reason. It is not used
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 :
2018-04-11 09:20:04 +02:00
FlightTaskAuto ( ) = default ;
2018-01-12 17:27:36 +01:00
virtual ~ FlightTaskAuto ( ) = default ;
bool initializeSubscriptions ( SubscriptionArray & subscription_array ) override ;
bool activate ( ) override ;
bool updateInitialize ( ) override ;
protected :
2018-04-26 11:24:20 +02:00
void _setDefaultConstraints ( ) override ;
float _getMaxCruiseSpeed ( ) { return MPC_XY_CRUISE . get ( ) ; } /**< getter for default cruise speed */
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-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. */
2018-04-17 13:31:27 +02:00
uORB : : Subscription < home_position_s > * _sub_home_position { nullptr } ;
2018-07-25 09:40:35 +02:00
State _current_state { State : : none } ;
float _speed_at_target = 0.0f ; /**< Desired velocity at target. */
DEFINE_PARAMETERS_CUSTOM_PARENT ( FlightTask ,
( ParamFloat < px4 : : params : : MPC_XY_CRUISE > ) MPC_XY_CRUISE ,
( ParamFloat < px4 : : params : : MPC_CRUISE_90 > ) MPC_CRUISE_90 , // speed at corner when angle is 90 degrees move to line
( ParamFloat < px4 : : params : : NAV_ACC_RAD > ) NAV_ACC_RAD // acceptance radius at which waypoints are updated move to line
) ; /**< Default mc cruise speed.*/
2018-01-12 17:27:36 +01:00
private :
2018-05-28 15:22:04 +02:00
matrix : : Vector2f _lock_position_xy { NAN , NAN } ;
2018-05-28 14:53:03 +02:00
2018-01-12 17:27:36 +01:00
uORB : : Subscription < position_setpoint_triplet_s > * _sub_triplet_setpoint { nullptr } ;
2018-04-11 09:20:04 +02:00
2018-07-26 15:53:01 +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.*/
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. */
2018-04-26 13:13:17 +02:00
float _reference_altitude = NAN ; /**< Altitude relative to ground. */
2018-03-19 11:43:11 +01:00
hrt_abstime _time_stamp_reference = 0 ; /**< time stamp when last reference update occured. */
2018-03-01 14:36:38 +01:00
2018-03-19 11:43:11 +01:00
bool _evaluateTriplets ( ) ; /**< Checks and sets triplets. */
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-25 09:40:35 +02:00
float _getVelocityFromAngle ( const float angle ) ; /**< Computes the speed at target depending on angle. */
2018-07-26 15:53:01 +02:00
State _getCurrentState ( ) ; /**< Computes the current vehicle state based on the vehicle position and navigator triplets. */
2018-01-12 17:27:36 +01:00
} ;