- agv_path_planner.py: JSON 형식 맵 파일 지원 추가 * parse_map_json() 함수로 MapData.json/NewMap.agvmap 파싱 * RFID 정규화 및 별칭 지원 (007/7 등) * TP(터닝포인트) 기반 방향전환 알고리즘 검증 완료 - universal_pathfinder.py: 범용 패턴 기반 경로 탐색 * Q1-1, Q1-2, Q2-1, Q2-2 모든 시나리오 패턴 구현 * UniversalPathFormatter 방향전환 표기 수정 * 28개 테스트 케이스 중 20개 성공 (71.4%) - test_all_scenarios.py: 전체 테스트 케이스 검증 스크립트 * 4개 시나리오 × 7개 목표 = 28개 케이스 자동 검증 * 사용자 제공 정답과 비교 분석 - show_map_info.py: 맵 구조 분석 도구 * RFID 목록, 연결 정보, 갈림길 분석 * 노드 타입별 분류 및 통계 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from agv_pathfinder import AGVMap
|
|
|
|
def show_map_info():
|
|
"""맵 정보 출력: RFID 목록과 연결 정보"""
|
|
print("=== AGV 맵 정보 ===")
|
|
|
|
# 맵 로드
|
|
agv_map = AGVMap()
|
|
agv_map.load_from_file(r"C:\Data\Source\(5613#) ENIG AGV\Source\Cs_HMI\Data\NewMap.agvmap")
|
|
|
|
print(f"총 노드 수: {len(agv_map.nodes)}")
|
|
|
|
# RFID 목록 수집 및 정렬
|
|
rfid_nodes = []
|
|
for node in agv_map.nodes.values():
|
|
if node.rfid_id:
|
|
rfid_nodes.append((node.rfid_id, node))
|
|
|
|
# RFID 번호순으로 정렬
|
|
rfid_nodes.sort(key=lambda x: int(x[0]) if x[0].isdigit() else 999)
|
|
|
|
print(f"RFID 노드 수: {len(rfid_nodes)}")
|
|
|
|
# RFID 목록 출력 (10개씩 줄바꿈)
|
|
print("\n--- RFID 목록 ---")
|
|
rfid_list = [rfid for rfid, _ in rfid_nodes]
|
|
for i, rfid in enumerate(rfid_list):
|
|
if i % 10 == 0:
|
|
print() # 10개마다 줄바꿈
|
|
print(f"{rfid:>3}", end=" ")
|
|
print() # 마지막 줄바꿈
|
|
|
|
# 연결 정보 출력
|
|
print("\n--- RFID 연결 정보 ---")
|
|
for rfid, node in rfid_nodes:
|
|
# 노드 타입 정보
|
|
type_str = ""
|
|
if node.node_type == 2:
|
|
type_str = f"[Station/Buffer, DockDir:{node.dock_direction}]"
|
|
elif node.node_type == 3:
|
|
type_str = f"[Charger, DockDir:{node.dock_direction}]"
|
|
else:
|
|
type_str = f"[Type:{node.node_type}]"
|
|
|
|
# 연결된 노드들의 RFID 찾기
|
|
connected_rfids = []
|
|
for connected_node in node.connected_nodes:
|
|
connected_node_obj = agv_map.nodes.get(connected_node)
|
|
if connected_node_obj and connected_node_obj.rfid_id:
|
|
connected_rfids.append(connected_node_obj.rfid_id)
|
|
|
|
# RFID 번호순으로 정렬
|
|
connected_rfids.sort(key=lambda x: int(x) if x.isdigit() else 999)
|
|
connected_str = " -> ".join(connected_rfids) if connected_rfids else "없음"
|
|
|
|
print(f"RFID {rfid:>3} {type_str:<25} Pos:({node.position[0]:>4},{node.position[1]:>4}) -> {connected_str}")
|
|
|
|
# 갈림길(Junction) 정보
|
|
print("\n--- 갈림길 정보 (연결 노드 3개 이상) ---")
|
|
junctions = []
|
|
for rfid, node in rfid_nodes:
|
|
connection_count = len([n for n in node.connected_nodes if agv_map.nodes.get(n)])
|
|
if connection_count >= 3:
|
|
junctions.append(rfid)
|
|
|
|
print(f"갈림길 RFID ({len(junctions)}개): {', '.join(junctions)}")
|
|
|
|
# 특별 노드 분류
|
|
print("\n--- 노드 타입별 분류 ---")
|
|
chargers = []
|
|
stations = []
|
|
normal = []
|
|
|
|
for rfid, node in rfid_nodes:
|
|
if node.node_type == 3:
|
|
chargers.append(rfid)
|
|
elif node.node_type == 2:
|
|
stations.append(rfid)
|
|
else:
|
|
normal.append(rfid)
|
|
|
|
print(f"충전기 ({len(chargers)}개): {', '.join(chargers)}")
|
|
print(f"스테이션/버퍼 ({len(stations)}개): {', '.join(stations)}")
|
|
print(f"일반 노드 ({len(normal)}개): {', '.join(normal)}")
|
|
|
|
if __name__ == "__main__":
|
|
show_map_info() |