Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
gaia.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2
3# World environment (time, wind, ...) for multi-AC simulation
4#
5# Copyright (C) 2024 Mael FEURGARD <mael.feurgard@enac.fr>
6#
7# This file is part of paparazzi.
8#
9# paparazzi is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# paparazzi is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with paparazzi. If not, see <https://www.gnu.org/licenses/>.
21
22import os
23import sys
24import math
25
26PPRZ_HOME = os.getenv("PAPARAZZI_HOME", os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../')))
27sys.path.append(PPRZ_HOME + "/var/lib/python")
28
29from pprzlink.ivy import IvyMessagesInterface
30from pprzlink.message import PprzMessage
31
32
33from PyQt5 import QtCore, QtGui, QtWidgets
34from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,\
35 QLabel
36
37from gaia_python.betterHSlider import BetterHSlider
38from gaia_python.AngleSelector import AngleSelector
39
40class Ui_Dialog(object):
41 def setupUi(self, Dialog):
43 Dialog.resize(663, 331)
44
46 self.horizontalLayout_3.setObjectName("horizontalLayout_3")
47
49 self.main_horizontalLayout.setObjectName("main_horizontalLayout")
50
54 self.sliders_frame.setObjectName("sliders_frame")
55
57 self.verticalLayout_4.setObjectName("verticalLayout_4")
58
60 self.sliders_verticalLayout.setObjectName("sliders_verticalLayout")
61
62 self.time_slider = BetterHSlider(self.sliders_frame)
63 self.time_slider.setObjectName("time_slider")
64 self.time_slider.setText("Time scale")
65 self.time_slider.setDecimals(1)
66 self.time_slider.setRange(0.1,10)
67 self.time_slider.setValue(1)
69
73 self.hline_fst.setObjectName("hline_fst")
75
76 self.speed_slider = BetterHSlider(self.sliders_frame)
77 self.speed_slider.setObjectName("speed_slider")
78 self.speed_slider.setText("Wind speed (m/s)")
79 self.speed_slider.setDecimals(1)
80 self.speed_slider.setRange(0,30)
81 self.speed_slider.setValue(0)
83
87 self.hline_snd.setObjectName("hline_snd")
89
90 self.up_slider = BetterHSlider(self.sliders_frame)
91 self.up_slider.setObjectName("up_slider")
92 self.up_slider.setText("Updraft (m/s)")
93 self.up_slider.setDecimals(1)
94 self.up_slider.setRange(-10,10)
95 self.up_slider.setValue(0)
97
101 self.hline_trd.setObjectName("hline_trd")
103
105 self.gps_checkBox.setObjectName("gps_checkBox")
106 self.gps_checkBox.setText("GPS disabled")
107 self.gps_checkBox.setChecked(False)
110
115 self.dial_frame.setObjectName("dial_frame")
116
118 self.horizontalLayout_2.setObjectName("horizontalLayout_2")
119
125 self.wind_dial.setSizePolicy(sizePolicy)
127 self.wind_dial.setObjectName("wind_dial")
128 self.wind_dial.setText("Wind direction (°)")
132
133 self.retranslateUi(Dialog)
135
136
137
138 def retranslateUi(self, Dialog):
140 Dialog.setWindowTitle(_translate("Gaia", "Gaia"))
141 self.gps_checkBox.setText(_translate("Dialog", "GPS disabled"))
142
143
144
145class Gaia(QWidget,Ui_Dialog):
146 def __init__(self, parent: QWidget | None = ..., flags: QtCore.Qt.WindowFlags | QtCore.Qt.WindowType = QtCore.Qt.WindowType.Widget) -> None:
147 super().__init__(parent, flags)
148 self.setupUi(self)
149
150
151class GaiaWindow(QMainWindow):
152 def __init__(self, parent: QWidget | None = None, flags: QtCore.Qt.WindowFlags | QtCore.Qt.WindowType = QtCore.Qt.WindowType.Window) -> None:
153 super().__init__(parent, flags)
154
155 self.gaiaWidget = Gaia(self)
156
157 self.setObjectName("Gaia dialog")
158 self.setWindowTitle("Gaia dialog")
159 self.setCentralWidget(self.gaiaWidget)
160
161 self.ivy = IvyMessagesInterface("gaia")
162 self.timer = QtCore.QTimer(self)
163
165
167
172
173 self.timer.start(5000)
174
175 def setUpdateInterval(self,msec:int):
176 self.timer.setInterval(msec)
177
178 def updateInterval(self) -> int:
179 return self.timer.interval()
180
181
182 def __send_status(self):
183 rad_wind_dir = self.gaiaWidget.wind_dial.value()*math.pi/180
184 wind_speed = self.gaiaWidget.speed_slider.value()
185 wind_up = self.gaiaWidget.up_slider.value()
186 timescale = self.gaiaWidget.time_slider.value()
187
188 msg = PprzMessage("ground","WORLD_ENV")
189 msg["wind_east"] = - wind_speed * math.sin(rad_wind_dir)
190 msg["wind_north"] = - wind_speed * math.cos(rad_wind_dir)
191 msg["wind_up"] = wind_up
192 msg["ir_contrast"] = 266
193 msg["time_scale"] = timescale
194 msg["gps_availability"] = 0 if self.gaiaWidget.gps_checkBox.isChecked() else 1
195
196 self.ivy.send(msg,self.ivy.agent_name)
197
198
199 def closeEvent(self, e: QtGui.QCloseEvent) -> None:
200 self.ivy.shutdown()
201 e.accept()
202
203if __name__ == "__main__":
204 app = QApplication([])
207 app.exec()
208
__send_status(self)
Definition gaia.py:182
setUpdateInterval(self, int msec)
Definition gaia.py:175
int updateInterval(self)
Definition gaia.py:178
None __init__(self, QWidget|None parent=None, QtCore.Qt.WindowFlags|QtCore.Qt.WindowType flags=QtCore.Qt.WindowType.Window)
Definition gaia.py:152
None closeEvent(self, QtGui.QCloseEvent e)
Definition gaia.py:199
None __init__(self, QWidget|None parent=..., QtCore.Qt.WindowFlags|QtCore.Qt.WindowType flags=QtCore.Qt.WindowType.Widget)
Definition gaia.py:146
setupUi(self, Dialog)
Definition gaia.py:41
sliders_verticalLayout
Definition gaia.py:59
main_horizontalLayout
Definition gaia.py:48
retranslateUi(self, Dialog)
Definition gaia.py:138
horizontalLayout_3
Definition gaia.py:45
uint16_t foo
Definition main_demo5.c:58