4. Hindernisvermeidung¶
In diesem Projekt wird PiCar-X Hindernisse vor sich erkennen, während es vorwärtsfährt, und wenn die Hindernisse zu nah sind, wird es die Fahrtrichtung ändern.
Code ausführen
cd ~/picar-x/example
sudo python3 4.avoiding_obstacles.py
Nachdem der Code ausgeführt wurde, fährt PiCar-X vorwärts.
Wenn es erkennt, dass die Entfernung des Hindernisses vor ihm weniger als 20 cm beträgt, wird es rückwärtsfahren.
Wenn ein Hindernis innerhalb von 20 bis 40 cm ist, wird es nach links abbiegen.
Wenn nach dem Linksabbiegen kein Hindernis in der Richtung ist oder die Hindernisentfernung größer als 25 cm ist, wird es weiter vorwärtsfahren.
Code
Bemerkung
Sie können den untenstehenden Code modifizieren/zurücksetzen/kopieren/ausführen/stoppen. Bevor Sie das tun, müssen Sie jedoch zum Quellcodepfad wie picar-x/example
gehen. Nachdem Sie den Code modifiziert haben, können Sie ihn direkt ausführen, um den Effekt zu sehen.
from picarx import Picarx
import time
POWER = 50
SafeDistance = 40 # > 40 safe
DangerDistance = 20 # > 20 && < 40 turn around,
# < 20 backward
def main():
try:
px = Picarx()
# px = Picarx(ultrasonic_pins=['D2','D3']) # tring, echo
while True:
distance = round(px.ultrasonic.read(), 2)
print("distance: ",distance)
if distance >= SafeDistance:
px.set_dir_servo_angle(0)
px.forward(POWER)
elif distance >= DangerDistance:
px.set_dir_servo_angle(30)
px.forward(POWER)
time.sleep(0.1)
else:
px.set_dir_servo_angle(-30)
px.backward(POWER)
time.sleep(0.5)
finally:
px.forward(0)
if __name__ == "__main__":
main()
Wie funktioniert des?
Import des Picarx-Moduls und Initialisierung von Konstanten:
Dieser Abschnitt des Codes importiert die Klasse
Picarx
aus dem Modulpicarx
, die für die Steuerung des Picarx-Roboters entscheidend ist. Konstanten wiePOWER
,SafeDistance
undDangerDistance
werden definiert, die später im Skript verwendet werden, um die Bewegung des Roboters basierend auf Distanzmessungen zu steuern.from picarx import Picarx import time POWER = 50 SafeDistance = 40 # > 40 sicher DangerDistance = 20 # > 20 && < 40 umdrehen, # < 20 rückwärts
Definition der Hauptfunktion und Auslesen des Ultraschallsensors:
Die
main
Funktion ist der Ort, an dem der Picarx-Roboter gesteuert wird. Eine Instanz vonPicarx
wird erstellt, die die Funktionen des Roboters aktiviert. Das Skript tritt in eine endlose Schleife ein, liest ständig die Entfernung vom Ultraschallsensor und verwendet diese Entfernung, um die Bewegung des Roboters zu bestimmen.def main(): try: px = Picarx() while True: distance = round(px.ultrasonic.read(), 2) # [Rest der Logik]
Bewegungslogik basierend auf Distanz:
Die Bewegung des Roboters wird basierend auf der vom Ultraschallsensor gelesenen
distance
gesteuert. Wenn diedistance
größer alsSafeDistance
ist, bewegt sich der Roboter vorwärts. Wenn die Distanz zwischenDangerDistance
undSafeDistance
liegt, dreht er sich leicht und bewegt sich vorwärts. Wenn diedistance
kleiner alsDangerDistance
ist, fährt der Roboter rückwärts und dreht sich in die entgegengesetzte Richtung.if distance >= SafeDistance: px.set_dir_servo_angle(0) px.forward(POWER) elif distance >= DangerDistance: px.set_dir_servo_angle(30) px.forward(POWER) time.sleep(0.1) else: px.set_dir_servo_angle(-30) px.backward(POWER) time.sleep(0.5)
Sicherheit und Aufräumen mit dem ‚finally‘ Block:
Der
try...finally
Block stellt die Sicherheit sicher, indem er die Bewegung des Roboters im Falle einer Unterbrechung oder eines Fehlers stoppt. Dies ist ein entscheidender Teil, um unkontrollierbares Verhalten des Roboters zu verhindern.try: # [Steuerungslogik] finally: px.forward(0)
Ausführungseinstiegspunkt:
Der standardmäßige Python-Einstiegspunkt
if __name__ == "__main__":
wird verwendet, um die Hauptfunktion auszuführen, wenn das Skript als eigenständiges Programm ausgeführt wird.if __name__ == "__main__": main()
Zusammenfassend verwendet das Skript das Picarx-Modul, um einen Roboter zu steuern, wobei ein Ultraschallsensor zur Entfernungsmessung genutzt wird. Die Bewegung des Roboters wird anhand dieser Messungen angepasst und sorgt durch sorgfältige Steuerung und einen Sicherheitsmechanismus im finally-Block für einen sicheren Betrieb.