Skip to content

olivertiessen/leo_ws

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Git:

Den Workspace übernehmen (im home directory):

git clone https://git.fh-aachen.de/ot3139s/leo_ws.git

Um euren Änderungen hochzuladen:

git add .
git commit -m "Nachricht"
git push origin main

Repository aktualisieren:

git pull origin main

Dependencies:

ROS2

sudo apt update && sudo apt install curl
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update && sudo apt upgrade
sudo apt install ros-foxy-desktop python3-argcomplete
sudo apt install ros-dev-tools

Gazebo

sudo apt install ros-foxy-ament-cmake ros-foxy-gazebo-* ros-foxy-turtlebot3*

Groot

sudo apt install qtbase5-dev libqt5svg5-dev libzmq3-dev libdw-dev

Apriltag

sudo apt install ros-foxy-apriltag

Line Follower

pip install opencv-python

Gesture Recognition

pip install mediapipe

Environment setup (.bashrc):

echo 'source /opt/ros/foxy/setup.bash' >> ~/.bashrc
echo 'source ~/leo_ws/install/setup.bash' >> ~/.bashrc

Nodes

Drive to Apriltag

Pfad: src/leorover/leorover/drive_to_apriltag.py
ros2 launch apriltag ros tag 41h12.launch.py
ros2 run leorover drive to apriltag

Um den Rover mit den Apriltags durch die Arena zu navigieren wurde diese Node geschrieben. In der Präsentation wurde so über die Brücke gefahren.

Um die Apriltags zu erkennen und die Entfernung zu bestimmen muss zunächst die Launch-Datei tag_41h12.launch.py aus dem Package apriltag_ros gestartet werden. Dort ist angegeben, dass Apriltags der Familie 41h12 erkannt werden sollen. Ist dies erfolgt findet sich im tf-tree ein Transform von tagStandard41h12:XX_ zu camera_optical_frame, wobei XX für den ID des Tags steht.

In der Node befindet sich eine Liste, in der die Tags aufgeführt sind die angefahren werden sollen, sowie die Entfernung ab der das Tag als erfolgreich angefahren gilt. Außerdem eine eventuelle Versetzung im Anfahrwinkel und Information darüber, in welche Richtung der Rover sich drehen soll um das nächste Tag zu finden.

Am Anfang der Node wird eine Laufvariable i deklariert, die nach jedem Schritt inkrementiert wird. Ein Timer wird erstellt, der regelmäßig die Funktion aufruft, in der die Apriltags erfasst und darauf folgend die Twist-Befehle ausgegeben werden. Ein tf-listener gibt den Transform von base_footprint zu dem Tag-Frame zurück, das sich als String im ersten Element der oben genannten Liste befindet. Der Winkel zum Ziel wird berrechnet und ein Publisher gibt eine Twist-Befehl aus, um den Rover zu rotieren, bis das Tag sich im Sichtfeld der Kamera befindet. Der Rover wird nach links oder rechts gedreht bis die Ausrichtung dem gewünschten Winkel in einem Toleranzfeld, das in ANGLETOLERANCE angegeben wird, entspricht. Der Rover bekommt jetzt einen Befehl zum Vorwärtsfahren, bis der Winkel verlassen wird, worauf dieser wieder korregiert wird, oder er sich in der Entfernung zum Tag befindet, die in DISTANCETOLERANCE angegeben wurde. In dem Fall wird i inkrementiert. So können Koordinaten in der Arena angefahren werden, sofern sich der Rover im Blickfeld eines Tags befindet.

Für die Translation und Rotation wird ein P-Regler verwendet, der den Twist-Befehl mit sich verringerndem Abstand zum Ziel bzw. Zielwinkel verkleinert.

Gesture Recognition

Pfad: src/leorover/leorover/gesture_recognition.py
ros2 run leorover gesture_recognition

Mit dieser Node wird der Leorover über Gestensteuerung bewegt. Dazu wird das Machine-Learning-Framework Mediapipe von Google genutzt. Die Gestenerkennung von Mediapipe ermöglicht die Erkennung und Interpretation von Handgesten in Echtzeit. Mediapipe stellt hierfür vortrainierte Modelle und Funktionen bereit, die die Hand- und Gestenerkennung auf Bildern oder Videoaufnahmen ermöglichen.

Ein Subscriber auf das topic camera/image_color greift das Kamerabild ab. Im callback erfolgt dann die Auswertung und Überführung in einen Twist-Befehl. Zunächst muss das Bild über CvBridge mit OpenCV in ein für Mediapipe lesbares Format umgewandelt werden. Das formatierte Bild wird dann an Mediapipe übergeben. Das tranierte Modell wird als .task-Datei von Google bereitgestellt, der Pfad dafür muss im Programm angegeben werden. Zurück kommt ein Objekt, deren erstes Element ein String ist, der die Erkannte Geste angibt:

  1. Unrecognized gesture, label: Unknown
  2. Closed fist, label: Closed_Fist
  3. Open palm, label: Open_Palm
  4. Pointing up, label: Pointing_Up
  5. Thumbs down, label: Thumb_Down
  6. Thumbs up, label: Thumb_Up
  7. Victory, label: Victory
  8. Love, label: ILoveYou

Mit einer If-Kontrollstuktur wird diese Geste dann in einen Twist-Befehl umgewandelt und ausgegeben.

Line Follower

Pfad: src/xbox/xbox/linefollower.py
Pfad: src/xbox/xbox/follower2.py
ros2 run xbox linefollower
ros2 run xbox follower2

Mit linefollower kann der Rover der pinken Linie in Gazebo folgen. Mit OpenCV wird eine Maske mittels HSV-Filter generiert. Danach wird der Mittelwert der 300sten Pixel ausgerechnet, indem der x-Wert jedes Pixel in der Maske mit 1 addiert wird und dann durch die Menge an Werten geteilt wird. Darauf aufbauend wird dann der Rover mit einem PD-Regeler entlang der Linie gesteuert.

Follower2 ist auf den echten Leo eingestellt. Diese Node funktionierte in der Arena nicht. Höchst wahrscheinlich wegen einer falschen Einstellung des HSV-Filters, oder alternativ, weil Spiegelungen am Rand nicht richtig rausgefiltert wurden.

Nicht genutzte Nodes

AR to Map

Pfad: src/leorover/leorover/ar_to_map.py
ros2 run leorover ar_to_map

Hier wurde versucht aus der Erkennung von Apriltags ein Map-Frame zu erstellen der sich in Echtzeit aktualisiert, um den Rover während der Fahrt zu lokalisieren. Der Frame würde sich immer an den gleichen Ort in der Arena setzen. Die Node enthält einen tf-listener für die Apriltags. Die Namen aller relevanten Tags sind in einer Liste hinterlegt durch die iteriert wird, bis der erste erfolgreiche Transform-Lookup erfolgt ist. Ungenauigkeiten bei der Erkennung auf große Entfernung oder am Bildrand können über eine if-Anweisung abgefangen werden. Alle Apriltags sind in einem Dictionary mit ihrer Pose hinterlegt. Wenn die Tags erkannt werden wird die Pose aus dem Dictionary und der Transform vom Tag zum Rover an die Funktion calculate_robot_pose_ übergeben, die mithilfe von Matrixmultiplikationen und der transforms3d-Bibliothek den Transform von map zu base_footprint berechnet. Die Node hat im Labor den Frame an die falschen Stellen gesetzt, die Mathematik in der Funktion für die Berechnung des Transforms ist vermutlich fehlerhaft. Deshalb blieb eine Implementation aus.

Drive to Point

Pfad: src/leorover/leorover/drive_to_point.py
ros2 run leorover drive_to_point

Diese zum Anfang des Projekts geschriebene Node kann Punkte mit einer Subscription auf das /odom topic anfahren. Darauf basierend wurde dann die Node drive_to_apriltag erstellt. Aus der Message wird die Pose des Roboters . Ähnlich wie in der Node wird erst der Winkel zum Ziel errechnet und der Roboter gedreht bis er sich in einem Toleranzfeld befindet, dann wird nach vorne gefahren bis der Winkel verlassen wird oder das Ziel mit einer Toleranz erreicht ist. Diese Funktion wurde nicht weiter verwendet, da sich nach wenigen Punkten hohe Ungenauigkeiten ergeben. Wäre die Implementation von ar_to_map erfolgreich gewesen, hätte so jedoch, während keine Apriltags/Farbmarkierungen sichtbar wären, navigiert werden können. Die Genauigkeit hätte z.B. durch die Nutzung des Packages robot_localization erhöht werden können.

xbox

Pfad: src/xbox/xbox/xbox.py
ros2 launch xbox xbox.py
oder 
ros2 run xbox xbox

Mit dieser Node kann der Leorover mithilfe eines Controllers gesteuert werden. Die Launch-Datei xbox.py startet die Node joy_node aus dem joy package. Die Node xbox wandelt dann die Nachrichten aus dem Topic /joy in Twist-Befehle um.

Corner Detector

Pfad: src/xbox/xbox/tf2_test.py
ros2 run xbox cornerDetector

Hier wurde versucht mittels OpenCV die Kreuzungen der Tapes zu erkennen, und als Frame auszugeben. Die Node basiert auf den Python-Programmen anotherline.py und arraytest.py

anotherline.py

Pfad: src/xbox/xbox/openCV_basics/anotherline.py
python3 src/xbox/xbox/openCV_basics/anotherline.py

OpenCV wird genutzt, um die äußeren Ecken der Tapes zu erkennen und in einem zweidimensionalen Numpy-Array zu speichern. Dazu wird ein HSV-Filter und Adaptive Houghlines genutzt.

arraytest

Pfad: src/xbox/xbox/openCV_basics/arraytest.py
python3 src/xbox/xbox/openCV_basics/arraytest.py

Der Array aus anotherline.py wird so gefiltert, dass nur noch eine Linie pro Tape erkannt wird, um daraufhin die Kreuzungen auszurechnen. Das Program filtert die Arrays nicht verlässlich.

About

Leo Rover

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors