Probleme bei meinem if/elif Konstrukt

Code-Stücke können hier veröffentlicht werden.
Antworten
alexis
User
Beiträge: 3
Registriert: Sonntag 25. Oktober 2015, 11:27

Sonntag 25. Oktober 2015, 11:57

Hi,
ich bin Anfänger in Python habe aber vorher schon mit Java, C++, Matlab "gespielt".
Im Zuge einer Vorlesung schreibe ich Codeabschnitte für einen selbstfahrenden Roboter. Das if-Konstrukt soll die Position von Zylinder in Scandaten finden. Dazu habe ich vorher die Ableitung aus den Scandaten ermittelt. Das Problem ist folgendes: Verwende ich den Code wie im Bild gezeigt dann wird der mittlere elif nie Aufgerufen, es werden zwar Zylinder gespeichert aber nicht an der richtigen Position. Wenn ich beim mittleren elif die Bedingung weglasse das die Ableitung zwischen -100 und 100 sein soll wird dieser aufgerufen aber der letzte elif wird nicht aufgerufen (die Zylinder werden nicht gespeichert). Ich hoffe ich konnte das Problem verständlich erklären. Irgendjemand eine Idee ?

Code: Alles auswählen

    for i in xrange(len(scan_derivative)):
        # --->>> Insert your cylinder code here.
        # Whenever you find a cylinder, add a tuple
        # (average_ray, average_depth) to the cylinder_list.
        if scan_derivative[i] < -100.0 and scan[i]>min_dist:
            on_cylinder = True
            sum_ray=0.0+i
            sum_depth=0.0+scan[i]
            rays=0+1
            print "hallo"
        elif on_cylinder == True and scan[i]>min_dist and scan_derivative < 100.0 and scan_derivative >-100.0:
            sum_ray=sum_ray+i
            sum_depth=sum_depth+scan[i]
            rays=rays+1
            print " guten Tag"
        elif on_cylinder == True and scan_derivative[i] > 100.0:
            average_ray = sum_ray/rays
            average_depth = sum_depth/rays
            print "tschüss"
            cylinder_list.append([average_ray, average_depth])
            on_cylinder = False 
Zuletzt geändert von alexis am Sonntag 25. Oktober 2015, 12:12, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 7772
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 25. Oktober 2015, 12:02

@alexis: Code postest Du am besten nicht als Bild, sondern innerhalb von code-Tags. Dann wird er auch schön formatiert.

Schau Dir mal an, welchen Typ "scan_derivative" hat und was Vergleichsoperationen auf diesem Typ bedeuten. Das for-x-in-range ist übrigens ein Anti-Pattern. In Python wird direkt über eine Liste iteriert, mit zip kann man das auch über mehrere gleichzeitig.
alexis
User
Beiträge: 3
Registriert: Sonntag 25. Oktober 2015, 11:27

Sonntag 25. Oktober 2015, 12:15

... scan_derivative... Danke manchmal sieht man den Wald vor lauter Bäumen nicht :roll:
Sirius3
User
Beiträge: 7772
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 25. Oktober 2015, 12:38

@alexis: irgendwie macht das mit dem average_ray und average_depth noch nicht wirklich Sinn. Auch scheinen die Bedingungen kompliziert verschachtelt zu sein. Wie hängen scan und scan_derivative zusammen? Wenn alles scan<min_dist und scan_dervative<-100 ignoriert werden soll, würde ich das ja zuerst filtern.
Ich komme dann bei ungefähr dem raus:

Code: Alles auswählen

from itertools import izip, ifilter, group_by, count
    
scan_iterator = izip(count(), scan, scan_derivative)
filtered = ifilter(lambda (_,s,d): s>min_dist and d>-100, scan_iterator)
grouped = group_by(filtered, lambda (_,_,d): d<100)
for _, scans in ifilter(lambda a,_: a, grouped):
    print "hallo"
    sum_ray = sum_depth = rays = 0
    for ray_num, scan_depth, _ in scans:
        sum_ray += ray_num
        sum_depth += scan_depth
        rays += 1
    average_ray = sum_ray/rays
    average_depth = sum_depth/rays
    print "tschüss"
    cylinder_list.append([average_ray, average_depth])
alexis
User
Beiträge: 3
Registriert: Sonntag 25. Oktober 2015, 11:27

Sonntag 25. Oktober 2015, 18:41

Ich hatte gerade 45 min an einer Beschreibung des Projektes gearbeitet und als ich auf Absenden geklickt habe musste ich mich neu einloggen und mein Beitrag war weg.
Also jetzt in Kurzfassung:
Danke für den Code ich probier mal ob es funzt.
Die Messdaten sind 660 Skalare die den Abstand angeben.
Der Sensor hat vereinzelt Fehlmessungen und zeigt für einen Punkt einen Abstand < 20 an.
Teilweise überschneiden sich zwei Zylinder darum das komplizierte if - Konstrukt.
Ein Zylinder kann minimal in der Entfernung variieren und an mehreren Messpunkten dedektiert werden, darum die Verwendung der Average-Werte
Ich bin Maschinenbaustudent und versteh deinen Code nicht wirklich :K
Mein Code oben macht keinen Sinn, ist auch nur ein Ausschnitt aus einer Funktion die Aufgerufen wird.
Antworten