airsim_ros_pkgs#

Ein ROS Wrapper über die AirSim C++ Client-Bibliothek.

Setup#

Die folgenden Schritte sind für Linux gedacht. Wenn Sie AirSim unter Windows ausführen, können Sie das Windows Subsystem für Linux (WSL) verwenden, um den ROS Wrapper auszuführen. Die Anweisungen finden Sie weiter unten. Wenn Sie ROS und zugehörige Tools aus bestimmten Gründen nicht auf Ihrem Host-Linux installieren können oder wollen, können Sie es auch mit Docker versuchen, siehe die Schritte unter Docker für den ROS Wrapper verwenden.

  • Wenn Ihre Standard-GCC-Version nicht 8 oder höher ist (prüfen mit gcc --version)

    • Installieren Sie gcc >= 8.0.0: sudo apt-get install gcc-8 g++-8
    • Installation überprüfen mit gcc-8 --version
  • Ubuntu 16.04

    • Installieren Sie ROS kinetic
    • Installieren Sie tf2 sensor und mavros Pakete: sudo apt-get install ros-kinetic-tf2-sensor-msgs ros-kinetic-tf2-geometry-msgs ros-kinetic-mavros*
  • Ubuntu 18.04

    • Installieren Sie ROS melodic
    • Installieren Sie tf2 sensor und mavros Pakete: sudo apt-get install ros-melodic-tf2-sensor-msgs ros-melodic-tf2-geometry-msgs ros-melodic-mavros*
  • Ubuntu 20.04

    • Installieren Sie ROS noetic
    • Installieren Sie tf2 sensor und mavros Pakete: sudo apt-get install ros-noetic-tf2-sensor-msgs ros-noetic-tf2-geometry-msgs ros-noetic-mavros*
  • Installieren Sie catkin_tools sudo apt-get install python-catkin-tools oder pip install catkin_tools. Wenn Sie Ubuntu 20.04 verwenden, nutzen Sie pip install "git+https://github.com/catkin/catkin_tools.git#egg=catkin_tools"

Build#

  • AirSim bauen
git clone https://github.com/Microsoft/AirSim.git;
cd AirSim;
./setup.sh;
./build.sh;
  • Stellen Sie sicher, dass Sie die Umgebungsvariablen für ROS wie oben auf den Installationsseiten beschrieben eingerichtet haben. Fügen Sie den source Befehl zur Bequemlichkeit in Ihre .bashrc Datei ein (ersetzen Sie melodic durch den spezifischen Versionsnamen) -
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
  • ROS-Paket bauen
cd ros;
catkin build; # or catkin_make

Wenn Ihr Standard-GCC nicht 8 oder höher ist (prüfen mit gcc --version), wird die Kompilierung fehlschlagen. Verwenden Sie in diesem Fall explizit gcc-8 wie folgt -

catkin build -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8

Laufend#

source devel/setup.bash;
roslaunch airsim_ros_pkgs airsim_node.launch;
roslaunch airsim_ros_pkgs rviz.launch;

Hinweis: Wenn Sie einen Fehler beim Ausführen von roslaunch airsim_ros_pkgs airsim_node.launch erhalten, führen Sie catkin clean aus und versuchen Sie es erneut.

Verwendung des AirSim ROS Wrappers#

Der ROS Wrapper besteht aus zwei ROS Nodes: dem ersten, der die AirSim C++ Multi-Rotor Client-Bibliothek umschließt, und dem zweiten, einem einfachen PD Positionsregler. Schauen wir uns die ROS API für beide Nodes an.

AirSim ROS Wrapper Node#

Publisher:#

  • /airsim_node/origin_geo_point airsim_ros_pkgs/GPSYaw GPS-Koordinaten, die dem globalen NED-Frame entsprechen. Dies wird in der settings.json von AirSim unter dem Schlüssel OriginGeopoint eingestellt.

  • /airsim_node/VEHICLE_NAME/global_gps sensor_msgs/NavSatFix Dies sind die aktuellen GPS-Koordinaten der Drohne in Airsim.

  • /airsim_node/VEHICLE_NAME/odom_local_ned nav_msgs/Odometry Odometrie im NED-Frame (Standardname: odom_local_ned, Launch-Name und Frame-Typ sind konfigurierbar) relativ zum Startpunkt.

  • /airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPE/camera_info sensor_msgs/CameraInfo

  • /airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPE sensor_msgs/Image RGB- oder Float-Bild, abhängig vom in settings.json angeforderten Bildtyp.

  • /tf tf2_msgs/TFMessage

  • /airsim_node/VEHICLE_NAME/altimeter/SENSOR_NAME airsim_ros_pkgs/Altimeter Dies sind die aktuellen Altimeter-Messwerte für Höhe, Druck und QNH.

  • /airsim_node/VEHICLE_NAME/imu/SENSOR_NAME sensor_msgs::Imu IMU-Sensordaten

  • /airsim_node/VEHICLE_NAME/magnetometer/SENSOR_NAME sensor_msgs::MagneticField Messung des Magnetfeldvektors/Kompass.

  • /airsim_node/VEHICLE_NAME/distance/SENSOR_NAME sensor_msgs::Range Messung des Abstands von einem aktiven Ranger, wie Infrarot oder IR.

  • /airsim_node/VEHICLE_NAME/lidar/SENSOR_NAME sensor_msgs::PointCloud2 LIDAR-Punktwolke

Subscriber:#

Services:#

Parameter:#

  • /airsim_node/world_frame_id [string] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: world_ned Auf "world_enu" setzen, um automatisch zu ENU-Frames zu wechseln.

  • /airsim_node/odom_frame_id [string] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: odom_local_ned Wenn Sie world_frame_id auf "world_enu" setzen, wird der Standard-Odom-Name stattdessen auf "odom_local_enu" gesetzt.

  • /airsim_node/coordinate_system_enu [boolean] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: false Wenn Sie world_frame_id auf "world_enu" setzen, wird diese Einstellung stattdessen auf true gesetzt.

  • /airsim_node/update_airsim_control_every_n_sec [double] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: 0.01 Sekunden. Häufigkeit des Timer-Callbacks für die Aktualisierung der Drohnen-Odometrie und des Zustands von Airsim sowie für das Senden von Steuerbefehlen. Die aktuelle RPClib-Schnittstelle zur Unreal Engine erreicht maximal 50 Hz. Timer-Callbacks in ROS laufen mit der maximal möglichen Rate, daher ist es am besten, diesen Parameter nicht zu ändern.

  • /airsim_node/update_airsim_img_response_every_n_sec [double] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: 0.01 Sekunden. Häufigkeit des Timer-Callbacks für den Empfang von Bildern von allen Kameras in Airsim. Die Geschwindigkeit hängt von der Anzahl der angeforderten Bilder und deren Auflösung ab. Timer-Callbacks in ROS laufen mit der maximal möglichen Rate, daher ist es am besten, diesen Parameter nicht zu ändern.

  • /airsim_node/publish_clock [double] Eingestellt in: $(airsim_ros_pkgs)/launch/airsim_node.launch Standard: false Veröffentlicht das ROS /clock Topic, wenn auf true gesetzt.

Einfacher PID Positionsregler Node#

Parameter:#

  • PD-Reglerparameter
  • /pd_position_node/kd_x [double], /pd_position_node/kp_y [double], /pd_position_node/kp_z [double], /pd_position_node/kp_yaw [double] Proportionale Verstärkungen

  • /pd_position_node/kd_x [double], /pd_position_node/kd_y [double], /pd_position_node/kd_z [double], /pd_position_node/kd_yaw [double] Ableitungsverstärkungen

  • /pd_position_node/reached_thresh_xyz [double] Schwellenwert für die euklidische Distanz (Meter) von der aktuellen Position zur Zielposition.

  • /pd_position_node/reached_yaw_degrees [double] Schwellenwert für die Gierwinkel-Distanz (Grad) von der aktuellen Position zur Zielposition.

  • /pd_position_node/update_control_every_n_sec [double] Standard: 0.01 Sekunden.

Services:#

  • /airsim_node/VEHICLE_NAME/gps_goal [Anforderung: srv/SetGPSPosition] Ziel-GPS-Position + Gierwinkel. In **absoluter** Höhe.

  • /airsim_node/VEHICLE_NAME/local_position_goal [Anforderung: srv/SetLocalPosition] Ziel-Lokalposition + Gierwinkel im globalen NED-Frame.

Subscriber:#

  • /airsim_node/origin_geo_point airsim_ros_pkgs/GPSYaw Lauscht auf die Heim-Geo-Koordinaten, die vom airsim_node veröffentlicht werden.

  • /airsim_node/VEHICLE_NAME/odom_local_ned nav_msgs/Odometry Lauscht auf die Odometrie, die vom airsim_node veröffentlicht wird.

Publisher:#

Globale Parameter#

  • Dynamische Einschränkungen. Diese können in dynamic_constraints.launch geändert werden.

    • /max_vel_horz_abs [double] Maximale horizontale Geschwindigkeit der Drohne (Meter/Sekunde).

    • /max_vel_vert_abs [double] Maximale vertikale Geschwindigkeit der Drohne (Meter/Sekunde).

    • /max_yaw_rate_degree [double] Maximale Gierrate (Grad/Sekunde).

Sonstiges#

Einrichtung der Build-Umgebung unter Windows 10 mit WSL1 oder WSL2#

Diese Setup-Anweisungen beschreiben, wie "Bash on Ubuntu on Windows" (auch bekannt als "Windows Subsystem for Linux") eingerichtet wird.

Dies beinhaltet die Aktivierung der integrierten Linux-Umgebung von Windows (WSL) in Windows 10, die Installation eines kompatiblen Linux-Betriebssystem-Images und schließlich die Installation der Build-Umgebung, als wäre es ein normales Linux-System.

Nach Abschluss können Sie den ROS Wrapper wie auf einem nativen Linux-Rechner bauen und ausführen.

WSL1 vs WSL2#

WSL2 ist die neueste Version des Windows 10 Subsystem for Linux. Es ist um ein Vielfaches schneller als WSL1 (wenn Sie das native Dateisystem in /home/... anstelle von Windows-gemounteten Ordnern unter /mnt/... verwenden) und wird daher in Bezug auf die Geschwindigkeit für den Code-Build stark bevorzugt.

Nach der Installation können Sie nach Belieben zwischen WSL1- oder WSL2-Versionen wechseln.

WSL Setup-Schritte#
  1. Befolgen Sie die Anweisungen hier. Stellen Sie sicher, dass die ROS-Version, die Sie verwenden möchten, von der Ubuntu-Version unterstützt wird, die Sie installieren möchten.

  2. Herzlichen Glückwunsch, Sie haben nun ein funktionierendes Ubuntu-Subsystem unter Windows. Sie können nun zu den Ubuntu 16 / 18 Anweisungen und dann zu Wie man Airsim unter Windows und den ROS Wrapper unter WSL ausführt weitergehen!

Hinweis

Sie können XWindows-Anwendungen (einschließlich SITL) ausführen, indem Sie VcXsrv unter Windows installieren. Um es zu verwenden, suchen und starten Sie XLaunch im Windows-Startmenü. Wählen Sie im ersten Popup Multiple Windows, im zweiten Popup Start no client, im dritten Popup **nur** Clipboard. Wählen Sie **nicht** Native Opengl (und wenn Sie keine Verbindung herstellen können, wählen Sie Disable access control). Sie müssen die DISPLAY-Variable so einstellen, dass sie auf Ihr Display zeigt: in WSL ist es 127.0.0.1:0, in WSL2 ist es die IP-Adresse des Netzwerkports des PCs und kann mit dem folgenden Code gesetzt werden. Außerdem müssen Sie unter WSL2 möglicherweise die Firewall für öffentliche Netzwerke deaktivieren oder eine Ausnahme erstellen, damit VcXsrv mit WSL2 kommunizieren kann.

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

Tipp

  • Wenn Sie diese Zeile zu Ihrer ~/.bashrc-Datei hinzufügen, müssen Sie diesen Befehl nicht erneut ausführen.
  • Für die Code-Bearbeitung können Sie VSCode innerhalb von WSL installieren.
  • Windows 10 enthält den Virenscanner "Windows Defender". Er verlangsamt WSL erheblich. Das Deaktivieren verbessert die Festplattenleistung erheblich, erhöht aber Ihr Risiko für Viren. Deaktivieren Sie ihn auf eigene Gefahr. Hier ist eine von vielen Ressourcen/Videos, die zeigen, wie man ihn deaktiviert: How to Disable or Enable Windows Defender on Windows 10
Dateisystemzugriff zwischen WSL und Windows 10#

Innerhalb von WSL werden die Windows-Laufwerke im Verzeichnis /mnt referenziert. Um beispielsweise Dokumente in Ihrem () Dokumentenordner aufzulisten

`ls /mnt/c/'Documents and Settings'/<username>/Documents`
or
`ls /mnt/c/Users/<username>/Documents`

Innerhalb von Windows befinden sich die Dateien der WSL-Distribution unter (geben Sie dies in die Adressleiste des Windows Explorers ein)

\\wsl$\<distributionsname> z.B. \\wsl$\Ubuntu-18.04

Wie man Airsim unter Windows und den ROS Wrapper unter WSL ausführt#

Für WSL 1 führen Sie aus: export WSL_HOST_IP=127.0.0.1 und für WSL 2: export WSL_HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}') Führen Sie nun, wie im Abschnitt für Linux beschrieben, Folgendes aus:

source devel/setup.bash
roslaunch airsim_ros_pkgs airsim_node.launch output:=screen host:=$WSL_HOST_IP
roslaunch airsim_ros_pkgs rviz.launch

Docker für ROS verwenden#

Eine Dockerfile befindet sich im Verzeichnis tools. Um das airsim-ros Image zu bauen -

cd tools
docker build -t airsim-ros -f Dockerfile-ROS .

Um auszuführen, ersetzen Sie den Pfad des AirSim-Ordners unten -

docker run --rm -it --net=host -v <your-AirSim-folder-path>:/home/testuser/AirSim airsim-ros:latest bash

Der obige Befehl bindet das AirSim-Verzeichnis an das Home-Verzeichnis innerhalb des Containers. Alle Änderungen, die Sie an den Quelldateien auf Ihrem Host vornehmen, sind im Container sichtbar, was für Entwicklung und Tests nützlich ist. Befolgen Sie nun die Schritte unter Build, um den ROS Wrapper zu kompilieren und auszuführen.