Für die Aufgabe ist eine Scriptsprache von Vorteil. Es soll möglichst wenig Boilerplate-Code verwendet werden. Zur Auswahl stehen Python, JavaScript und Groovy.
Wir haben uns initial für JavaScript entschieden, da es hierfür mit P5Js auch eine gute und leichtgewichtige Grafische Bibliothek gibt.
Für die Aufgabe ist keine grafische Oberfläche nötig, dennoch werden wir zum Testen und Visualisieren (vorführen) die P5JS Bibliothek nutzen.
Bildquelle: https://p5js.org/
Breitengrade bewegen sich immer in einem Bereich von -90° bis +90°. Die Längengrade laufen von −180° und +180° Nördliche Breiten werden positiv und südliche Breiten negativ angegeben. Östliche Längen sind positiv und westliche Längen sind negativ.
Bildquelle: https://journeynorth.org/tm/LongitudeIntro.html
Um die Breiten und Längen nicht zu verwechseln, muss die Positionsangabe immer im gleichen
Format geschrieben sein. Leider gibt es hier mehrere Standards. Wir verwenden in diesem Projekt das Format, welches auch
in den GeoJson und KML Dateien verwendet wird. Hierbei wird zuerst die Länge und dann die Breite angegeben.
Also <lon="000.000000" lat="00.000000">
Hierbei steht lon
für
Longitude (Länge) und lat
für Latitude (Breite) . Die Reihenfolge der beiden Werte ist dabei entschedent, da bei einer
Angabe von <80 80> sonst nicht
erkennbar ist, was davon Längen- und Breitengrade sind.
Für unseren Anwendungsfall brauchen wir zusätzlich auch die Höhe (Elevation). Diese wird meist als ein extra Parameter
an die Position angehängt. Dabei ist es wichtig, das dieser nicht Teil der Positionsangabe selber ist, sondern z.B.
als <ele>319.5</ele>
angehangen wird.
Deutschland liegt (Rund) zwischen: <long="006" lat="55">
und <long="015" lat="47">
Bildquelle: https://www.mapsofworld.com/lat_long/germany-lat-long.html
Bei der Berechnung der Route muss auch die Höhe(Elevation) ausgegeben werden. Diese wird über eine Höhendaten-API bereitgestellt.
Name | Kosten | self Host möglich | Open Source | Genauigkeit | Bemerkung |
---|---|---|---|---|---|
Elevation API | ja (Google) | nein | nein | 30m oder besser | Ist von Google |
Open Elevation | keine | ja | ja | 30m beim Anbieter und 240m bei Selfhost | |
Open Topodata | keine | ja | ja | 30m oder besser | |
Valhalla | keine | ja | ja | Sehr komplex, aber auch sehr Umfangreich |
Laut einem Beitrag im Stackexchange ist Open Topodata genauer als Open Elevation und Elevation API.
Wir werden OpenTopodata nutzen
Name | Höhe | Bezogen auf | Link |
---|---|---|---|
Burj Khalifa | 828 m | Welt | https://de.wikipedia.org/wiki/Liste_der_h%C3%B6chsten_Hochh%C3%A4user_der_Welt |
Berliner Fernsehturm | 368 m | Deutschland | https://de.wikipedia.org/wiki/Liste_der_h%C3%B6chsten_Bauwerke_in_Deutschland |
Radisson Hotel ist das höchste Hotel in Erfurt. Rund 60 - 70 m. Flughöhe kann zwischen 90 - 120 m sein.
Höhe über GND | Objekte in der Luft |
---|---|
0 m bis 100 m | Vögel, Fledermäuse, Insekten, Drachen; gefesselte Ballons (auch zeppelinförmige) für Werbung, Beleuchtung, Kameras |
150 m bis 1500 m | Luftsportgeräte, Hängegleiter, Gleitschirme, Heißluftballone, Hubschrauber, Luftschiffe |
1500 m bis 3000 m | Kleinflugzeuge im Reiseflug, Segelflugzeuge im Streckenflug, Verkehrsflugzeuge in Warteschleifen zum Landeanflug |
3000 m bis 5000 m | Absprung von Fallschirmspringern (üblicherweise 4000 m), Geschäftsflugverkehr, manche Zugvögel |
5000 m bis 10000 m | Geschäftsflugverkehr, Düsenflugzeuge und Turbopropflugzeuge im Reiseflug (FL 150 bis FL 290) |
10000 m bis 15000 m | Düsenverkehrsflugzeuge im Reiseflug (FL 300 bis FL 450) |
15000 m bis > 18000 m | Überschallpassagierflugzeuge wie die Concorde und die Tupolew Tu-144. Sehr leichte, unbemannte von Solarzellen angetriebene Pseudo-Satelliten (Airbus Zephyr). |
Quelle: https://de.wikipedia.org/wiki/Flugh%C3%B6he
Die APIs, welche Höhendaten liefern, geben diese nur für den Bodenwert aus. Gebäude werden dabei nicht berücksichtigt. Wir benötigen hier also eine andere Lösung:
- Man könnte sich im Bereich von 1000 - 1500 m aufhalten. Dann wäre man erst im 2. Flugsektor aber schon über dem höchsten Gebäude. Problem dabei ist es, dass Drohnen nur bis 120 m hoch fliegen dürfen.
- Die aktuelle Lösung ist, dass wir ca 100 m über dem Bodenwert fliegen und eine Kollissionserkennung haben, welche dann Stoppt und entweder eigenständig um ein Objekt herumfliegt oder an unser Modul eine Anfrage auf ein Rerouting stellt.
Um die Route an gewissen zonen, über die man nicht fliegen sollte darüber zu leiten, brauchen wir eine Datei, in der wir diese Sperrzonen speichern.
Für die speicherung von Geometriedaten ist das GeoJSON-Format am besten geeignet.
Weitere Infos dazu befinden sich in der Readme im GeoJSON-Handler-Ordner
Wir berücksichtigen zur Zeit den Übergang von lon 180 auf -180 nicht.
Bei der Ausgabe gibt es mehrere Formate, welche infrage kommen können: csv, gpx, geojson und kml. Dabei sind gpx und kml die am meist verwendeten Formate und auch die universellsten. Gmx wird von fast jedem Gerät bzw jeder Software erkannt. Kml, was ursprünglich von Google stammt, muss ggf erst in Gpx umgewandelt werden. Diese Umwandlung kann mit GPSBabel erfolgen.
Aus diesem Grund werden wir direkt mit GPX arbeiten.
Quellen:
- https://www.rasppishop.de/4G-LTE-HAT
- Hat direkt ein GPS Modul integriert
- 71,99 €
- https://store-vyymyh.mybigcommerce.com/PiloT4G-1
- openlayers
- Open Flight Map
- Open Flight Map - GitLab
- ArduPilot
- ArduPilot - GitHub
- Flightplan Topic GitHub
- Betaflight
- Höhenprofil - cgiar
- Brouter Fahrrad
- https://gdz.bkg.bund.de/index.php/default/digitale-geodaten/sonstige-geodaten/luftraeume-der-dfs-luftraumdfs.html
- https://docs.openaip.net/#/Airspaces/get_airspaces
- https://www.openaip.net/users/clients