QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
TakeoffMissionItem.cc
Go to the documentation of this file.
2
3#include "FirmwarePlugin.h"
8#include "PlanViewSettings.h"
10#include "SettingsManager.h"
11#include "Vehicle.h"
12
13TakeoffMissionItem::TakeoffMissionItem(PlanMasterController* masterController, bool flyView, MissionSettingsItem* settingsItem, bool forLoad)
14 : SimpleMissionItem(masterController, flyView, forLoad)
15 , _settingsItem(settingsItem)
16{
17 _init(forLoad);
18}
19
20TakeoffMissionItem::TakeoffMissionItem(MAV_CMD takeoffCmd, PlanMasterController* masterController, bool flyView, MissionSettingsItem* settingsItem, bool forLoad)
21 : SimpleMissionItem(masterController, flyView, false /* forLoad */)
22 , _settingsItem(settingsItem)
23{
24 setCommand(takeoffCmd);
25 _init(forLoad);
26}
27
28TakeoffMissionItem::TakeoffMissionItem(const MissionItem& missionItem, PlanMasterController* masterController, bool flyView, MissionSettingsItem* settingsItem, bool forLoad)
29 : SimpleMissionItem(masterController, flyView, missionItem)
30 , _settingsItem(settingsItem)
31{
32 _init(forLoad);
33}
34
39
40void TakeoffMissionItem::_init(bool forLoad)
41{
42 _editorQml = QStringLiteral("qrc:/qml/QGroundControl/PlanView/SimpleItemEditor.qml");
43
45
46 if (_flyView) {
47 _initLaunchTakeoffAtSameLocation();
48 return;
49 }
50
51 QGeoCoordinate homePosition = _settingsItem->coordinate();
52 if (!homePosition.isValid()) {
54 if (activeVehicle) {
55 homePosition = activeVehicle->homePosition();
56 if (homePosition.isValid()) {
57 _settingsItem->setCoordinate(homePosition);
58 }
59 }
60 }
61
62 if (forLoad) {
63 // Load routines will set the rest up after load
64 return;
65 }
66
67 _initLaunchTakeoffAtSameLocation();
68 if (_launchTakeoffAtSameLocation && homePosition.isValid()) {
70 }
71
72 // Wizard mode is set if:
73 // - Launch position is missing - requires prompt to user to click to set launch
74 // - Fixed wing - warn about climb out position adjustment
75 if (!homePosition.isValid() || _controllerVehicle->fixedWing()) {
76 _wizardMode = true;
77 }
78
79 setDirty(false);
80}
81
82void TakeoffMissionItem::_setLaunchTakeoffAtSameLocation(bool launchTakeoffAtSameLocation)
83{
84 if (launchTakeoffAtSameLocation != _launchTakeoffAtSameLocation) {
85 _launchTakeoffAtSameLocation = launchTakeoffAtSameLocation;
86 if (_launchTakeoffAtSameLocation) {
87 _setLaunchCoordinate(coordinate());
88 }
89 emit launchTakeoffAtSameLocationChanged(_launchTakeoffAtSameLocation);
90 setDirty(true);
91 }
92}
93
94QGeoCoordinate TakeoffMissionItem::launchCoordinate(void) const
95{
96 return _settingsItem->coordinate();
97}
98
99void TakeoffMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
100{
101 if (coordinate != this->coordinate()) {
103 if (_launchTakeoffAtSameLocation) {
104 _settingsItem->setCoordinate(coordinate);
105 }
106 }
107}
108
113
115{
116 return vehicle
117 && command == MAV_CMD_NAV_TAKEOFF
119}
120
122{
124 ? tr("Take off vertically and continue the mission in multicopter mode.")
126}
127
129{
131 ? tr("Multicopter takeoff")
133}
134
135void TakeoffMissionItem::_initLaunchTakeoffAtSameLocation(void)
136{
137 if (specifiesCoordinate()) {
140 _setLaunchTakeoffAtSameLocation(false);
141 } else {
142 // PX4 specifies a coordinate for takeoff even for multi-rotor. But it makes more sense to not have a coordinate
143 // from and end user standpoint. So even for PX4 we try to keep launch and takeoff at the same position. Unless the
144 // user has moved/loaded launch at a different location than takeoff.
145 if (coordinate().isValid() && _settingsItem->coordinate().isValid()) {
146 _setLaunchTakeoffAtSameLocation(coordinate().latitude() == _settingsItem->coordinate().latitude() && coordinate().longitude() == _settingsItem->coordinate().longitude());
147 } else {
148 _setLaunchTakeoffAtSameLocation(true);
149 }
150
151 }
152 } else {
153 _setLaunchTakeoffAtSameLocation(true);
154 }
155}
156
157bool TakeoffMissionItem::load(QTextStream &loadStream)
158{
159 bool success = SimpleMissionItem::load(loadStream);
160 if (success) {
161 _initLaunchTakeoffAtSameLocation();
162 }
163 _wizardMode = false; // Always be off for loaded items
164 return success;
165}
166
167bool TakeoffMissionItem::load(const QJsonObject& json, int sequenceNumber, QString& errorString)
168{
170 if (success) {
171 _initLaunchTakeoffAtSameLocation();
172 }
173 _wizardMode = false; // Always be off for loaded items
174 return success;
175}
176
177void TakeoffMissionItem::_setLaunchCoordinate(const QGeoCoordinate& launchCoordinate)
178{
179 if (!launchCoordinate.isValid()) {
180 return;
181 }
182
183 _settingsItem->setCoordinate(launchCoordinate);
184
185 if (!coordinate().isValid()) {
186 QGeoCoordinate takeoffCoordinate;
187 if (_launchTakeoffAtSameLocation) {
188 takeoffCoordinate = launchCoordinate;
189 } else {
190 double distance = SettingsManager::instance()->planViewSettings()->vtolTransitionDistance()->rawValue().toDouble(); // Default distance is VTOL transition to takeoff point distance
192 double altitude = this->altitude()->rawValue().toDouble();
193
195 // Offset for fixed wing climb out of 30 degrees to specified altitude
196 if (altitude != 0.0) {
197 distance = altitude / tan(qDegreesToRadians(30.0));
198 }
199 } else {
200 distance = altitude * 1.5;
201 }
202 }
203 takeoffCoordinate = launchCoordinate.atDistanceAndAzimuth(distance, 0);
204 }
205 SimpleMissionItem::setCoordinate(takeoffCoordinate);
206 }
207}
QString errorString
int32_t latitude
Definition UBXPlan.cc:40
int32_t longitude
Definition UBXPlan.cc:42
QVariant rawValue() const
Definition Fact.h:87
@ VTOLMulticopterTakeoffCapability
VTOL supports MAV_CMD_NAV_TAKEOFF while remaining in multicopter mode.
virtual bool isCapable(const Vehicle *, FirmwareCapabilities) const
bool isTakeoffCommand(MAV_CMD command) const
static MissionCommandTree * instance()
QGeoCoordinate coordinate(void) const final
void setCoordinate(const QGeoCoordinate &coordinate) final
static MultiVehicleManager * instance()
Vehicle * activeVehicle() const
Master controller for mission, fence, rally.
PlanViewSettings * planViewSettings() const
static SettingsManager * instance()
A SimpleMissionItem is used to represent a single MissionItem to the ui.
QString commandDescription(void) const override
bool specifiesCoordinate(void) const final
int sequenceNumber(void) const final
QString commandName(void) const override
MAV_CMD mavCommand(void) const
QGeoCoordinate coordinate(void) const final
virtual bool load(QTextStream &loadStream)
void setCoordinate(const QGeoCoordinate &coordinate) override
void setCommand(int command)
int command(void) const
QGroundControlQmlGlobal::AltitudeFrame altitudeFrame(void) const
void setDirty(bool dirty) final
static bool isTakeoffCommand(MAV_CMD command)
QString commandDescription(void) const final
static bool isVTOLMulticopterTakeoff(Vehicle *vehicle, MAV_CMD command)
QGeoCoordinate launchCoordinate(void) const
void launchCoordinateChanged(const QGeoCoordinate &launchCoordinate)
bool launchTakeoffAtSameLocation(void) const
void setCoordinate(const QGeoCoordinate &coordinate) override
bool load(QTextStream &loadStream) final
TakeoffMissionItem(PlanMasterController *masterController, bool flyView, MissionSettingsItem *settingsItem, bool forLoad)
QString commandName(void) const final
void launchTakeoffAtSameLocationChanged(bool launchTakeoffAtSameLocation)
bool vtol() const
Definition Vehicle.cc:1780
QGeoCoordinate homePosition()
Definition Vehicle.cc:1451
FirmwarePlugin * firmwarePlugin()
Provides access to the Firmware Plugin for this Vehicle.
Definition Vehicle.h:462
bool fixedWing() const
Definition Vehicle.cc:1755
QString _editorQml
Qml resource for editing item.
void coordinateChanged(const QGeoCoordinate &coordinate)
bool homePosition(void) const
< Flight path cumalative horizontal distance from home point to this item
double distance(void) const
bool _wizardMode
true: Item editor is showing wizard completion panel