Funktion zur Findung von Sensor Aufpunkten auf Racks implementiert. Dazu unittest.

This commit is contained in:
2025-05-14 15:49:17 +02:00
parent 1341142477
commit db8e8d351e
2 changed files with 110 additions and 29 deletions
+30 -22
View File
@@ -18,12 +18,12 @@ def graphbuild(d_racks_segments, d_rack_conn_points):
G.add_node(end) # Knoten für Endpunkt
G.add_edge(start, end) # Kante zwischen Start und Endpunkt
# 4. Verbindungen aus d_rack_conn_points hinzufügen
for connection, points in d_rack_conn_points.items():
for point in points:
# Wir fügen die Kante zwischen den Punkten der Verbindung hinzu
# Hinweis: Wir nehmen hier an, dass der Punkt von beiden Racks als Verbindungspunkt betrachtet wird
G.add_edge(point, point) # Verbindungspunkt als Kante
# # 4. Verbindungen aus d_rack_conn_points hinzufügen
# for connection, points in d_rack_conn_points.items():
# # Wir fügen die Kante zwischen den Punkten der Verbindung hinzu
# # Hinweis: Wir nehmen hier an, dass der Punkt von beiden Racks als Verbindungspunkt betrachtet wird
# G.add_edge(point, point) # Verbindungspunkt als Kante
@@ -41,13 +41,13 @@ class TestShapely(unittest.TestCase):
}
d_rack_conn_points = {
'Rack_2-0 + Rack_2-1': [Point(0.1, 3777.6)],
'Rack_2-1 + Rack_1-0': [Point(4946.5, 3777.6)],
'Rack_2-1 + Rack_4-0': [Point(2866.6, 3777.6)],
'Rack_2-1 + Rack_5-0': [Point(8866.1, 3777.6)],
'Rack_3-0 + Rack_1-0': [Point(4946.5, 15865.5)],
'Rack_3-0 + Rack_4-0': [Point(2866.6, 15865.5)],
'Rack_3-0 + Rack_5-0': [Point(8866.1, 15865.5)]
'Rack_2-0 + Rack_2-1': Point(0.1, 3777.6),
'Rack_2-1 + Rack_1-0': Point(4946.5, 3777.6),
'Rack_2-1 + Rack_4-0': Point(2866.6, 3777.6),
'Rack_2-1 + Rack_5-0': Point(8866.1, 3777.6),
'Rack_3-0 + Rack_1-0': Point(4946.5, 15865.5),
'Rack_3-0 + Rack_4-0': Point(2866.6, 15865.5),
'Rack_3-0 + Rack_5-0': Point(8866.1, 15865.5)
}
G = graphbuild(d_racks_segments, d_rack_conn_points)
@@ -70,18 +70,25 @@ class TestShapely(unittest.TestCase):
nodes = G.nodes
self.assertEqual(str(G.nodes), nodes_str)
self.assertEqual(str(G.edges), edges_str)
allids = NodeIDs(nodes)
ids = allids.get_ids(nodes)
for k,v in d_racks_segments.items():
allids.add_points(v)
for k,v in d_rack_conn_points.items():
allids.add_point(v)
#ids = allids.get_ids(nodes)
#cords = allids.get_points(ids)
self.assertEqual(len(ids), len(nodes))
# self.assertEqual(len(ids), len(nodes))
# self.assertEqual(cords,nodes_str)
# self.assertEqual(allids.get_point(1), Point(4946.5, 15865.5))
# 6. Optional: Visualisierung des Graphen
@@ -92,7 +99,8 @@ class TestShapely(unittest.TestCase):
#nx.draw(G, pos, with_labels=False, node_size=10, font_size=8)
#plt.show()
def test_easy(self):
pass
+80 -7
View File
@@ -68,7 +68,10 @@ class RackIDs():
def add_point_to_rack(self, point:Point, name:str):
pass
if point in self._point2rack:
self._point2rack[point].append(name)
else:
self._point2rack[point] = [name]
def get_racks_from_point(self, point:Point) -> list[str]:
return self._point2rack[point]
@@ -95,8 +98,7 @@ class RackIDs():
return True
else:
return False
class PointIndex2D:
def __init__(self):
@@ -196,6 +198,41 @@ def increase_circle(tol, tol_step, line, pt, rack_id, idx, other_rack_id, other_
break
radius += tol_step
def find_nearest_rack_from_sensor(max_dist, coarse_step, sensor:Point, racks:dict) -> tuple[Point, str]:
# 1. grobe Kandidatensuche
candidate_lines = []
radius = coarse_step
rack_lines = dict()
while radius <= max_dist:
circle = sensor.buffer(radius)
for r_name, pts in racks.items():
line = LineString([pts[0], pts[-1]]) #Linestring aus erstem und letzten Eintrag in Rack dict erzeugen
if circle.intersects(line):
candidate_lines.append((r_name, line))
if candidate_lines:
break
radius += coarse_step
if not candidate_lines:
return None, None
# 2. Feinbestimmung über Distanz
candidates_distance = [
(r_name, line, line.distance(sensor))
for r_name, line in candidate_lines
]
# Sortieren nach Abstand
candidates_distance.sort(key=lambda x: x[2])
'''# Theoretisch könnten mehrere ähnlich naheliegende Racks zurückgegeben werden.'''
r_best, line_best, _ = candidates_distance[0] # Hier wird nur das tatsächlich dem Senso nächste Rack gegriffen
# Aufpunkt bestimmen
nearest_point = line_best.interpolate(line_best.project(sensor))
return (nearest_point, r_best)
# === 3. Verbindungen suchen ===
@@ -357,12 +394,48 @@ class TestLinesweep(unittest.TestCase):
'Rack_2-1': [Point(0, 10), Point(5, 10)]}
allids = RackIDs(res_rack_seg)
point2rack = RackIDs(res_rack_seg)
self.assertEqual(allids.get_racks_from_point(Point(1, 0)), ["Rack_1-0", "Rack_2-0"])
self.assertEqual(allids.get_racks_from_point(Point(5, 6)), ["Rack_1-0"])
self.assertEqual(allids.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1, 8)])
self.assertEqual(point2rack.get_racks_from_point(Point(1, 0)), ["Rack_1-0", "Rack_2-0"])
self.assertEqual(point2rack.get_racks_from_point(Point(5, 6)), ["Rack_1-0"])
self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1, 8)])
def test_add_point_interim(self):
res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)],
'Rack_2-0': [Point(1, 8), Point(1, 0)],
'Rack_2-1': [Point(0, 10), Point(5, 10)]}
point2rack = RackIDs(res_rack_seg)
point2rack.add_point_to_rack(Point(1,4), "Rack_2-0")
self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1,4), Point(1, 8)])
def test_add_sensor(self):
rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
'Rack_2-0': [Point(10, -2), Point(10, 5)],
'Rack_2-1': [Point(0, 3), Point(10, 3)]}
sensors = {'Sens_1': Point(1, 1),
'Sens_2': Point(2, 4),
'Sens_3': Point(9, 2)}
point2rack = RackIDs(rack_segs)
sensor_points = {}
for s, p in sensors.items():
onpoint, rack_name = find_nearest_rack_from_sensor(2, 0.5, p, rack_segs)
sensor_points[s] = ( onpoint, rack_name)
point2rack.add_point_to_rack(onpoint, rack_name)
plist = point2rack.get_points_from_rack("Rack_1-0")
self.assertEqual(plist, [Point(0, 0), Point(0,1), Point(0, 10)])