AirSim APIs#

Einleitung#

AirSim stellt APIs zur Verfügung, damit Sie programmatisch mit dem Fahrzeug in der Simulation interagieren können. Sie können diese APIs verwenden, um Bilder abzurufen, Zustände zu erhalten, das Fahrzeug zu steuern und so weiter.

Python Schnellstart#

Wenn Sie Python verwenden möchten, um AirSim-APIs aufzurufen, empfehlen wir die Verwendung von Anaconda mit Python 3.5 oder neueren Versionen. Einige Code kann jedoch auch mit Python 2.7 funktionieren (helfen Sie uns, die Kompatibilität zu verbessern!).

Installieren Sie zuerst dieses Paket

pip install msgpack-rpc-python

Sie können AirSim-Binärdateien entweder von den Releases herunterladen oder aus dem Quellcode kompilieren (Windows, Linux). Sobald Sie AirSim ausführen können, wählen Sie Auto als Fahrzeug und navigieren Sie dann zum Ordner PythonClient\car\ und führen Sie aus

python hello_car.py

Wenn Sie Visual Studio 2019 verwenden, öffnen Sie einfach AirSim.sln, setzen Sie PythonClient als Startup-Projekt und wählen Sie car\hello_car.py als Ihr Startup-Skript.

AirSim-Paket installieren#

Sie können das airsim-Paket auch einfach installieren, indem Sie,

pip install airsim

Sie finden den Quellcode und Beispiele für dieses Paket im Ordner PythonClient in Ihrem Repository.

Hinweise 1. Möglicherweise stellen Sie eine Datei setup_path.py in unseren Beispielordnern fest. Diese Datei enthält einfachen Code, um zu erkennen, ob das airsim-Paket im übergeordneten Ordner verfügbar ist. In diesem Fall verwenden wir dieses anstelle des pip-installierten Pakets, sodass Sie immer den neuesten Code verwenden. 2. AirSim befindet sich noch in der aktiven Entwicklung, was bedeutet, dass Sie das Paket möglicherweise häufig aktualisieren müssen, um neue APIs zu verwenden.

C++ Benutzer#

Wenn Sie C++-APIs und -Beispiele verwenden möchten, lesen Sie bitte die Anleitung für C++ APIs.

Hallo Auto#

So verwenden Sie AirSim APIs mit Python, um ein simuliertes Auto zu steuern (siehe auch C++ Beispiel)

# ready to run example: PythonClient/car/hello_car.py
import airsim
import time

# connect to the AirSim simulator
client = airsim.CarClient()
client.confirmConnection()
client.enableApiControl(True)
car_controls = airsim.CarControls()

while True:
    # get state of the car
    car_state = client.getCarState()
    print("Speed %d, Gear %d" % (car_state.speed, car_state.gear))

    # set the controls for car
    car_controls.throttle = 1
    car_controls.steering = 1
    client.setCarControls(car_controls)

    # let car drive a bit
    time.sleep(1)

    # get camera images from the car
    responses = client.simGetImages([
        airsim.ImageRequest(0, airsim.ImageType.DepthVis),
        airsim.ImageRequest(1, airsim.ImageType.DepthPlanar, True)])
    print('Retrieved images: %d', len(responses))

    # do something with images
    for response in responses:
        if response.pixels_as_float:
            print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))
            airsim.write_pfm('py1.pfm', airsim.get_pfm_array(response))
        else:
            print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
            airsim.write_file('py1.png', response.image_data_uint8)

Hallo Drohne#

So verwenden Sie AirSim APIs mit Python, um einen simulierten Quadrotor zu steuern (siehe auch C++ Beispiel)

# ready to run example: PythonClient/multirotor/hello_drone.py
import airsim
import os

# connect to the AirSim simulator
client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)

# Async methods returns Future. Call join() to wait for task to complete.
client.takeoffAsync().join()
client.moveToPositionAsync(-10, 10, -10, 5).join()

# take images
responses = client.simGetImages([
    airsim.ImageRequest("0", airsim.ImageType.DepthVis),
    airsim.ImageRequest("1", airsim.ImageType.DepthPlanar, True)])
print('Retrieved images: %d', len(responses))

# do something with the images
for response in responses:
    if response.pixels_as_float:
        print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))
        airsim.write_pfm(os.path.normpath('/temp/py1.pfm'), airsim.get_pfm_array(response))
    else:
        print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
        airsim.write_file(os.path.normpath('/temp/py1.png'), response.image_data_uint8)

Allgemeine APIs#

  • reset: Dies setzt das Fahrzeug in seinen ursprünglichen Ausgangszustand zurück. Beachten Sie, dass Sie enableApiControl und armDisarm nach dem Aufruf von reset erneut aufrufen müssen.
  • confirmConnection: Prüft den Verbindungsstatus jede Sekunde und meldet ihn in der Konsole, damit der Benutzer den Fortschritt der Verbindung sehen kann.
  • enableApiControl: Aus Sicherheitsgründen ist die API-Steuerung für autonome Fahrzeuge standardmäßig nicht aktiviert und der menschliche Bediener hat die volle Kontrolle (normalerweise über RC oder Joystick im Simulator). Der Client muss diesen Aufruf machen, um die Steuerung per API anzufordern. Es ist wahrscheinlich, dass der menschliche Bediener des Fahrzeugs die API-Steuerung nicht zugelassen hat, was bedeutet, dass enableApiControl keine Auswirkung hat. Dies kann mit isApiControlEnabled überprüft werden.
  • isApiControlEnabled: Gibt true zurück, wenn die API-Steuerung hergestellt ist. Wenn false (Standard) zurückgegeben wird, werden API-Aufrufe ignoriert. Nach einem erfolgreichen Aufruf von enableApiControl sollte isApiControlEnabled true zurückgeben.
  • ping: Wenn die Verbindung hergestellt ist, gibt dieser Aufruf true zurück, andernfalls wird er bis zum Timeout blockiert.
  • simPrintLogMessage: Gibt die angegebene Nachricht im Simulatorfenster aus. Wenn message_param ebenfalls angegeben ist, wird es neben der Nachricht ausgegeben, und in diesem Fall, wenn diese API mit demselben Nachrichtenwert, aber einem anderen message_param erneut aufgerufen wird, wird die vorherige Zeile mit einer neuen Zeile überschrieben (anstatt dass die API eine neue Zeile auf dem Display erstellt). Zum Beispiel: simPrintLogMessage("Iteration: ", to_string(i)) aktualisiert dieselbe Zeile auf dem Display, wenn die API mit unterschiedlichen Werten von i aufgerufen wird. Die gültigen Werte für den Parameter severity sind 0 bis 3, was unterschiedlichen Farben entspricht.
  • simGetObjectPose, simSetObjectPose: Ruft ab und setzt die Pose eines bestimmten Objekts in der Unreal-Umgebung. Hier bedeutet Objekt "Actor" im Sinne von Unreal. Sie werden nach Tag und Name gesucht. Bitte beachten Sie, dass die Namen, die im UE-Editor angezeigt werden, bei jeder Ausführung *automatisch generiert* werden und nicht permanent sind. Wenn Sie einen Actor nach Namen referenzieren möchten, müssen Sie seinen automatisch generierten Namen im UE-Editor ändern. Alternativ können Sie einem Actor ein Tag hinzufügen, indem Sie diesen Actor im Unreal Editor anklicken und dann zu den Tag-Eigenschaften navigieren, auf das "+" -Zeichen klicken und einen beliebigen Stringwert hinzufügen. Wenn mehrere Actors dasselbe Tag haben, wird der erste Treffer zurückgegeben. Wenn keine Treffer gefunden werden, wird NaN Pose zurückgegeben. Die zurückgegebene Pose ist in NED-Koordinaten in SI-Einheiten im Weltrahmen. Für simSetObjectPose muss der angegebene Actor Mobility auf Movable gesetzt haben, andernfalls erhalten Sie undefiniertes Verhalten. simSetObjectPose hat den Parameter teleport, was bedeutet, dass das Objekt durch andere Objekte bewegt wird und gibt true zurück, wenn die Bewegung erfolgreich war.

Bild- / Computer Vision APIs#

AirSim bietet umfassende Bild-APIs zum Abrufen synchronisierter Bilder von mehreren Kameras sowie Ground-Truth-Informationen wie Tiefe, Disparität, Oberflächennormalen und Vision. Sie können die Parameter für Auflösung, Sichtfeld, Bewegungsunschärfe usw. in settings.json festlegen. Es gibt auch eine API zur Erkennung von Kollisionszuständen. Siehe auch vollständigen Code, der eine angegebene Anzahl von Stereobildern und Ground-Truth-Tiefe mit Normalisierung zur Kameraebene generiert, die Disparitätsbildberechnung durchführt und es im pfm-Format speichert.

Mehr zu Bild-APIs und Computer Vision-Modus. Für visionäre Probleme, die von Domain-Randomisierung profitieren können, gibt es auch eine Objektretexturierungs-API, die in unterstützten Szenen verwendet werden kann.

Pause und Fortsetzungs-APIs#

AirSim ermöglicht das Pausieren und Fortsetzen der Simulation über die API pause(is_paused). Um die Simulation zu pausieren, rufen Sie pause(True) auf, und um die Simulation fortzusetzen, rufen Sie pause(False) auf. Möglicherweise haben Sie ein Szenario, insbesondere bei der Verwendung von Reinforcement Learning, um die Simulation für eine bestimmte Zeit laufen zu lassen und sie dann automatisch zu pausieren. Während die Simulation pausiert ist, können Sie aufwendige Berechnungen durchführen, einen neuen Befehl senden und dann die Simulation wieder für eine bestimmte Zeit laufen lassen. Dies kann durch die API continueForTime(seconds) erreicht werden. Diese API lässt die Simulation für die angegebene Anzahl von Sekunden laufen und pausiert dann die Simulation. Beispiele für die Verwendung finden Sie unter pause_continue_car.py und pause_continue_drone.py.

Kollisions-API#

Die Kollisionsinformationen können über die API simGetCollisionInfo abgerufen werden. Dieser Aufruf gibt eine Struktur zurück, die nicht nur darüber informiert, ob eine Kollision aufgetreten ist, sondern auch Informationen über die Kollisionsposition, die Oberflächennormale, die Eindringtiefe und so weiter enthält.

Tageszeit-API#

AirSim geht davon aus, dass in Ihrer Umgebung eine Himmelskugel der Klasse EngineSky/BP_Sky_Sphere sowie ein ADirectionalLight Actor vorhanden sind. Standardmäßig bewegt sich die Position der Sonne in der Szene nicht mit der Zeit. Sie können Einstellungen verwenden, um Breitengrad, Längengrad, Datum und Uhrzeit festzulegen, die AirSim verwendet, um die Sonnenposition in der Szene zu berechnen.

Sie können auch den folgenden API-Aufruf verwenden, um die Sonnenposition gemäß dem gegebenen Datum und der gegebenen Uhrzeit einzustellen

simSetTimeOfDay(self, is_enabled, start_datetime = "", is_start_datetime_dst = False, celestial_clock_speed = 1, update_interval_secs = 60, move_sun = True)

Der Parameter is_enabled muss True sein, um den Tageszeit-Effekt zu aktivieren. Wenn er False ist, wird die Sonnenposition auf ihre ursprüngliche Position in der Umgebung zurückgesetzt.

Andere Parameter sind die gleichen wie in den Einstellungen.

Sichtlinien- und Weltumfangs-APIs#

Um die Sichtlinie im Simulator von einem Fahrzeug zu einem Punkt oder zwischen zwei Punkten zu testen, siehe simTestLineOfSightToPoint(point, vehicle_name) und simTestLineOfSightBetweenPoints(point1, point2). Der Umfang der simulierten Welt kann in Form eines Vektors von zwei GeoPoints mit simGetWorldExtents() abgerufen werden.

Wetter-APIs#

Standardmäßig sind alle Wettereffekte deaktiviert. Um den Wettereffekt zu aktivieren, rufen Sie zuerst auf

simEnableWeather(True)

Verschiedene Wettereffekte können mit der Methode simSetWeatherParameter aktiviert werden, die WeatherParameter als Parameter nimmt, zum Beispiel:

client.simSetWeatherParameter(airsim.WeatherParameter.Rain, 0.25);
Der zweite Parameterwert liegt zwischen 0 und 1. Der erste Parameter bietet folgende Optionen:

class WeatherParameter:
    Rain = 0
    Roadwetness = 1
    Snow = 2
    RoadSnow = 3
    MapleLeaf = 4
    RoadLeaf = 5
    Dust = 6
    Fog = 7

Bitte beachten Sie, dass die Effekte Roadwetness, RoadSnow und RoadLeaf das Hinzufügen von Materialien zu Ihrer Szene erfordern.

Weitere Informationen finden Sie im Beispielcode.

Aufzeichnungs-APIs#

Aufzeichnungs-APIs können verwendet werden, um Daten über APIs zu starten. Die aufzuzeichnenden Daten können über die Einstellungen spezifiziert werden. Zum Starten der Aufzeichnung verwenden Sie:

client.startRecording()

Um die Aufzeichnung zu stoppen, verwenden Sie entsprechend client.stopRecording(). Um zu überprüfen, ob die Aufzeichnung läuft, rufen Sie client.isRecording() auf, was ein bool zurückgibt.

Diese API funktioniert zusammen mit dem Umschalten der Aufzeichnung mit der R-Taste. Wenn sie also über die R-Taste aktiviert wird, gibt isRecording() True zurück, und die Aufzeichnung kann per API mit stopRecording() gestoppt werden. Ebenso wird eine per API gestartete Aufzeichnung gestoppt, wenn die R-Taste im Viewport gedrückt wird. LogMessage wird auch in der oberen linken Ecke des Viewports angezeigt, wenn die Aufzeichnung per API gestartet oder gestoppt wird.

Beachten Sie, dass dies nur die Daten speichert, wie in den Einstellungen angegeben. Für vollständige Freiheit bei der Speicherung von Daten wie bestimmten Sensordaten oder in einem anderen Format oder Layout verwenden Sie die anderen APIs, um die Daten abzurufen und nach Wunsch zu speichern. Informationen zum Ändern der aufgezeichneten Kinematikdaten finden Sie unter Ändern von Aufzeichnungsdaten.

Wind-API#

Der Wind kann während der Simulation mit simSetWind() geändert werden. Der Wind wird im Weltrahmen, in NED-Richtung und in m/s angegeben.

Z.B. Um 20 m/s Wind in Nordrichtung (vorwärts) einzustellen:

# Set wind to (20,0,0) in NED (forward direction)
wind = airsim.Vector3r(20, 0, 0)
client.simSetWind(wind)

Siehe auch das Beispielskript in set_wind.py

Lidar-APIs#

AirSim bietet eine API zum Abrufen von Punktwolkendaten von Lidar-Sensoren auf Fahrzeugen. Sie können die Anzahl der Kanäle, Punkte pro Sekunde, horizontale und vertikale Sichtfelder usw. in settings.json festlegen.

Mehr zu Lidar-APIs und Einstellungen und Sensoreinstellungen

Lichtsteuerungs-APIs#

Lichter, die in AirSim manipuliert werden können, können über die API simSpawnObject() erstellt werden, indem entweder PointLightBP oder SpotLightBP als asset_name-Parameter und True als is_blueprint-Parameter übergeben werden. Sobald ein Licht erzeugt wurde, kann es mit der folgenden API manipuliert werden:

  • simSetLightIntensity: Dies ermöglicht Ihnen, die Intensität oder Helligkeit eines Lichts zu ändern. Es nimmt zwei Parameter entgegen: light_name, den Namen des Lichtobjekts, das von einem früheren Aufruf von simSpawnObject() zurückgegeben wurde, und intensity, einen Float-Wert.

Textur-APIs#

Texturen können über diese APIs dynamisch auf Objekte gesetzt werden:

  • simSetObjectMaterial: Dies setzt das Material eines Objekts unter Verwendung eines vorhandenen Unreal-Material-Assets. Es nimmt zwei String-Parameter entgegen: object_name und material_name.
  • simSetObjectMaterialFromTexture: Dies setzt das Material eines Objekts unter Verwendung eines Pfads zu einer Textur. Es nimmt zwei String-Parameter entgegen: object_name und texture_path.

Mehrere Fahrzeuge#

AirSim unterstützt mehrere Fahrzeuge und deren Steuerung über APIs. Bitte lesen Sie die Dokumentation zu mehreren Fahrzeugen.

Koordinatensystem#

Alle AirSim APIs verwenden das NED-Koordinatensystem, d. h. +X ist Norden, +Y ist Osten und +Z ist unten. Alle Einheiten sind im SI-System. Bitte beachten Sie, dass dies vom intern von Unreal Engine verwendeten Koordinatensystem abweicht. In Unreal Engine ist +Z nach oben statt nach unten gerichtet und die Längeneinheit sind Zentimeter statt Meter. AirSim APIs kümmern sich um die entsprechenden Umrechnungen. Der Startpunkt des Fahrzeugs ist immer die Koordinate (0, 0, 0) im NED-System. Beim Umrechnen von Unreal-Koordinaten in NED subtrahieren wir daher zuerst den Start-Offset und skalieren dann um 100 für die Umrechnung von cm in m. Das Fahrzeug wird in der Unreal-Umgebung gestartet, wo die Player Start-Komponente platziert ist. Es gibt eine Einstellung namens OriginGeopoint in settings.json, die dem Player Start-Komponente geografische Längen-, Breiten- und Höhenangaben zuweist.

Fahrzeugspezifische APIs#

APIs für Auto#

Für Autos stehen folgende APIs zur Verfügung:

  • setCarControls: Dies ermöglicht Ihnen, Gas, Lenkung, Handbremse und Automatik- oder manuelle Gangwahl einzustellen.
  • getCarState: Dies ruft die Zustandsinformationen ab, einschließlich Geschwindigkeit, aktuellem Gang und 6 Kinematikgrößen: Position, Orientierung, lineare und Winkelgeschwindigkeit, lineare und Winkelbeschleunigung. Alle Größen sind im NED-Koordinatensystem, SI-Einheiten im Weltrahmen, mit Ausnahme der Winkelgeschwindigkeit und -beschleunigung, die sich im Fahrzeugrahmen befinden.
  • Bild-APIs.

APIs für Multirotor#

Multirotoren können durch Angabe von Winkeln, Geschwindigkeitsvektoren, Zielpositionen oder einer Kombination davon gesteuert werden. Für diesen Zweck gibt es entsprechende move* APIs. Bei der Positionsregelung müssen wir einen Pfadfolgelogorithmus verwenden. Standardmäßig verwendet AirSim den Carrot-Following-Algorithmus. Dies wird oft als "High-Level-Steuerung" bezeichnet, da Sie nur ein High-Level-Ziel angeben müssen und die Firmware den Rest erledigt. Derzeit ist die niedrigste Steuerungsebene, die in AirSim verfügbar ist, die API moveByAngleThrottleAsync.

getMultirotorState#

Diese API gibt den Zustand des Fahrzeugs in einem Aufruf zurück. Der Zustand umfasst Kollision, geschätzte Kinematik (d. h. Kinematik, die durch Fusion von Sensoren berechnet wurde) und Zeitstempel (Nanosekunden seit der Epoche). Die Kinematik bedeutet hier 6 Größen: Position, Orientierung, lineare und Winkelgeschwindigkeit, lineare und Winkelbeschleunigung. Bitte beachten Sie, dass simple_slight derzeit keinen Zustandsestimator unterstützt, was bedeutet, dass geschätzte und Ground-Truth-Kinematikwerte für simple_flight gleich sind. Geschätzte Kinematik ist jedoch für PX4 verfügbar, mit Ausnahme der Winkelbeschleunigung. Alle Größen sind im NED-Koordinatensystem, SI-Einheiten im Weltrahmen, mit Ausnahme der Winkelgeschwindigkeit und -beschleunigung, die sich im Fahrzeugrahmen befinden.

Asynchrone Methoden, Dauer und max_wait_seconds#

Viele API-Methoden haben Parameter namens duration oder max_wait_seconds und sie haben das Suffix Async, zum Beispiel takeoffAsync. Diese Methoden geben sofort nach Beginn der Aufgabe in AirSim zurück, sodass Ihr Client-Code etwas anderes tun kann, während diese Aufgabe ausgeführt wird. Wenn Sie warten möchten, bis diese Aufgabe abgeschlossen ist, können Sie waitOnLastTask wie folgt aufrufen:

//C++
client.takeoffAsync()->waitOnLastTask();
# Python
client.takeoffAsync().join()

Wenn Sie einen anderen Befehl starten, wird der vorherige Befehl automatisch abgebrochen und der neue Befehl gestartet. Dies ermöglicht die Verwendung eines Musters, bei dem Ihr Code kontinuierlich Daten erfasst, eine neue zu verfolgende Flugbahn berechnet und diese Flugbahn dem Fahrzeug in AirSim zuweist. Jede neu zugewiesene Flugbahn bricht die vorherige ab, sodass Ihr Code kontinuierlich Updates durchführen kann, sobald neue Sensordaten eingehen.

Alle Async-Methoden geben in Python concurrent.futures.Future zurück (std::future in C++). Bitte beachten Sie, dass diese Future-Klassen derzeit keine Statusprüfung oder Abbruch der Aufgabe ermöglichen; sie ermöglichen nur das Warten auf den Abschluss der Aufgabe. AirSim stellt jedoch die API cancelLastTask zur Verfügung.

Antriebsstrang#

Es gibt zwei Modi, in denen Sie das Fahrzeug fliegen können: Der Parameter drivetrain ist auf airsim.DrivetrainType.ForwardOnly oder airsim.DrivetrainType.MaxDegreeOfFreedom gesetzt. Wenn Sie ForwardOnly angeben, sagen Sie, dass die Vorderseite des Fahrzeugs immer in Fahrtrichtung zeigen soll. Wenn Sie also möchten, dass die Drohne nach links abbiegt, dreht sie sich zuerst, sodass die Vorderseite nach links zeigt. Dieser Modus ist nützlich, wenn Sie nur eine Frontkamera haben und das Fahrzeug per FPV-Ansicht steuern. Dies ist mehr oder weniger wie die Fahrt in einem Auto, bei dem Sie immer eine Frontansicht haben. MaxDegreeOfFreedom bedeutet, dass es Ihnen egal ist, wohin die Vorderseite zeigt. Wenn Sie also nach links abbiegen, beginnen Sie einfach, wie bei einem Krebsgang, nach links zu fahren. Quadrotoren können sich in jede Richtung bewegen, unabhängig davon, wohin die Vorderseite zeigt. MaxDegreeOfFreedom aktiviert diesen Modus.

Gierwinkelmodus#

yaw_mode ist eine Struktur YawMode mit zwei Feldern: yaw_or_rate und is_rate. Wenn das Feld is_rate True ist, wird das Feld yaw_or_rate als Winkelgeschwindigkeit in Grad/Sekunde interpretiert, was bedeutet, dass Sie möchten, dass sich das Fahrzeug kontinuierlich um seine Achse mit dieser Winkelgeschwindigkeit dreht, während es sich bewegt. Wenn is_rate False ist, wird yaw_or_rate als Winkel in Grad interpretiert, was bedeutet, dass Sie möchten, dass sich das Fahrzeug auf einen bestimmten Winkel (d. h. Gierwinkel) dreht und diesen Winkel während der Bewegung beibehält.

Sie werden wahrscheinlich feststellen, dass, wenn yaw_mode.is_rate == true ist, der Parameter drivetrain nicht auf ForwardOnly gesetzt werden sollte, da Sie widersprechen, indem Sie sagen, dass die Vorderseite nach vorne zeigen soll, aber sich auch kontinuierlich drehen soll. Wenn Sie jedoch yaw_mode.is_rate = false im ForwardOnly-Modus haben, können Sie einige seltsame Dinge tun. Sie können zum Beispiel eine Drohne Kreise fliegen lassen und yaw_or_rate auf 90 setzen, damit die Kamera immer zum Zentrum zeigt ("super coole Selfie-Modus"). Im MaxDegreeofFreedom-Modus können Sie ebenfalls einige seltsame Dinge tun, indem Sie yaw_mode.is_rate = true setzen und yaw_mode.yaw_or_rate = 20 angeben. Dies führt dazu, dass die Drohne auf ihrem Weg rotiert, was 360-Grad-Scans ermöglichen kann.

In den meisten Fällen möchten Sie einfach nicht, dass sich der Gierwinkel ändert, was Sie durch Setzen der Gierrate auf 0 erreichen können. Die Kurzform dafür ist airsim.YawMode.Zero() (oder in C++: YawMode::Zero()).

Lookahead und adaptive_lookahead#

Wenn Sie ein Fahrzeug auffordern, einem Pfad zu folgen, verwendet AirSim den "Carrot-Following"-Algorithmus. Dieser Algorithmus arbeitet, indem er auf dem Pfad vorausschauend schaut und seinen Geschwindigkeitsvektor anpasst. Die Parameter für diesen Algorithmus werden durch lookahead und adaptive_lookahead festgelegt. Meistens möchten Sie, dass der Algorithmus die Werte automatisch bestimmt, indem Sie einfach lookahead = -1 und adaptive_lookahead = 0 setzen.

APIs auf echten Fahrzeugen verwenden#

Wir möchten denselben *Code* ausführen können, der in der Simulation läuft, auch auf einem echten Fahrzeug. Dies ermöglicht es Ihnen, Ihren Code im Simulator zu testen und auf einem echten Fahrzeug einzusetzen.

Im Allgemeinen sollten APIs Ihnen daher nichts erlauben, was auf einem echten Fahrzeug nicht möglich ist (z. B. das Abrufen von Ground-Truth-Daten). Der Simulator verfügt jedoch über viel mehr Informationen, und dies wäre in Anwendungen nützlich, bei denen die Ausführung auf echten Fahrzeugen keine Rolle spielt. Aus diesem Grund trennen wir klar zwischen sim-only APIs, indem wir das Präfix sim anhängen, z. B. simGetGroundTruthKinematics. Auf diese Weise können Sie die Verwendung dieser sim-only APIs vermeiden, wenn Ihnen die Ausführung Ihres Codes auf echten Fahrzeugen wichtig ist.

AirLib ist eine eigenständige Bibliothek, die Sie auf einem externen Computer wie dem Gigabyte Barebone Mini PC installieren können. Dieses Modul kann dann mit Flugsteuerungen wie PX4 über denselben Code und dasselbe Flugsteuerungs-Protokoll kommunizieren. Der Code, den Sie zum Testen im Simulator schreiben, bleibt unverändert. Sehen Sie AirLib auf benutzerdefinierten Drohnen.

Neue APIs zu AirSim hinzufügen#

Siehe die Seite Neue APIs hinzufügen.

Referenzen und Beispiele#

FAQ#

Unreal wird dramatisch verlangsamt, wenn ich eine API ausführe#

Wenn Sie feststellen, dass Unreal stark verlangsamt wird, wenn das Unreal Engine-Fenster den Fokus verliert, gehen Sie in Unreal Editor zu 'Edit->Editor Preferences', geben Sie im Suchfeld 'CPU' ein und stellen Sie sicher, dass 'Use Less CPU when in Background' deaktiviert ist.

Brauche ich unter Windows noch etwas?#

Sie sollten VS2019 mit VC++, Windows SDK 10.0 und Python installieren. Um Python-APIs zu verwenden, benötigen Sie Python 3.5 oder höher (installieren Sie es mit Anaconda).

Welche Python-Version soll ich verwenden?#

Wir empfehlen Anaconda, um Python-Tools und -Bibliotheken zu erhalten. Unser Code wird mit Python 3.5.3 :: Anaconda 4.4.0 getestet. Dies ist wichtig, da ältere Versionen bekanntermaßen Probleme haben.

Ich erhalte einen Fehler bei import cv2#

Sie können OpenCV mit

conda install opencv
pip install opencv-python

TypeError: unsupported operand type(s) for *: 'AsyncIOLoop' and 'float'#

Dieser Fehler tritt auf, wenn Sie Jupyter installieren, was die msgpackrpc-Bibliothek irgendwie beschädigt. Erstellen Sie eine neue Python-Umgebung mit den minimal erforderlichen Paketen.