Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/master/libraries/AP_Follow/AP_Follow.h
Views: 1798
/*1This program is free software: you can redistribute it and/or modify2it under the terms of the GNU General Public License as published by3the Free Software Foundation, either version 3 of the License, or4(at your option) any later version.56This program is distributed in the hope that it will be useful,7but WITHOUT ANY WARRANTY; without even the implied warranty of8MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9GNU General Public License for more details.1011You should have received a copy of the GNU General Public License12along with this program. If not, see <http://www.gnu.org/licenses/>.13*/14#pragma once15#include "AP_Follow_config.h"1617#if AP_FOLLOW_ENABLED1819#include <AP_Common/AP_Common.h>20#include <AP_Common/Location.h>21#include <AP_HAL/AP_HAL.h>22#include <AP_Param/AP_Param.h>23#include <AP_Math/AP_Math.h>24#include <GCS_MAVLink/GCS_MAVLink.h>25#include <AC_PID/AC_P.h>26#include <AP_RTC/JitterCorrection.h>2728class AP_Follow29{3031public:3233// enum for FOLLOW_OPTIONS parameter34enum class Option {35MOUNT_FOLLOW_ON_ENTER = 136};3738// enum for YAW_BEHAVE parameter39enum YawBehave {40YAW_BEHAVE_NONE = 0,41YAW_BEHAVE_FACE_LEAD_VEHICLE = 1,42YAW_BEHAVE_SAME_AS_LEAD_VEHICLE = 2,43YAW_BEHAVE_DIR_OF_FLIGHT = 344};4546// constructor47AP_Follow();4849// enable as singleton50static AP_Follow *get_singleton(void) {51return _singleton;52}5354// returns true if library is enabled55bool enabled() const { return _enabled; }5657// set which target to follow58void set_target_sysid(uint8_t sysid) { _sysid.set(sysid); }5960// restore offsets to zero if necessary, should be called when vehicle exits follow mode61void clear_offsets_if_required();6263//64// position tracking related methods65//6667// true if we have a valid target location estimate68bool have_target() const;6970// get target's estimated location and velocity (in NED)71bool get_target_location_and_velocity(Location &loc, Vector3f &vel_ned) const;7273// get target's estimated location and velocity (in NED), with offsets added74bool get_target_location_and_velocity_ofs(Location &loc, Vector3f &vel_ned) const;7576// get distance vector to target (in meters), target plus offsets, and target's velocity all in NED frame77bool get_target_dist_and_vel_ned(Vector3f &dist_ned, Vector3f &dist_with_ofs, Vector3f &vel_ned);7879// get target sysid80uint8_t get_target_sysid() const { return _sysid.get(); }8182// get position controller. this controller is not used within this library but it is convenient to hold it here83const AC_P& get_pos_p() const { return _p_pos; }8485//86// yaw/heading related methods87//8889// get user defined yaw behaviour90YawBehave get_yaw_behave() const { return (YawBehave)_yaw_behave.get(); }9192// get target's heading in degrees (0 = north, 90 = east)93bool get_target_heading_deg(float &heading) const;9495// parse mavlink messages which may hold target's position, velocity and attitude96void handle_msg(const mavlink_message_t &msg);9798//99// GCS reporting functions100//101102// get horizontal distance to target (including offset) in meters (for reporting purposes)103float get_distance_to_target() const { return _dist_to_target; }104105// get bearing to target (including offset) in degrees (for reporting purposes)106float get_bearing_to_target() const { return _bearing_to_target; }107108// get system time of last position update109uint32_t get_last_update_ms() const { return _last_location_update_ms; }110111// returns true if a follow option enabled112bool option_is_enabled(Option option) const { return (_options.get() & (uint16_t)option) != 0; }113114// parameter list115static const struct AP_Param::GroupInfo var_info[];116117private:118static AP_Follow *_singleton;119120// returns true if we should extract information from msg121bool should_handle_message(const mavlink_message_t &msg) const;122123// get velocity estimate in m/s in NED frame using dt since last update124bool get_velocity_ned(Vector3f &vel_ned, float dt) const;125126// initialise offsets to provided distance vector to other vehicle (in meters in NED frame) if required127void init_offsets_if_required(const Vector3f &dist_vec_ned);128129// get offsets in meters in NED frame130bool get_offsets_ned(Vector3f &offsets) const;131132// rotate 3D vector clockwise by specified angle (in degrees)133Vector3f rotate_vector(const Vector3f &vec, float angle_deg) const;134135// set recorded distance and bearing to target to zero136void clear_dist_and_bearing_to_target();137138// handle various mavlink messages supplying position:139bool handle_global_position_int_message(const mavlink_message_t &msg);140bool handle_follow_target_message(const mavlink_message_t &msg);141142// write out an onboard-log message to help diagnose follow problems:143void Log_Write_FOLL();144145// parameters146AP_Int8 _enabled; // 1 if this subsystem is enabled147AP_Int16 _sysid; // target's mavlink system id (0 to use first sysid seen)148AP_Float _dist_max; // maximum distance to target. targets further than this will be ignored149AP_Int8 _offset_type; // offset frame type (0:North-East-Down, 1:RelativeToLeadVehicleHeading)150AP_Vector3f _offset; // offset from lead vehicle in meters151AP_Int8 _yaw_behave; // following vehicle's yaw/heading behaviour (see YAW_BEHAVE enum)152AP_Int8 _alt_type; // altitude source for follow mode153AC_P _p_pos; // position error P controller154AP_Int16 _options; // options for mount behaviour follow mode155156// local variables157uint32_t _last_location_update_ms; // system time of last position update158Location _target_location; // last known location of target159Vector3f _target_velocity_ned; // last known velocity of target in NED frame in m/s160Vector3f _target_accel_ned; // last known acceleration of target in NED frame in m/s/s161uint32_t _last_heading_update_ms; // system time of last heading update162float _target_heading; // heading in degrees163bool _automatic_sysid; // did we lock onto a sysid automatically?164float _dist_to_target; // latest distance to target in meters (for reporting purposes)165float _bearing_to_target; // latest bearing to target in degrees (for reporting purposes)166bool _offsets_were_zero; // true if offsets were originally zero and then initialised to the offset from lead vehicle167168// setup jitter correction with max transport lag of 3s169JitterCorrection _jitter{3000};170};171172namespace AP {173AP_Follow &follow();174};175176#endif177178179