Wie kann ich denn den Test ausführen und gleichzeitig die CPU überwachen? Habe doch kein Eingabe Fenster
Projekt: Autonomer Roboter
-
Shaq -
29. Dezember 2017 um 16:26 -
Unerledigt
-
-
Projekt: Autonomer Roboter? Schau mal ob du hier fündig wirst!
-
Nimm halt ein anderes TTY (Ctrl+Alt+F{1-6}) oder mach ein neues Terminal auf
-
Habs schon hinbekommen. Danke trotzdem.
Im Anhang mal die Ausgabe als Screenshot. Meintest Du das so?
-
Kann es vielleicht sein das du es ggf selber mehrfach ausführst oder sogar noch alte Instanzen aktiv sind?
Als Benutzer root ist sudo überflüssig, da du doch bereits root bist was soll da sudo noch bewirken?
PS: Du musst das Script mit python3 ausführen, nicht mit python. Kleiner aber feiner Unterschied! Letzteres wäre nämlich nur python2, der Shebang besagt aber?
Und ja, Das Script aus Beitrag#137 wirft bei python3 dann einen Fehler, den es mit python2 nicht gibt. Das wiederum liegt an Deiner Abänderung des "brains".
-
Aufgrund privater Angelegenheiten, kann ich mich leider erst jetzt wieder zurück melden.
Ich habe es jetzt gerade noch einmal getestet mit folgendem Script:
Python
Alles anzeigen#!/usr/bin/python3 # -*- coding: utf-8 -*- # (c) 2018 by meigrafd # import sys import time import multiprocessing as mp from datetime import datetime from RPi import GPIO class Sonar_Ranger: """ This class encapsulates a type of acoustic ranger. In particular the type of ranger with separate trigger and echo pins. A pulse on the trigger initiates the sonar ping and shortly afterwards a sonar pulse is transmitted and the echo pin goes high. The echo pins stays high until a sonar echo is received (or the response times-out). The time between the high and low edges indicates the sonar round trip time. Adjusting the interval between measurements increases the speed of the reading. Increasing the speed will also increase CPU usage. Setting it too low will cause errors. """ def __init__(self, trigger_pin, echo_pin, telemetry, status, settings, unit='cm', average=False, range_min=2, range_max=400): self.trig = trigger_pin self.echo = echo_pin self.telemetry = telemetry self.status = status self.settings = settings self.unit = unit self.average = average self.range_min = range_min self.range_max = range_max self.average_count = 3 self.last_announce_time = int(time.time()) GPIO.setup(self.trig, GPIO.OUT) GPIO.setup(self.echo, GPIO.IN) self.start_time = datetime.now() self.distance=None GPIO.add_event_detect(self.echo, GPIO.BOTH, self.callback) def callback(self, channel): if GPIO.input(self.echo) == 1: self.start_time = datetime.now() else: self.end_time = datetime.now() self.delta = self.end_time - self.start_time self.time_elapsed = self.delta.seconds + self.delta.microseconds / 1E6 # ultra-hacker-style. 1E6 is 1000000. if self.unit == 'cm': metric = 0.000058 else: metric = 0.000148 self.distance = self.time_elapsed / metric self.telemetry['distance'] = self.distance def measure_average(self, count=3): c=1 distance=0 while (c <= count): self.ping() time.sleep(0.040) if self.distance: distance = distance + self.distance time.sleep(0.05) c+=1 self.distance = distance/count def ping(self, pulse=0.00005): self.start_time=datetime.now() self.end_time=datetime.now() self.distance=None GPIO.output(self.trig, GPIO.HIGH) time.sleep(pulse) GPIO.output(self.trig, GPIO.LOW) def print_distance(self): if self.distance: if (int(time.time()) - self.last_announce_time) >= self.settings['distance_announce_time']: if self.distance > self.range_max or self.distance < self.range_min: print('Distance: out of range %.2f' % self.distance) else: print('Distance: %.2f %s' % (self.distance, self.unit)) self.last_announce_time = int(time.time()) def run(self): while True: time.sleep(self.settings['distance_measure_time']) if not self.status['stop_ping']: if self.average: self.measure_average(self.average_count) else: self.ping() class Motor_Control: """ http://www.14core.com/wiring-driving-the-l298n-h-bridge-on-2-to-4-dc-motors/ """ def __init__(self, status, motor_a_in1, motor_a_in2, motor_b_in3, motor_b_in4): self.motor_a_in1 = motor_a_in1 self.motor_a_in2 = motor_a_in2 self.motor_b_in3 = motor_b_in3 self.motor_b_in4 = motor_b_in4 self.status = status self.status['steerTo']=0 GPIO.setup(self.motor_a_in1, GPIO.OUT) GPIO.setup(self.motor_a_in2, GPIO.OUT) GPIO.setup(self.motor_b_in3, GPIO.OUT) GPIO.setup(self.motor_b_in4, GPIO.OUT) def stop(self): GPIO.output(self.motor_a_in1, False) GPIO.output(self.motor_a_in2, False) GPIO.output(self.motor_b_in3, False) GPIO.output(self.motor_b_in4, False) self.status['steerTo'] = 'stop' print('Motor: {}'.format(self.status['steerTo'])) def forward(self): GPIO.output(self.motor_a_in1, True) GPIO.output(self.motor_a_in2, False) GPIO.output(self.motor_b_in3, True) GPIO.output(self.motor_b_in4, False) self.status['steerTo'] = 'forward' print('Motor: {}'.format(self.status['steerTo'])) def reverse(self): GPIO.output(self.motor_a_in1, False) GPIO.output(self.motor_a_in2, True) GPIO.output(self.motor_b_in3, False) GPIO.output(self.motor_b_in4, True) self.status['steerTo'] = 'reverse' print('Motor: {}'.format(self.status['steerTo'])) def turn_left(self): GPIO.output(self.motor_a_in1, True) GPIO.output(self.motor_a_in2, False) GPIO.output(self.motor_b_in3, False) GPIO.output(self.motor_b_in4, False) self.status['steerTo'] = 'left' print('Motor: {}'.format(self.status['steerTo'])) def turn_right(self): GPIO.output(self.motor_a_in1, False) GPIO.output(self.motor_a_in2, False) GPIO.output(self.motor_b_in3, True) GPIO.output(self.motor_b_in4, False) self.status['steerTo'] = 'right' print('Motor: {}'.format(self.status['steerTo'])) def pivot_left(self): GPIO.output(self.motor_a_in1, True) GPIO.output(self.motor_a_in2, False) GPIO.output(self.motor_b_in3, False) GPIO.output(self.motor_b_in4, True) self.status['steerTo'] = 'pivot_left' print('Motor: {}'.format(self.status['steerTo'])) def pivot_right(self): GPIO.output(self.motor_a_in1, False) GPIO.output(self.motor_a_in2, True) GPIO.output(self.motor_b_in3, True) GPIO.output(self.motor_b_in4, False) self.status['steerTo'] = 'pivot_right' print('Motor: {}'.format(self.status['steerTo'])) def main(gpio_mode=GPIO.BCM): motor_a_in1 = 11 motor_a_in2 = 7 motor_b_in3 = 13 motor_b_in4 = 15 sonar_trigger_left = 38 sonar_trigger_right = 35 sonar_echo_left = 40 sonar_echo_right = 37 GPIO.setmode(gpio_mode) status = mp.Manager().dict() # shared dictionary telemetry_left = mp.Manager().dict() telemetry_right = mp.Manager().dict() settings=dict() # static dictionary settings['distance_measure_time'] = 0.5 # sec. you should wait 50ms before the next trigger. settings['distance_announce_time'] = 1 # sec status['stop_ping']=False telemetry_left['distance']=None telemetry_right['distance']=None try: motor = Motor_Control(status, motor_a_in1, motor_a_in2, motor_b_in3, motor_b_in4) radar_left = Sonar_Ranger(sonar_trigger_left, sonar_echo_left, telemetry_left, status, settings) radar_right = Sonar_Ranger(sonar_trigger_right, sonar_echo_right, telemetry_right, status, settings) # Spawn child process for running measurement radarProcess_left = mp.Process(target=radar_left.run) radarProcess_left.daemon = True radarProcess_left.start() radarProcess_right = mp.Process(target=radar_right.run) radarProcess_right.daemon = True radarProcess_right.start() time.sleep(1) while True: radar_left.print_distance() radar_right.print_distance() ## ..robots brain.. if telemetry_left['distance'] < 15: if not status['steerTo'] == 'pivot_right': motor.pivot_right() elif telemetry_right['distance'] < 15: if not status['steerTo'] == 'pivot_left': motor.pivot_left() else: if not status['steerTo'] == 'forward': motor.forward() time.sleep(0.01) # lowers CPU usage except (KeyboardInterrupt, SystemExit): if radarProcess_left.is_alive(): radarProcess_left.terminate() elif radarProcess_right.is_alive(): radarProcess_right.terminate() GPIO.cleanup() if __name__ == '__main__': main(gpio_mode=GPIO.BOARD)
Dieses habe ich mit sudo python3 MotorTest.pyeinmal ausgeführt. Der Fehler bleibt jedoch bestehen. Der pivot_left funktioniert. Jedoch dreht sich beim pivot_right immer nur ein Rad. Eine Fehlermeldung aufgrund der Abänderung des brains ist nicht aufgetreten.
LG
Bastelstube
-
Eine Fehlermeldung aufgrund der Abänderung des brains ist nicht aufgetreten.
Wenn Ich deinen Code, unverändert, mit python3 ausführe kommt definitiv eine Fehlermeldung. Warum also nicht bei dir?
Eine Fehlermeldung kommt nur mit python2 nicht - das Script ist aber für python3 geschrieben.
Verstehst du jetzt wieso ich explizit sage das Du das Script falsch ausführst?
WENN bei Dir keine Fehlermeldung erscheint dann weil DU es mit python2 ausführst!!!!
-
Das wäre die Ausgabe zum Script:
Python
Alles anzeigenpi@raspberrypi:~ $ sudo python3 MotorTest.py Distance: 164.36 cm Distance: 102.22 cm Motor: forward Distance: 165.34 cm Distance: 104.05 cm Distance: 166.71 cm Distance: 107.57 cm Distance: 166.59 cm Distance: 107.67 cm Distance: 94.02 cm Distance: 174.00 cm Motor: pivot_left Distance: 97.38 cm Distance: 6.60 cm Distance: 165.95 cm Distance: 5.45 cm Distance: 97.69 cm Distance: 12.50 cm Motor: forward Distance: 165.88 cm Distance: 101.64 cm Motor: pivot_right Distance: 6.31 cm Distance: 88.09 cm Distance: 6.26 cm Distance: 92.22 cm Distance: 6.21 cm Distance: 166.12 cm Motor: forward Distance: 166.98 cm Distance: 85.00 cm Distance: 164.90 cm Distance: 85.60 cm ^CProcess Process-5: Traceback (most recent call last): File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap self.run() File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "MotorTest.py", line 90, in run time.sleep(self.settings['distance_measure_time']) KeyboardInterrupt pi@raspberrypi:~ $
Meinst du den mir nicht ersichtlichen Fehler in Zeile 90 ?
LG
Bastelstube
-
#push
-
- Offizieller Beitrag
Was ist noch mal dein Problem? Ich hab jetzt keine Lust 8 Seiten Thread zu lesen - In dem von dir posteten Code sehe ich keine Fehlermeldung, das ist normaler Output wenn man STRG+C drückt.
-
Das Ausgangsproblem ist, dass bei dem Code aus Beitrag #145 etwas nicht funktioniert, was sich meigrafd auch nicht erklären kann.
Zunächst einmal was passieren sollte:
Momentan habe ich zwei HC-SR04 Sensoren angebracht. Diese messen beide den jeweiligen Abstand. Wenn der linke Sensor nun merkt das die Distanz kleiner 15cm ist, so wird ein pivot_right()ausgeführt (Ein Rad dreht sich vorwärts und das andere Rückwärts). Das gleiche soll passieren, wenn der rechte Sensor merkt, dass die Distanz unter 15cm ist, dann soll ein pivot_left()ausgeführt.
Was passiert nun:
Es funktioniert immer nur eine Funktion. Wenn ich einen Gegenstand vor den rechten Sensor halte wird pivot_left()ohne Probleme ausgeübt. Mache ich das gleiche beim linken Sensor, so dreht sich immer nur ein Rad und das andere bleibt stehen.
Was wurde bisher unternommen:
- Sensoren getauscht um auszuschließen, dass einer defekt ist (negativ)
- Alles entkabelt und neu verkabelt (negativ)
- Neue Batterien in das Akkupack eingebaut (negativ)
- Funktionen im Code getauscht (negativ)
Nun zu dem was meigrafd meinte.
Laut Beitrag #144 habe ich das Scipt nicht mit python3 ausgeführt. Dies habe ich dann im Anschluss gemacht. Mir ist jedoch nicht ersichtlich welchen Fehler meigrafd meint, der beim ausführen mit python3 auftreten soll.
LGBastelstube
-
Tip/Bitte: Würdest Du a) Deinen Motorvariablen sprechendere Namen geben (z.B. "motor_links_vor" statt "motor_a_in1") und b) Deiner Klasse Sonar_Ranger einen Namen spendieren, so daß sie z.B. "Distanz links: xxx cm" ausgäbe, ließen sich Skript und Ausgabe sicher besser lesen.
Zur Fehlersuche:
- Lassen sich denn beide Motoren in beide Richtungen steuern, wenn Du die ganz Logik weglässt? Also einfach mal Hauptroutine durch "Motor links vorwärts" ersetzen und schauen, was passiert.
- Wenn das klappt, in der Hauptroutine alle Bewegungsmodi einzeln direkt aufrufen. Dann schauen, was passiert.
- nach dem Aufruf von radar_left.print_distance() auch noch telemetry_left['distance'] ausgeben, um sicher zu gehen, daß beides den gleichen Wert liefert.Mache ich das gleiche beim linken Sensor, so dreht sich immer nur ein Rad und das andere bleibt stehen.
Welches und in welche Richtung? Macht es einen Unterschied, in welcher Reihenfolge Du die Hand nach Programmstart vor die Sensoren hältst?
Funktionen im Code getauscht (negativ)
Was genau hast Du im Code "getauscht"? Mit welchem Ergebnis?
-
Hallo zusammen,
konnte mich nun lange Zeit nicht mehr dazu äußern, da ich momentan mitten im Studium bin. Das Projekt hat momentan auch ein wenig Stillstand dadurch und wird in den nächsten Wochen wahrscheinlich weiter voran getrieben. Dazu werde ich mich aber dann noch einmal äußern.
Momentan nur eine kleinere Zwischenfrage da ich mir nicht sicher bin.
Professionelle Mähroboter werden doch in C/C++ programmiert oder?
LG
Bastelstube
-
Professionelle Mähroboter werden doch in C/C++ programmiert oder?
Worauf zielt diese Frage ab bzw. wofür ist das relevant?
-
Professionelle Mähroboter werden doch in C/C++ programmiert oder?
Keine Ahnung, warum spielt das eine Rolle? Die Firmwares der meisten Consumerhardware sind proprietär, weswegen eben nicht bekannt ist, wie sie programmiert sind (ohne reverse Engineering). Es kann aber auch Assembler oder eine Hochsprache drin stecken.
-
Das hat mich einfach mal interessiert. Da ich mich des Öfteren mit den Geräten auseinandersetze was deren Funktionsweise betrifft und ich mich gefragt habe ob die alle in der selben Sprache programmiert werden oder es eine Inhouse Sprache ist.
LG
Bastelstube
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!