UASInterface.h 16.5 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10 11 12 13
    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.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15 16 17 18 19
    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
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

======================================================================*/

/**
 * @file
 *   @brief Abstract interface, represents one unmanned aerial vehicle
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#ifndef _UASINTERFACE_H_
#define _UASINTERFACE_H_

#include <QObject>
#include <QList>
#include <QAction>
#include <QColor>
39
#include <QPointer>
pixhawk's avatar
pixhawk committed
40 41 42

#include "LinkInterface.h"
#include "ProtocolInterface.h"
43
#include "UASWaypointManager.h"
pixhawk's avatar
pixhawk committed
44

45
class FileManager;
46

47 48 49 50 51 52 53 54 55 56
enum BatteryType
{
    NICD = 0,
    NIMH = 1,
    LIION = 2,
    LIPOLY = 3,
    LIFE = 4,
    AGZN = 5
}; ///< The type of battery used

pixhawk's avatar
pixhawk committed
57 58 59 60 61 62
/**
 * @brief Interface for all robots.
 *
 * This interface is abstract and thus cannot be instantiated. It serves only as type definition.
 * It represents an unmanned aerial vehicle, e.g. a micro air vehicle.
 **/
lm's avatar
lm committed
63 64
class UASInterface : public QObject
{
pixhawk's avatar
pixhawk committed
65 66 67 68 69 70 71
    Q_OBJECT
public:
    virtual ~UASInterface() {}

    /* MANAGEMENT */

    /** @brief The name of the robot **/
72 73
    virtual QString getUASName() const = 0;
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
74
    /** @brief The time interval the robot is switched on **/
75
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
76

lm's avatar
lm committed
77 78 79
    virtual double getLocalX() const = 0;
    virtual double getLocalY() const = 0;
    virtual double getLocalZ() const = 0;
80
    virtual bool localPositionKnown() const = 0;
lm's avatar
lm committed
81

82 83
    virtual double getLatitude() const = 0;
    virtual double getLongitude() const = 0;
84 85
    virtual double getAltitudeAMSL() const = 0;
    virtual double getAltitudeRelative() const = 0;
86
    virtual bool globalPositionKnown() const = 0;
87

lm's avatar
lm committed
88 89 90 91
    virtual double getRoll() const = 0;
    virtual double getPitch() const = 0;
    virtual double getYaw() const = 0;

92 93 94
    /** @brief Set the airframe of this MAV */
    virtual int getAirframe() const = 0;

95
    /** @brief Get reference to the waypoint manager **/
96
    virtual UASWaypointManager* getWaypointManager(void) = 0;
97

98
    virtual FileManager* getFileManager() = 0;
99

100 101
    enum Airframe {
        QGC_AIRFRAME_GENERIC = 0,
102 103 104 105 106 107 108 109
        QGC_AIRFRAME_EASYSTAR,
        QGC_AIRFRAME_TWINSTAR,
        QGC_AIRFRAME_MERLIN,
        QGC_AIRFRAME_CHEETAH,
        QGC_AIRFRAME_MIKROKOPTER,
        QGC_AIRFRAME_REAPER,
        QGC_AIRFRAME_PREDATOR,
        QGC_AIRFRAME_COAXIAL,
lm's avatar
lm committed
110 111
        QGC_AIRFRAME_PTERYX,
        QGC_AIRFRAME_TRICOPTER,
112
        QGC_AIRFRAME_HEXCOPTER,
Lorenz Meier's avatar
Lorenz Meier committed
113 114 115
        QGC_AIRFRAME_X8,
        QGC_AIRFRAME_VIPER_2_0,
        QGC_AIRFRAME_CAMFLYER_Q,
116
        QGC_AIRFRAME_END_OF_ENUM
117
    };
pixhawk's avatar
pixhawk committed
118 119 120 121 122 123 124 125 126

    /**
     * @brief Get the color for this UAS
     *
     * This static function holds a color map that allows to draw a new color for each robot
     *
     * @return The next color in the color map. The map holds 20 colors and starts from the beginning
     *         if the colors are exceeded.
     */
127
    static QColor getNextColor() {
pixhawk's avatar
pixhawk committed
128
        /* Create color map */
129 130 131 132
        static QList<QColor> colors = QList<QColor>()
		<< QColor(231,72,28)
		<< QColor(104,64,240)
		<< QColor(203,254,121)
133
		<< QColor(161,252,116)
134 135 136
               	<< QColor(232,33,47)
		<< QColor(116,251,110)
		<< QColor(234,38,107)
137
		<< QColor(104,250,138)
138 139 140
                << QColor(235,43,165)
		<< QColor(98,248,176)
		<< QColor(236,48,221)
141
		<< QColor(92,247,217)
142 143 144
                << QColor(200,54,238)
		<< QColor(87,231,246)
		<< QColor(151,59,239)
145
		<< QColor(81,183,244)
146 147
                << QColor(75,133,243)
		<< QColor(242,255,128)
148
		<< QColor(230,126,23);
149

pixhawk's avatar
pixhawk committed
150
        static int nextColor = -1;
151 152
        if(nextColor == 18){//if at the end of the list
            nextColor = -1;//go back to the beginning
pixhawk's avatar
pixhawk committed
153
        }
154
        nextColor++;
155 156
        return colors[nextColor];//return the next color
   }
pixhawk's avatar
pixhawk committed
157

158 159
    /** @brief Get the type of the system (airplane, quadrotor, helicopter,..)*/
    virtual int getSystemType() = 0;
dogmaphobic's avatar
dogmaphobic committed
160 161
    /** @brief Is it an airplane (or like one)?,..)*/
    virtual bool isAirplane() = 0;
162

LM's avatar
LM committed
163 164
    /** @brief Get the type of the autopilot (PIXHAWK, APM, UDB, PPZ,..) */
    virtual int getAutopilotType() = 0;
LM's avatar
LM committed
165
    virtual void setAutopilotType(int apType) = 0;
166

LM's avatar
LM committed
167 168 169 170
    virtual QMap<int, QString> getComponents() = 0;

    QColor getColor()
    {
pixhawk's avatar
pixhawk committed
171 172 173
        return color;
    }

174 175
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_FIXED_WING = 25;
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_ROTARY_WING = 5;
176 177 178 179 180 181
    
    enum StartCalibrationType {
        StartCalibrationRadio,
        StartCalibrationGyro,
        StartCalibrationMag,
        StartCalibrationAirspeed,
182
        StartCalibrationAccel,
183
        StartCalibrationLevel,
Don Gagne's avatar
Don Gagne committed
184
        StartCalibrationEsc,
185 186 187 188 189
        StartCalibrationCopyTrims,
        StartCalibrationUavcanEsc
    };

    enum StartBusConfigType {
190 191
        StartBusConfigActuators,
        EndBusConfigActuators,
192 193 194 195 196 197 198
    };
    
    /// Starts the specified calibration
    virtual void startCalibration(StartCalibrationType calType) = 0;
    
    /// Ends any current calibration
    virtual void stopCalibration(void) = 0;
199

200 201 202 203 204 205
    /// Starts the specified bus configuration
    virtual void startBusConfig(StartBusConfigType calType) = 0;

    /// Ends any current bus configuration
    virtual void stopBusConfig(void) = 0;

pixhawk's avatar
pixhawk committed
206 207
public slots:

208
    /** @brief Executes a command **/
209
    virtual void executeCommand(MAV_CMD command, int confirmation, float param1, float param2, float param3, float param4, float param5, float param6, float param7, int component) = 0;
210

211 212 213
    /** @brief Selects the airframe */
    virtual void setAirframe(int airframe) = 0;

214 215
    /** @brief Order the robot to pair its receiver **/
    virtual void pairRX(int rxType, int rxSubType) = 0;
Don Gagne's avatar
Don Gagne committed
216
    
217
    virtual void setHomePosition(double lat, double lon, double alt) = 0;
pixhawk's avatar
pixhawk committed
218

219 220 221 222 223
    /** @brief Return if this a rotary wing */
    virtual bool isRotaryWing() = 0;
    /** @brief Return if this is a fixed wing */
    virtual bool isFixedWing() = 0;

Lorenz Meier's avatar
Lorenz Meier committed
224
    /** @brief Send the full HIL state to the MAV */
dogmaphobic's avatar
dogmaphobic committed
225
#ifndef __mobile__
Lorenz Meier's avatar
Lorenz Meier committed
226 227
    virtual void sendHilState(quint64 time_us, float roll, float pitch, float yaw, float rollspeed,
                        float pitchspeed, float yawspeed, double lat, double lon, double alt,
228
                        float vx, float vy, float vz, float ind_airspeed, float true_airspeed, float xacc, float yacc, float zacc) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
229 230 231

    /** @brief RAW sensors for sensor HIL */
    virtual void sendHilSensors(quint64 time_us, float xacc, float yacc, float zacc, float rollspeed, float pitchspeed, float yawspeed,
232
                                float xmag, float ymag, float zmag, float abs_pressure, float diff_pressure, float pressure_alt, float temperature, quint32 fields_changed) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
233 234

    /** @brief Send raw GPS for sensor HIL */
235
    virtual 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) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
236

237 238 239
    /** @brief Send Optical Flow sensor message for HIL, (arguments and units accoding to mavlink documentation*/
    virtual 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) = 0;
dogmaphobic's avatar
dogmaphobic committed
240
#endif
241

242
    /** @brief Send command to map a RC channel to a parameter */
243
    virtual void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax) = 0;
244 245 246 247

    /** @brief Send command to disable all bindings/maps between RC and parameters */
    virtual void unsetRCToParameterMap() = 0;

pixhawk's avatar
pixhawk committed
248 249 250 251
protected:
    QColor color;

signals:
LM's avatar
LM committed
252
    /** @brief The robot state has changed */
pixhawk's avatar
pixhawk committed
253 254 255 256 257 258 259 260
    void statusChanged(int stateFlag);
    /** @brief The robot state has changed
     *
     * @param uas this robot
     * @param status short description of status, e.g. "connected"
     * @param description longer textual description. Should be however limited to a short text, e.g. 200 chars.
     */
    void statusChanged(UASInterface* uas, QString status, QString description);
261

262
    /** @brief A text message from the system has been received */
263
    void textMessageReceived(int uasid, int componentid, int severity, QString text);
264

265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
    /**
     * @brief Update the error count of a device
     *
     * The error count indicates how many errors occured during the use of a device.
     * Usually a random error from time to time is acceptable, e.g. through electromagnetic
     * interferences on device lines like I2C and SPI. A constantly and rapidly increasing
     * error count however can help to identify broken cables or misbehaving drivers.
     *
     * @param uasid System ID
     * @param component Name of the component, e.g. "IMU"
     * @param device Name of the device, e.g. "SPI0" or "I2C1"
     * @param count Errors occured since system startup
     */
    void errCountChanged(int uasid, QString component, QString device, int count);

lm's avatar
lm committed
280 281 282 283
    /**
     * @brief Drop rate of communication link updated
     *
     * @param systemId id of the air system
284
     * @param receiveDrop drop rate of packets this MAV receives (sent from GCS or other MAVs)
lm's avatar
lm committed
285
     */
286
    void dropRateChanged(int systemId,  float receiveDrop);
pixhawk's avatar
pixhawk committed
287 288 289 290
    /** @brief The robot is connected **/
    void connected();
    /** @brief The robot is disconnected **/
    void disconnected();
291

pixhawk's avatar
pixhawk committed
292 293 294
    /** @brief A value of the robot has changed.
      *
      * Typically this is used to send lowlevel information like the battery voltage to the plotting facilities of
295 296
      * the groundstation. The data here should be converted to human-readable values before being passed, so ideally
	  * SI units.
pixhawk's avatar
pixhawk committed
297 298 299
      *
      * @param uasId ID of this system
      * @param name name of the value, e.g. "battery voltage"
300
	  * @param unit The units this variable is in as an abbreviation. For system-dependent (such as raw ADC values) use "raw", for bitfields use "bits", for true/false or on/off use "bool", for unitless values use "-".
pixhawk's avatar
pixhawk committed
301 302 303
      * @param value the value that changed
      * @param msec the timestamp of the message, in milliseconds
      */
304
    void valueChanged(const int uasid, const QString& name, const QString& unit, const QVariant &value,const quint64 msecs);
lm's avatar
lm committed
305

306
    void parameterUpdate(int uas, int component, QString parameterName, int parameterCount, int parameterId, int type, QVariant value);
Don Gagne's avatar
Don Gagne committed
307

pixhawk's avatar
pixhawk committed
308 309 310 311 312 313 314 315
    /**
     * @brief The battery status has been updated
     *
     * @param uas sending system
     * @param voltage battery voltage
     * @param percent remaining capacity in percent
     * @param seconds estimated remaining flight time in seconds
     */
dongfang's avatar
dongfang committed
316
    void batteryChanged(UASInterface* uas, double voltage, double current, double percent, int seconds);
317
    void batteryConsumedChanged(UASInterface* uas, double current_consumed);
pixhawk's avatar
pixhawk committed
318 319 320 321
    void statusChanged(UASInterface* uas, QString status);
    void thrustChanged(UASInterface*, double thrust);
    void heartbeat(UASInterface* uas);
    void attitudeChanged(UASInterface*, double roll, double pitch, double yaw, quint64 usec);
322
    void attitudeChanged(UASInterface*, int component, double roll, double pitch, double yaw, quint64 usec);
323
    void attitudeRotationRatesChanged(int uas, double rollrate, double pitchrate, double yawrate, quint64 usec);
324
    void attitudeThrustSetPointChanged(UASInterface*, float rollDesired, float pitchDesired, float yawDesired, float thrustDesired, quint64 usec);
325
    /** @brief The MAV set a new setpoint in the local (not body) NED X, Y, Z frame */
lm's avatar
lm committed
326
    void positionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec);
327 328
    /** @brief A user (or an autonomous mission or obstacle avoidance planner) requested to set a new setpoint */
    void userPositionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired);
pixhawk's avatar
pixhawk committed
329
    void localPositionChanged(UASInterface*, double x, double y, double z, quint64 usec);
330
    void localPositionChanged(UASInterface*, int component, double x, double y, double z, quint64 usec);
331 332
    void globalPositionChanged(UASInterface*, double lat, double lon, double altAMSL, double altWGS84, quint64 usec);
    void altitudeChanged(UASInterface*, double altitudeAMSL, double altitudeWGS84, double altitudeRelative, double climbRate, quint64 usec);
lm's avatar
lm committed
333 334
    /** @brief Update the status of one satellite used for localization */
    void gpsSatelliteStatusChanged(int uasid, int satid, float azimuth, float direction, float snr, bool used);
335 336

    // The horizontal speed (a scalar)
337
    void speedChanged(UASInterface* uas, double groundSpeed, double airSpeed, quint64 usec);
338
    // Consider adding a MAV_FRAME parameter to this; could help specifying what the 3 scalars are.
339
    void velocityChanged_NED(UASInterface*, double vx, double vy, double vz, quint64 usec);
340 341

    void navigationControllerErrorsChanged(UASInterface*, double altitudeError, double speedError, double xtrackError);
342
    void NavigationControllerDataChanged(UASInterface *uas, float navRoll, float navPitch, float navBearing, float targetBearing, float targetDist);
343

pixhawk's avatar
pixhawk committed
344 345 346 347
    void imageStarted(int imgid, int width, int height, int depth, int channels);
    void imageDataReceived(int imgid, const unsigned char* imageData, int length, int startIndex);
    /** @brief Emit the new system type */
    void systemTypeSet(UASInterface* uas, unsigned int type);
348

pixhawk's avatar
pixhawk committed
349 350 351 352 353 354 355 356
    /** @brief Attitude control enabled/disabled */
    void attitudeControlEnabled(bool enabled);
    /** @brief Position 2D control enabled/disabled */
    void positionXYControlEnabled(bool enabled);
    /** @brief Altitude control enabled/disabled */
    void positionZControlEnabled(bool enabled);
    /** @brief Heading control enabled/disabled */
    void positionYawControlEnabled(bool enabled);
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
    /** @brief Optical flow status changed */
    void opticalFlowStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Vision based localization status changed */
    void visionLocalizationStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Infrared / Ultrasound status changed */
    void distanceSensorStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Gyroscope status changed */
    void gyroStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Accelerometer status changed */
    void accelStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Magnetometer status changed */
    void magSensorStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Barometer status changed */
    void baroStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Differential pressure / airspeed status changed */
    void airspeedStatusChanged(bool supported, bool enabled, bool ok);

374 375 376 377
    /** @brief Value of a remote control channel (raw) */
    void remoteControlChannelRawChanged(int channelId, float raw);
    /** @brief Value of a remote control channel (scaled)*/
    void remoteControlChannelScaledChanged(int channelId, float normalized);
378 379
    /** @brief Remote control RSSI changed  (0% - 100%)*/
    void remoteControlRSSIChanged(uint8_t rssi);
pixhawk's avatar
pixhawk committed
380 381 382 383 384 385

    /**
     * @brief Localization quality changed
     * @param fix 0: lost, 1: 2D local position hold, 2: 2D localization, 3: 3D localization
     */
    void localizationChanged(UASInterface* uas, int fix);
386

387
    // ERROR AND STATUS SIGNALS
388 389
    /** @brief Heartbeat timed out or was regained */
    void heartbeatTimeout(bool timeout, unsigned int ms);
390 391
    /** @brief Name of system changed */
    void nameChanged(QString newName);
392 393
    /** @brief Core specifications have changed */
    void systemSpecsChanged(int uasId);
394

395 396 397
    // HOME POSITION / ORIGIN CHANGES
    void homePositionChanged(int uas, double lat, double lon, double alt);

398
protected:
399

400
    // TIMEOUT CONSTANTS
401
    static const unsigned int timeoutIntervalHeartbeat = 3500 * 1000; ///< Heartbeat timeout is 3.5 seconds
402

pixhawk's avatar
pixhawk committed
403 404
};

lm's avatar
lm committed
405
Q_DECLARE_INTERFACE(UASInterface, "org.qgroundcontrol/1.0")
406

pixhawk's avatar
pixhawk committed
407
#endif // _UASINTERFACE_H_