Ultraschall Hindernisumfahrung
Zuletzt wurde die Hindernisumfahrung mit dem Ultraschallsensor implementiert. Die Motoren werden wie bei den anderen Programmen angesteuert. Der Code wird mit einem Servomotor, um den Ultraschallsensor nach rechts und links zu drehen, erweitert und die Infrarotsensoren werden durch den Ultraschallsensor ersetzt.
Dazu wurden die beiden Dateien slave_Sonar.py und master_Sonar.py erstellt.
Bei der Implementierung lag zunächst die Schwierigkeit, dass die Master-Node die Sensordaten nicht zum richtigen Zeitpunkt erhalten hat. So wurden zum Beispiel die Sensordaten für rechts und links gepublished, sind aber erst im zweiten durchlauf der Master-Node bei dem subscriber angekommen.
Der funktionierende Code kann in dem SVN-Repository unten in diesem Artikel unter Demo nachgeschlagen werden.
Der Ablauf für die Hindernisumfahrung mit Ultraschallsensor ist in Abb. 17 dargestellt.
Hier wurde wie bei der Infrarot-Hindernisumfahrung eine Launch-file erstellt, welche zunächst gestartet wurden muss.
ros2 launch sensor_test alphabot_Sonar_launch.py
Wenn die launch-file ausgeführt wurde, fährt der AlphaBot los und die Slave-Node published die Sensordaten über die Topic Sonar/middle an die Master-Node.
Anhand dieser Daten überprüft die Master-Node über eine if-Schleife, ob die Entfernung kleiner 50 ist. Solange der Wert über 50 ist, wird die Nachricht "forward" gepublished und der AlphaBot fährt geradeaus.
Wenn die Entfernung kleiner 50 wird, hält die Slave-Node bei erhalt der Nachricht "stop" von der Master-Node, den AlphaBot an. Weiter published die Master-Node die Nachricht "lookRight". Wenn die Slave-Node diese Nachricht erhält, steuert sie die GPIO Pins für den Servomotor an, um den Sensor nach rechts zu drehen. Das funktioniert mit dem sogenannten DutyCycle.
self.p.ChangeDutyCycle(2.5)
Dann published die Master-Node "rightData" und nachdem die Slave-Node das erhalten hat, published sie die Sensordaten über die Topic "Sonar/right".
Mit dem gleichen Prinzip wird der Sensor als nächstes nach links gedreht. Das passiert über die Nachrichten "lookLeft" und "leftData".
Zuletzt wird der Ultraschallsensor mit der Nachricht "lookForward" und dem entsprechendem DutyCylce 7.5 zur Ausgangsposition zurückgedreht.
Die Master-Node wertet die Daten über eine weitere if-Schleife aus und published die Nachricht, in welche Richtung der AlphaBot fahren kann.
So wird "backward" gepublished, wenn links und rechts der Wert kleiner 50 ist, oder "right", wenn der rechte Wert größer ist wie der linke Wert. Und ansonsten wird "left" gepublished.
Die Slave-Node steuert anhand der erhaltenden Nachricht die GPIO Pins an, um das Hindernis zu umfahren.
In dem hier gezeigten Sequenzdiagramm wird die Kommunikation zwischen Master und Slave aufgezeigt(Abb.18).
So ist zusehen, wann die Slave Sensordaten an den Master published und wann der Master Movements an die Slave published.
Die Terminalausgabe während das Programm ausgeführt wird, könnte wie in Abb. 19 aussehen.
Dort ist zu erkenne, dass nur middle_data gepublished wird bis dieser Wert unter 50 fällt.
Dann werden zusätzlich die Sensordaten für links und rechts gepublished, nachdem der Servo nach rechts und links gedreht wurde.
In dem RQT-Graph zur Ultraschall Hindernisumfahrung wurden die Sensordaten Topics zu einer Gruppe zusammengefasst, da nur ein Ultraschallsensor mit 3 ROS2 Topics verwendet wurde(Abb. 20).
Das wurde gemacht, um die Sensordaten für links, Mitte und rechts auseinander zuhalten.
Allgemein ist das Prinzip, wie bei der Infrarot Hindernisumfahrung, nur das die Slave über drei verschiedene Topics die Sensordaten published.
Und über die cmd_vel Topic werden zusätzlich die Servo-Movements gepublished.