Neue APIs zu AirSim hinzufügen#
Das Hinzufügen neuer APIs erfordert die Modifizierung des Quellcodes. Ein Großteil der Änderungen ist mechanisch und für die verschiedenen Abstraktionsebenen erforderlich, die AirSim unterstützt. Die wichtigsten zu modifizierenden Dateien werden nachfolgend zusammen mit einigen Commits und PRs zur Veranschaulichung beschrieben. Bestimmte Abschnitte der PRs oder Commits können an einigen Stellen verlinkt sein, aber es ist hilfreich, den gesamten Diff zu betrachten, um ein besseres Verständnis des Workflows zu erhalten. Zögern Sie auch nicht, ein Issue oder einen Draft-PR zu eröffnen, wenn Sie sich unsicher sind, wie Sie Änderungen vornehmen sollen oder Feedback erhalten möchten.
Implementierung der API#
Bevor der Wrapper-Code zum Aufrufen und Verarbeiten der API hinzugefügt wird, muss diese zuerst implementiert werden. Die genauen Dateien, in denen dies geschieht, hängen von der Funktionalität ab. Einige Beispiele sind nachfolgend aufgeführt, die Ihnen beim Einstieg helfen könnten.
Fahrzeugbasierte APIs#
moveByVelocityBodyFrameAsync API für geschwindigkeitsbasierte Bewegung im X-Y-Rahmen des Multirotors.
Die Hauptimplementierung erfolgt in MultirotorBaseApi.cpp, wo die meisten Multirotor-APIs implementiert sind.
In einigen Fällen können zusätzliche Strukturen zur Speicherung von Daten erforderlich sein. getRotorStates API ist hierfür ein gutes Beispiel. Hier wird die RotorStates Struktur an 2 Stellen für die Konvertierung von RPC in internen Code definiert. Sie erfordert auch Modifikationen in AirLib sowie in Unreal/Plugins für die Implementierung.
Umgebungsbezogene APIs#
Diese APIs müssen mit der Simulationsumgebung selbst interagieren, daher wird sie wahrscheinlich innerhalb des Ordners Unreal/Plugins implementiert.
-
simCreateVoxelGridAPI zum Generieren und Speichern eines binvox-formatierten Gitters der Umgebung - WorldSimApi.cpp -
simAddVehicleAPI zum Erstellen von Fahrzeugen zur Laufzeit - SimMode*, WorldSimApi Dateien
Physikbezogene APIs#
Die API simSetWind zeigt ein Beispiel für die Modifikation des physikalischen Verhaltens und das Hinzufügen einer API + Einstellungsmöglichkeit dafür. Details zum Code finden Sie in dem PR.
RPC-Wrapper#
Die APIs verwenden das msgpack-rpc-Protokoll über TCP/IP über rpclib, entwickelt von Tamás Szelei, das die Verwendung einer Vielzahl von Programmiersprachen wie C++, C#, Python, Java usw. ermöglicht. Wenn AirSim startet, öffnet es Port 41451 (dies kann über die Einstellungen geändert werden) und wartet auf eingehende Anfragen. Der Python- oder C++-Clientcode verbindet sich mit diesem Port und sendet RPC-Aufrufe unter Verwendung des msgpack-Serialisierungsformats.
Um den RPC-Code zum Aufrufen der neuen API hinzuzufügen, folgen Sie den untenstehenden Schritten. Folgen Sie der Implementierung anderer APIs, die in den Dateien definiert sind.
-
Fügen Sie einen RPC-Handler im Server hinzu, der Ihre implementierte Methode in RpcLibServerBase.cpp aufruft. Fahrzeugspezifische APIs befinden sich in ihrem jeweiligen Fahrzeug-Unterordner.
-
Fügen Sie die C++-Client-API-Methode in RpcClientBase.cpp hinzu.
-
Fügen Sie die Python-Client-API-Methode in client.py hinzu. Bei Bedarf fügen Sie eine Strukturdefinition in types.py hinzu oder modifizieren Sie diese.
Testen#
Tests sind erforderlich, um sicherzustellen, dass die API wie erwartet funktioniert. Dazu müssen Sie, wie erwartet, die aus dem Quellcode erstellte AirSim- und Blocks-Umgebung verwenden. Darüber hinaus müssen Sie bei Verwendung der Python-APIs das airsim-Paket aus dem Quellcode anstelle des PyPI-Pakets verwenden. Nachfolgend werden 2 Methoden zur Verwendung des Pakets aus dem Quellcode beschrieben.
-
Verwenden Sie setup_path.py. Es konfiguriert den Pfad so, dass das lokale AirSim-Modul anstelle des über pip installierten Pakets verwendet wird. Dies ist die Methode, die in vielen Skripten verwendet wird, da der Benutzer nichts weiter tun muss, als das Skript auszuführen. Platzieren Sie Ihr Beispielskript in einem der Ordner unter
PythonClient, wiemultirotor,carusw. Sie können auch einen eigenen Ordner erstellen, um Dinge getrennt zu halten, und die Dateisetup_path.pyaus einem anderen Ordner kopieren. Fügen Sieimport setup_pathvorimport airsimin Ihren Dateien hinzu. Nun wird die neueste Main-API (oder jeder aktuell ausgecheckte Branch) verwendet. -
Verwenden Sie ein lokales Projekt-Pip-Install. Eine reguläre Installation würde eine Kopie des aktuellen Quellcodes erstellen und verwenden, während eine Editable-Installation (
pip install -e .aus dem OrdnerPythonClientheraus) das Paket bei jeder Änderung der Python-API-Dateien aktualisiert. Die Editable-Installation hat Vorteile, wenn Sie an mehreren Branches arbeiten oder die API noch nicht finalisiert ist.
Es wird empfohlen, eine virtuelle Umgebung für die Verwaltung von Python-Paketen zu verwenden, um bestehende Setups nicht zu beeinträchtigen.
Stellen Sie bei der Eröffnung eines PR sicher, dass Sie die Coding-Richtlinien befolgen. Fügen Sie außerdem einen Docstring für die API in den Python-Dateien hinzu und inkludieren Sie alle erforderlichen Beispielskripte und Einstellungen in das Skript.