Funktion zur Berechnung der minimalen und maximalen Distanz einer Probandenfahrspur zu einer Straße
Verfasst: Montag 16. September 2024, 11:26
Hallo alle zusammen,
ich bin gerade dabei eine Bachelorarbeit zu schreiben und dort brauche ich einen Python Code, der Diagramme erstellt, zur Auswertung von Daten. Mein Skript ist schon beinahe fertig, jedoch will ich noch eine Funktion implementieren, die den Punkt einer Fahrspur eines Probanden ausgibt, der minimale bzw. maximale Distanz von der Fahrspur eines Probanden bis hin zum linken Straßenrand ausgibt. Ich habe die Funktion bisher wie folgt implementiert:
def calculate_extremum(x_proband, y_proband, x_left_border, y_left_border, spurBreite):
# Resette die Indizes
max_distance_point = (None, None, None)
min_distance_point = (None, None, None)
x_proband = x_proband.reset_index(drop=True)
y_proband = y_proband.reset_index(drop=True)
x_left_border = x_left_border.reset_index(drop=True)
y_left_border = y_left_border.reset_index(drop=True)
# Berechne die euklidische Distanz zwischen Proband und linkem Straßenrand
distances = np.sqrt((x_proband - x_left_border)**2 + (y_proband - y_left_border)**2)
#distances_ideallinie = np.sqrt((x_proband - x_left_border)**2 + (y_proband - (y_left_border - spurBreite - 1/2*spurBreite))**2)
distances_ideallinie = y_proband - (y_left_border - spurBreite - 1/2*spurBreite)
# Berechne den Punkt mit der geringsten Distanz
min_distance_index = np.argmin(distances)
min_distance_point = (x_proband[min_distance_index], y_proband[min_distance_index], distances_ideallinie[min_distance_index])
# Finde die Punkte, wo der Probandengraph über dem linken Straßenrand liegt
over_left_border_mask = y_proband > y_left_border
if np.any(over_left_border_mask):
# Berechne die maximale Distanz nur für den Abschnitt über dem linken Straßenrand
over_left_distances = distances[over_left_border_mask]
over_left_distances_ideallinie = distances_ideallinie[over_left_border_mask]
over_left_x_proband = x_proband[over_left_border_mask]
over_left_y_proband = y_proband[over_left_border_mask]
max_distance_index = np.argmax(over_left_distances)
max_distance_point = (over_left_x_proband.iloc[max_distance_index], over_left_y_proband.iloc[max_distance_index], over_left_distances_ideallinie.iloc[max_distance_index])
# Finde die Punkte, die am nächsten an der rechten Straßenseite sind
max_all_distance_index = np.argmax(distances)
max_all_distance_point = (x_proband[max_all_distance_index], y_proband[max_all_distance_index], distances_ideallinie[max_all_distance_index])
if max_distance_point != (None, None, None):
return max_distance_point, max_all_distance_point
else:
return min_distance_point, max_all_distance_point
Leider ist dort das Problem, dass immer wieder die Distanz zwischen dem Punkt auf dem linken Straßenrand und dem Punkt auf der Probandenfahrspur senkrecht zur x Achse gemessen wird und nicht wie gewünscht die Krümmung der Straße miteinbezieht, denn es soll die Distanz aus der Sicht des Autofahrers berechnet werden, also wie viele Meter der linke Straßenrand noch entfernt ist.
x_proband und y_proband sind die x und y Koordinaten der Probandenfahrspur und x_leftBorder und y_leftBorder sind die x und y Koordinaten des linken Straßenrandes.
Wäre super, wenn mir dabei jemand helfen könnte die Funktion dementsprechend anzupassen, danke fürs Zeitnehmen schon mal.
Viele Grüße
Moritz
ich bin gerade dabei eine Bachelorarbeit zu schreiben und dort brauche ich einen Python Code, der Diagramme erstellt, zur Auswertung von Daten. Mein Skript ist schon beinahe fertig, jedoch will ich noch eine Funktion implementieren, die den Punkt einer Fahrspur eines Probanden ausgibt, der minimale bzw. maximale Distanz von der Fahrspur eines Probanden bis hin zum linken Straßenrand ausgibt. Ich habe die Funktion bisher wie folgt implementiert:
def calculate_extremum(x_proband, y_proband, x_left_border, y_left_border, spurBreite):
# Resette die Indizes
max_distance_point = (None, None, None)
min_distance_point = (None, None, None)
x_proband = x_proband.reset_index(drop=True)
y_proband = y_proband.reset_index(drop=True)
x_left_border = x_left_border.reset_index(drop=True)
y_left_border = y_left_border.reset_index(drop=True)
# Berechne die euklidische Distanz zwischen Proband und linkem Straßenrand
distances = np.sqrt((x_proband - x_left_border)**2 + (y_proband - y_left_border)**2)
#distances_ideallinie = np.sqrt((x_proband - x_left_border)**2 + (y_proband - (y_left_border - spurBreite - 1/2*spurBreite))**2)
distances_ideallinie = y_proband - (y_left_border - spurBreite - 1/2*spurBreite)
# Berechne den Punkt mit der geringsten Distanz
min_distance_index = np.argmin(distances)
min_distance_point = (x_proband[min_distance_index], y_proband[min_distance_index], distances_ideallinie[min_distance_index])
# Finde die Punkte, wo der Probandengraph über dem linken Straßenrand liegt
over_left_border_mask = y_proband > y_left_border
if np.any(over_left_border_mask):
# Berechne die maximale Distanz nur für den Abschnitt über dem linken Straßenrand
over_left_distances = distances[over_left_border_mask]
over_left_distances_ideallinie = distances_ideallinie[over_left_border_mask]
over_left_x_proband = x_proband[over_left_border_mask]
over_left_y_proband = y_proband[over_left_border_mask]
max_distance_index = np.argmax(over_left_distances)
max_distance_point = (over_left_x_proband.iloc[max_distance_index], over_left_y_proband.iloc[max_distance_index], over_left_distances_ideallinie.iloc[max_distance_index])
# Finde die Punkte, die am nächsten an der rechten Straßenseite sind
max_all_distance_index = np.argmax(distances)
max_all_distance_point = (x_proband[max_all_distance_index], y_proband[max_all_distance_index], distances_ideallinie[max_all_distance_index])
if max_distance_point != (None, None, None):
return max_distance_point, max_all_distance_point
else:
return min_distance_point, max_all_distance_point
Leider ist dort das Problem, dass immer wieder die Distanz zwischen dem Punkt auf dem linken Straßenrand und dem Punkt auf der Probandenfahrspur senkrecht zur x Achse gemessen wird und nicht wie gewünscht die Krümmung der Straße miteinbezieht, denn es soll die Distanz aus der Sicht des Autofahrers berechnet werden, also wie viele Meter der linke Straßenrand noch entfernt ist.
x_proband und y_proband sind die x und y Koordinaten der Probandenfahrspur und x_leftBorder und y_leftBorder sind die x und y Koordinaten des linken Straßenrandes.
Wäre super, wenn mir dabei jemand helfen könnte die Funktion dementsprechend anzupassen, danke fürs Zeitnehmen schon mal.
Viele Grüße
Moritz