Skip to content
Snippets Groups Projects
UAS.h 10.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /*=====================================================================
    
    
    QGroundControl Open Source Ground Control Station
    
    pixhawk's avatar
    pixhawk committed
    
    
    (c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
    
    pixhawk's avatar
    pixhawk committed
    
    
    This file is part of the QGROUNDCONTROL project
    
    pixhawk's avatar
    pixhawk committed
    
    
        QGROUNDCONTROL is free software: you can redistribute it and/or modify
    
    pixhawk's avatar
    pixhawk committed
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
    
        QGROUNDCONTROL is distributed in the hope that it will be useful,
    
    pixhawk's avatar
    pixhawk committed
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
    
        along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
    
    pixhawk's avatar
    pixhawk committed
    
    ======================================================================*/
    
    /**
     * @file
     *   @brief Definition of Unmanned Aerial Vehicle object
     *
     *   @author Lorenz Meier <mavteam@student.ethz.ch>
     *
     */
    
    #ifndef _UAS_H_
    #define _UAS_H_
    
    #include "UASInterface.h"
    #include "MG.h"
    
    #include <MAVLinkProtocol.h>
    
    pixhawk's avatar
    pixhawk committed
    #include "QGCMAVLink.h"
    
    pixhawk's avatar
    pixhawk committed
    
    /**
     * @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, int id = 0);
    
    pixhawk's avatar
    pixhawk committed
        ~UAS();
    
    
    pixhawk's avatar
    pixhawk committed
            NICD = 0,
            NIMH = 1,
            LIION = 2,
            LIPOLY = 3,
            LIFE = 4,
            AGZN = 5
    
        }; ///< The type of battery used
    
    pixhawk's avatar
    pixhawk committed
    
        static const int lipoFull = 4.2f;  ///< 100% charged voltage
        static const int lipoEmpty = 3.5f; ///< Discharged voltage
    
        /* MANAGEMENT */
    
        /** @brief The name of the robot */
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Get the unique system id */
    
    pixhawk's avatar
    pixhawk committed
        /** @brief The time interval the robot is switched on */
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Get the status flag for the communication */
    
        int getCommunicationStatus() const;
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Add one measurement and get low-passed voltage */
    
        float filterVoltage(float value) const;
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Get the links associated with this robot */
        QList<LinkInterface*>* getLinks();
    
    
    lm's avatar
    lm committed
        double getLocalX() const { return localX; };
        double getLocalY() const { return localY; };
        double getLocalZ() const { return localZ; };
    
        double getRoll() const { return roll; };
        double getPitch() const { return pitch; };
        double getYaw() const { return yaw; };
    
    
    
    pixhawk's avatar
    pixhawk committed
    friend class UASWaypointManager;
    
    pixhawk's avatar
    pixhawk committed
    protected:
    
        int uasId;                    ///< Unique system ID
        int type;                     ///< UAS type (from type enum)
    
    pixhawk's avatar
    pixhawk committed
        quint64 startTime;            ///< The time the UAS was switched on
        CommStatus commStatus;        ///< Communication status
        QString name;                 ///< Human-friendly name of the vehicle, e.g. bravo
    
    pixhawk's avatar
    pixhawk committed
        QList<LinkInterface*>* links; ///< List of links this UAS can be reached by
    
        QList<int> unknownPackets;    ///< Packet IDs which are unknown and have been received
    
        MAVLinkProtocol* mavlink;     ///< Reference to the MAVLink instance
    
    pixhawk's avatar
    pixhawk committed
        BatteryType batteryType;      ///< The battery type
        int cells;                    ///< Number of cells
    
    pixhawk's avatar
    pixhawk committed
    
    
        UASWaypointManager waypointManager;
    
    
    pixhawk's avatar
    pixhawk committed
        QList<double> actuatorValues;
        QList<QString> actuatorNames;
    
        QList<double> motorValues;
        QList<QString> motorNames;
    
    
    pixhawk's avatar
    pixhawk committed
        double thrustSum;           ///< Sum of forward/up thrust of all thrust actuators, in Newtons
        double thrustMax;           ///< Maximum forward/up thrust of this vehicle, in Newtons
    
    pixhawk's avatar
    pixhawk committed
    
        // Battery stats
    
    pixhawk's avatar
    pixhawk committed
        double fullVoltage;         ///< Voltage of the fully charged battery (100%)
        double emptyVoltage;        ///< Voltage of the empty battery (0%)
        double startVoltage;        ///< Voltage at system start
        double currentVoltage;      ///< Voltage currently measured
        float lpVoltage;            ///< Low-pass filtered voltage
        int timeRemaining;          ///< Remaining time calculated based on previous and current
    
    lm's avatar
    lm committed
        unsigned int mode;          ///< The current mode of the MAV
    
    pixhawk's avatar
    pixhawk committed
        int status;                 ///< The current status of the MAV
    
    pixhawk's avatar
    pixhawk committed
        quint64 onboardTimeOffset;
    
    
    pixhawk's avatar
    pixhawk committed
        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)
    
    lm's avatar
    lm committed
        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
    
    lm's avatar
    lm committed
        bool lowBattAlarm;          ///< Switch if battery is low
    
        bool positionLock;          ///< Status if position information is available or not
    
    lm's avatar
    lm committed
        double localX;
        double localY;
        double localZ;
        double roll;
        double pitch;
        double yaw;
    
        QTimer* statusTimeout;      ///< Timer for various status timeouts
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Set the current battery type */
        void setBattery(BatteryType type, int cells);
        /** @brief Estimate how much flight time is remaining */
        int calculateTimeRemaining();
        /** @brief Get the current charge level */
        double getChargeLevel();
        /** @brief Get the human-readable status message for this code */
        void getStatusForCode(int statusCode, QString& uasState, QString& stateDescription);
        /** @brief Check if vehicle is in autonomous mode */
        bool isAuto();
    
    
    public:
        UASWaypointManager &getWaypointManager(void) { return waypointManager; }
    
    pixhawk's avatar
    pixhawk committed
    public slots:
        /** @brief Launches the system **/
        void launch();
    
    lm's avatar
    lm committed
        /** @brief Write this waypoint to the list of waypoints */
    
        //void setWaypoint(Waypoint* wp); FIXME tbd
    
    lm's avatar
    lm committed
        /** @brief Set currently active waypoint */
    
        //void setWaypointActive(int id); FIXME tbd
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Order the robot to return home / to land on the runway **/
        void home();
        void halt();
        void go();
        /** @brief Stops the robot system. If it is an MAV, the robot starts the emergency landing procedure **/
        void emergencySTOP();
    
        /** @brief Kills the robot. All systems are immediately shut down (e.g. the main power line is cut). This might lead to a crash **/
        bool emergencyKILL();
    
        /** @brief Shut the system cleanly down. Will shut down any onboard computers **/
        void shutdown();
    
    
        /** @brief Set the target position for the robot to navigate to. */
        void setTargetPosition(float x, float y, float z, float yaw);
    
    
    lm's avatar
    lm committed
        void startLowBattAlarm();
        void stopLowBattAlarm();
    
    
        //void requestWaypoints();  FIXME tbd
        //void clearWaypointList();   FIXME tbd
    
        void requestParameters();
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Enable the motors */
        void enable_motors();
        /** @brief Disable the motors */
        void disable_motors();
    
        /** @brief Set the values for the manual control of the vehicle */
        void setManualControlCommands(double roll, double pitch, double yaw, double thrust);
        /** @brief Receive a button pressed event from an input device, e.g. joystick */
        void receiveButton(int buttonIndex);
    
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Add a link associated with this robot */
    
    pixhawk's avatar
    pixhawk committed
        void addLink(LinkInterface* link);
    
        /** @brief Receive a message from one of the communication links. */
        void receiveMessage(LinkInterface* link, mavlink_message_t message);
    
        /** @brief Send a message over this link (to this or to all UAS on this link) */
        void sendMessage(LinkInterface* link, mavlink_message_t message);
        /** @brief Send a message over all links this UAS can be reached with (!= all links) */
        void sendMessage(mavlink_message_t message);
    
        /** @brief Set this UAS as the system currently in focus, e.g. in the main display widgets */
        void setSelected();
    
        /** @brief Set current mode of operation, e.g. auto or manual */
    
    pixhawk's avatar
    pixhawk committed
        void setMode(int mode);
    
    pixhawk's avatar
    pixhawk committed
    
    
        /** @brief Set a system parameter */
        void setParameter(int component, QString id, float value);
    
        /** @brief Write parameters to permanent storage */
    
        void writeParametersToStorage();
        /** @brief Read parameters from permanent storage */
        void readParametersFromStorage();
    
    James Goppert's avatar
    James Goppert committed
        void enableAllDataTransmission(int rate);
        void enableRawSensorDataTransmission(int rate);
        void enableExtendedSystemStatusTransmission(int rate);
        void enableRCChannelDataTransmission(int rate);
        void enableRawControllerDataTransmission(int rate);
        void enableRawSensorFusionTransmission(int rate);
        void enablePositionTransmission(int rate);
        void enableExtra1Transmission(int rate);
        void enableExtra2Transmission(int rate);
        void enableExtra3Transmission(int rate);
    
    lm's avatar
    lm committed
    
    
        /** @brief Update the system state */
        void updateState();
    
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Set local position setpoint */
        void setLocalPositionSetpoint(float x, float y, float z, float yaw);
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Add an offset in body frame to the setpoint */
        void setLocalPositionOffset(float x, float y, float z, float yaw);
    
        void startRadioControlCalibration();
        void startMagnetometerCalibration();
        void startGyroscopeCalibration();
        void startPressureCalibration();
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        void startDataRecording();
        void pauseDataRecording();
        void stopDataRecording();
    
    
    pixhawk's avatar
    pixhawk committed
    signals:
    
        /** @brief The main/battery voltage has changed/was updated */
        void voltageChanged(int uasId, double voltage);
        /** @brief An actuator value has changed */
        void actuatorChanged(UASInterface*, int actId, double value);
        /** @brief An actuator value has changed */
        void actuatorChanged(UASInterface* uas, QString actuatorName, double min, double max, double value);
        void motorChanged(UASInterface* uas, QString motorName, double min, double max, double value);
        /** @brief The system load (MCU/CPU usage) changed */
        void loadChanged(UASInterface* uas, double load);
        /** @brief Propagate a heartbeat received from the system */
        void heartbeat(UASInterface* uas);
    
    
        protected:
        /** @brief Get the UNIX timestamp in microseconds */
        quint64 getUnixTime(quint64 time);
    
    pixhawk's avatar
    pixhawk committed
    };
    
    
    #endif // _UAS_H_