Skip to content
Snippets Groups Projects
UAS.h 13.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
     *
     * QGroundControl is licensed according to the terms in the file
     * COPYING.md in the root of the source code directory.
     *
     ****************************************************************************/
    
    Donald Gagne's avatar
    Donald Gagne committed
    // NO NEW CODE HERE
    // UASInterface, UAS.h/cc are deprecated. All new functionality should go into Vehicle.h/cc
    //
    
    
    #ifndef _UAS_H_
    #define _UAS_H_
    
    #include "UASInterface.h"
    #include <MAVLinkProtocol.h>
    #include <QVector3D>
    #include "QGCMAVLink.h"
    
    #include "Vehicle.h"
    
    #include "FirmwarePluginManager.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    #include "FileManager.h"
    
    #include "QGCHilLink.h"
    #include "QGCFlightGearLink.h"
    
    #include "QGCXPlaneLink.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    Q_DECLARE_LOGGING_CATEGORY(UASLog)
    
    /**
     * @brief A generic MAVLINK-connected MAV/UAV
     *
     * This class represents one vehicle. It can be used like the real vehicle, e.g. a call to halt()
     * will automatically send the appropriate messages to the vehicle. The vehicle state will also be
     * automatically updated by the comm architecture, so when writing code to e.g. control the vehicle
     * no knowledge of the communication infrastructure is needed.
     */
    class UAS : public UASInterface
    {
        Q_OBJECT
    public:
    
        UAS(MAVLinkProtocol* protocol, Vehicle* vehicle, FirmwarePluginManager * firmwarePluginManager);
    
        float lipoFull;  ///< 100% charged voltage
        float lipoEmpty; ///< Discharged voltage
    
    
        /* MANAGEMENT */
    
        /** @brief Get the unique system id */
        int getUASID() const;
        /** @brief Get the components */
        QMap<int, QString> getComponents();
    
        /** @brief The time interval the robot is switched on */
        quint64 getUptime() const;
    
    
    DonLakeFlyer's avatar
    DonLakeFlyer committed
    	/// Vehicle is about to go away
    	void shutdownVehicle(void);
    	
    
        // Setters for HIL noise variance
        void setXaccVar(float var){
            xacc_var = var;
        }
    
        void setYaccVar(float var){
            yacc_var = var;
        }
    
        void setZaccVar(float var){
            zacc_var = var;
        }
    
        void setRollSpeedVar(float var){
            rollspeed_var = var;
        }
    
        void setPitchSpeedVar(float var){
            pitchspeed_var = var;
        }
    
        void setYawSpeedVar(float var){
            pitchspeed_var = var;
        }
    
        void setXmagVar(float var){
            xmag_var = var;
        }
    
        void setYmagVar(float var){
            ymag_var = var;
        }
    
        void setZmagVar(float var){
            zmag_var = var;
        }
    
        void setAbsPressureVar(float var){
            abs_pressure_var = var;
        }
    
        void setDiffPressureVar(float var){
            diff_pressure_var = var;
        }
    
        void setPressureAltVar(float var){
            pressure_alt_var = var;
        }
    
        void setTemperatureVar(float var){
            temperature_var = var;
        }
    
    
        friend class FileManager;
    
    
    protected: //COMMENTS FOR TEST UNIT
    
        /// LINK ID AND STATUS
    
        int uasId;                    ///< Unique system ID
    
        QMap<int, QString> components;///< IDs and names of all detected onboard components
    
        QList<int> unknownPackets;    ///< Packet IDs which are unknown and have been received
        MAVLinkProtocol* mavlink;     ///< Reference to the MAVLink instance
    
        float receiveDropRate;        ///< Percentage of packets that were dropped on the MAV's receiving link (from GCS and other MAVs)
        float sendDropRate;           ///< Percentage of packets that were not received from the MAV by the GCS
    
        /// BASIC UAS TYPE, NAME AND STATE
        int status;                   ///< The current status of the MAV
    
        /// TIMEKEEPING
        quint64 startTime;            ///< The time the UAS was switched on
    
        quint64 onboardTimeOffset;
    
    
        bool controlRollManual;     ///< status flag, true if roll is controlled manually
        bool controlPitchManual;    ///< status flag, true if pitch is controlled manually
        bool controlYawManual;      ///< status flag, true if yaw is controlled manually
        bool controlThrustManual;   ///< status flag, true if thrust is controlled manually
    
        double manualRollAngle;     ///< Roll angle set by human pilot (radians)
        double manualPitchAngle;    ///< Pitch angle set by human pilot (radians)
        double manualYawAngle;      ///< Yaw angle set by human pilot (radians)
        double manualThrust;        ///< Thrust set by human pilot (radians)
    
        bool isGlobalPositionKnown; ///< If the global position has been received for this MAV
    
        FileManager   fileManager;
    
    
        /// ATTITUDE
        bool attitudeKnown;             ///< True if attitude was received, false else
        bool attitudeStamped;           ///< Should arriving data be timestamped with the last attitude? This helps with broken system time clocks on the MAV
        quint64 lastAttitude;           ///< Timestamp of last attitude measurement
    
        // dongfang: This looks like a candidate for being moved off to a separate class.
        /// IMAGING
    
        int imageSize;              ///< Image size being transmitted (bytes)
        int imagePackets;           ///< Number of data packets being sent for this image
    
    nopeppermint's avatar
    nopeppermint committed
        int imagePacketsArrived;    ///< Number of data packets received
    
        int imagePayload;           ///< Payload size per transmitted packet (bytes). Standard is 254, and decreases when image resolution increases.
        int imageQuality;           ///< Quality of the transmitted image (percentage)
        int imageType;              ///< Type of the transmitted image (BMP, PNG, JPEG, RAW 8 bit, RAW 32 bit)
        int imageWidth;             ///< Width of the image stream
        int imageHeight;            ///< Width of the image stream
        QByteArray imageRecBuffer;  ///< Buffer for the incoming bytestream
        QImage image;               ///< Image data of last completely transmitted image
        quint64 imageStart;
    
        bool blockHomePositionChanges;   ///< Block changes to the home position
    
        bool receivedMode;          ///< True if mode was retrieved from current conenction to UAS
    
        /// SIMULATION NOISE
        float xacc_var;             ///< variance of x acclerometer noise for HIL sim (mg)
        float yacc_var;             ///< variance of y acclerometer noise for HIL sim (mg)
        float zacc_var;             ///< variance of z acclerometer noise for HIL sim (mg)
        float rollspeed_var;        ///< variance of x gyroscope noise for HIL sim (rad/s)
        float pitchspeed_var;       ///< variance of y gyroscope noise for HIL sim (rad/s)
        float yawspeed_var;         ///< variance of z gyroscope noise for HIL sim (rad/s)
        float xmag_var;             ///< variance of x magnatometer noise for HIL sim (???)
        float ymag_var;             ///< variance of y magnatometer noise for HIL sim (???)
        float zmag_var;             ///< variance of z magnatometer noise for HIL sim (???)
        float abs_pressure_var;     ///< variance of absolute pressure noise for HIL sim (hPa)
        float diff_pressure_var;    ///< variance of differential pressure noise for HIL sim (hPa)
        float pressure_alt_var;     ///< variance of altitude pressure noise for HIL sim (hPa)
        float temperature_var;      ///< variance of temperature noise for HIL sim (C)
    
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
        QGCHilLink* simulation;         ///< Hardware in the loop simulation link
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    
    public:
        /** @brief Get the human-readable status message for this code */
        void getStatusForCode(int statusCode, QString& uasState, QString& stateDescription);
    
    
    #ifndef __mobile__
        virtual FileManager* getFileManager() { return &fileManager; }
    #endif
    
        /** @brief Get the HIL simulation */
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
        QGCHilLink* getHILSimulation() const {
            return simulation;
        }
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
        QImage getImage();
        void requestImage();
    
    public slots:
    
        /** @brief Order the robot to pair its receiver **/
        void pairRX(int rxType, int rxSubType);
    
    
        /** @brief Enable / disable HIL */
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
        void enableHilFlightGear(bool enable, QString options, bool sensorHil, QObject * configuration);
    
        void enableHilJSBSim(bool enable, QString options);
    
        void enableHilXPlane(bool enable);
    
        /** @brief Send the full HIL state to the MAV */
    
        void sendHilState(quint64 time_us, float roll, float pitch, float yaw, float rollRotationRate,
                            float pitchRotationRate, float yawRotationRate, double lat, double lon, double alt,
    
                            float vx, float vy, float vz, float ind_airspeed, float true_airspeed, float xacc, float yacc, float zacc);
    
        void sendHilGroundTruth(quint64 time_us, float roll, float pitch, float yaw, float rollRotationRate,
                            float pitchRotationRate, float yawRotationRate, double lat, double lon, double alt,
                            float vx, float vy, float vz, float ind_airspeed, float true_airspeed, float xacc, float yacc, float zacc);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        /** @brief RAW sensors for sensor HIL */
    
        void sendHilSensors(quint64 time_us, float xacc, float yacc, float zacc, float rollspeed, float pitchspeed, float yawspeed,
                            float xmag, float ymag, float zmag, float abs_pressure, float diff_pressure, float pressure_alt, float temperature, quint32 fields_changed);
    
        /** @brief Send Optical Flow sensor message for HIL, (arguments and units accoding to mavlink documentation*/
        void sendHilOpticalFlow(quint64 time_us, qint16 flow_x, qint16 flow_y, float flow_comp_m_x,
                                float flow_comp_m_y, quint8 quality, float ground_distance);
    
    
        float addZeroMeanNoise(float truth_meas, float noise_var);
    
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        /**
         * @param time_us
         * @param lat
         * @param lon
         * @param alt
         * @param fix_type
         * @param eph
         * @param epv
         * @param vel
         * @param cog course over ground, in radians, -pi..pi
         * @param satellites
         */
    
        void sendHilGps(quint64 time_us, double lat, double lon, double alt, int fix_type, float eph, float epv, float vel, float vn, float ve, float vd,  float cog, int satellites);
    
        /** @brief Places the UAV in Hardware-in-the-Loop simulation status **/
        void startHil();
    
        /** @brief Stops the UAV's Hardware-in-the-Loop simulation status **/
        void stopHil();
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    
        /** @brief Set the values for the manual control of the vehicle */
    
        void setExternalControlSetpoint(float roll, float pitch, float yaw, float thrust, quint16 buttons, int joystickMode);
    
    
        /** @brief Set the values for the 6dof manual control of the vehicle */
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
        void setManual6DOFControlCommands(double x, double y, double z, double roll, double pitch, double yaw);
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    
        /** @brief Receive a message from one of the communication links. */
    
        virtual void receiveMessage(mavlink_message_t message);
    
        void startCalibration(StartCalibrationType calType);
        void stopCalibration(void);
    
        void startBusConfig(StartBusConfigType calType);
        void stopBusConfig(void);
    
    
        /** @brief Send command to map a RC channel to a parameter */
    
        void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax);
    
    
        /** @brief Send command to disable all bindings/maps between RC and parameters */
        void unsetRCToParameterMap();
    
    signals:
        void imageStarted(quint64 timestamp);
        /** @brief A new camera image has arrived */
        void imageReady(UASInterface* uas);
        /** @brief HIL controls have changed */
    
        void hilControlsChanged(quint64 time, float rollAilerons, float pitchElevator, float yawRudder, float throttle, quint8 systemMode, quint8 navMode);
    
        void rollChanged(double val,QString name);
        void pitchChanged(double val,QString name);
        void yawChanged(double val,QString name);
    
    Don Gagne's avatar
    Don Gagne committed
    
    
    protected:
        /** @brief Get the UNIX timestamp in milliseconds, enter microseconds */
        quint64 getUnixTime(quint64 time=0);
        /** @brief Get the UNIX timestamp in milliseconds, enter milliseconds */
        quint64 getUnixTimeFromMs(quint64 time);
        /** @brief Get the UNIX timestamp in milliseconds, ignore attitudeStamped mode */
        quint64 getUnixReferenceTime(quint64 time);
    
        virtual void processParamValueMsg(mavlink_message_t& msg, const QString& paramName,const mavlink_param_value_t& rawValue, mavlink_param_union_t& paramValue);
    
    
    Gus Grubba's avatar
    Gus Grubba committed
        QMap<int, int>componentID;
        QMap<int, bool>componentMulti;
    
    
        bool connectionLost; ///< Flag indicates a timed out connection
        quint64 connectionLossTime; ///< Time the connection was interrupted
    
    Ricardo de Almeida Gonzaga's avatar
    Ricardo de Almeida Gonzaga committed
        quint64 lastVoltageWarning; ///< Time at which the last voltage warning occurred
    
        quint64 lastNonNullTime;    ///< The last timestamp from the MAV that was not null
        unsigned int onboardTimeOffsetInvalidCount;     ///< Count when the offboard time offset estimation seemed wrong
    
    Don Gagne's avatar
    Don Gagne committed
        bool hilEnabled;
    
        bool sensorHil;             ///< True if sensor HIL is enabled
    
        quint64 lastSendTimeGPS;     ///< Last HIL GPS message sent
    
        quint64 lastSendTimeSensors; ///< Last HIL Sensors message sent
        quint64 lastSendTimeOpticalFlow; ///< Last HIL Optical Flow message sent
    
        Vehicle*                _vehicle;
        FirmwarePluginManager*  _firmwarePluginManager;