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
+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)])