"refactor:Improve-map-loading-and-use-canvas-nodes"

This commit is contained in:
2025-12-14 22:55:09 +09:00
parent 764fbbd204
commit 3c8eae889c
13 changed files with 218 additions and 199 deletions

View File

@@ -292,7 +292,7 @@ namespace Project
// 만약 수행되지 않았다면 여기서 수행.
if (pathResult.DockingValidation == null)
{
pathResult.DockingValidation = AGVNavigationCore.Utils.DockingValidator.ValidateDockingDirection(pathResult, PUB._mapNodes);
pathResult.DockingValidation = AGVNavigationCore.Utils.DockingValidator.ValidateDockingDirection(pathResult, PUB._mapCanvas.Nodes);
}
// 검증 결과 확인

View File

@@ -60,11 +60,15 @@ namespace Project
//if (chg_run && PUB.AGV.system1.agv_run) PUB.Speak("이동을 시작 합니다");
VAR.BOOL[eVarBool.AGVDIR_BACK] = PUB.AGV.data.Direction == 'B';
var syncDir = PUB.AGV.data.Direction == 'B' ? AgvDirection.Backward : AgvDirection.Forward;
// [Sync] Update VirtualAGV Direction
var syncDir = PUB.AGV.data.Direction == 'B' ? AgvDirection.Backward : AgvDirection.Forward;
if (PUB._virtualAGV.CurrentDirection != syncDir)
PUB.UpdateAGVDirection(syncDir);
if (PUB._virtualAGV != null)
{
if (PUB._virtualAGV.CurrentDirection != syncDir)
PUB.UpdateAGVDirection(syncDir);
}
// [Sync] Update VirtualAGV State
AGVState syncState = AGVState.Idle;
@@ -72,7 +76,7 @@ namespace Project
else if (PUB.AGV.system1.Battery_charging) syncState = AGVState.Charging;
else if (PUB.AGV.system1.agv_run) syncState = AGVState.Moving;
if (PUB._virtualAGV.GetCurrentState() != syncState)
if (PUB._virtualAGV != null && PUB._virtualAGV.GetCurrentState() != syncState)
PUB.UpdateAGVState(syncState);
if (VAR.BOOL[eVarBool.AGV_ERROR] != (agv_err > 0))
@@ -156,9 +160,9 @@ namespace Project
case arDev.Narumi.DataType.TAG:
{
//자동 실행 중이다.
PUB.log.Add($"AGV 태그수신 : {PUB.AGV.data.TagNo}");
PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString();
PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString("0000");
PUB.log.Add($"AGV 태그수신 : {PUB.AGV.data.TagNo} LastTag:{PUB.Result.LastTAG}");
//POT/NOT 보면 일단 바로 멈추게한다
if (PUB.Result.CurrentPos == ePosition.POT || PUB.Result.CurrentPos == ePosition.NOT)
{
@@ -168,7 +172,7 @@ namespace Project
}
//virtual agv setting
var CurrentNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId.Equals(PUB.Result.LastTAG, StringComparison.OrdinalIgnoreCase));
var CurrentNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId.Equals(PUB.Result.LastTAG, StringComparison.OrdinalIgnoreCase));
if (CurrentNode == null)
{
//없는 노드는 자동으로 추가한다
@@ -184,10 +188,10 @@ namespace Project
};
// 맵 노드 리스트에 추가
PUB._mapNodes.Add(newNode);
PUB._mapCanvas.Nodes.Add(newNode);
// 캔버스에 노드 반영 (재설정)
PUB._mapCanvas.Nodes = PUB._mapNodes;
PUB._mapCanvas.Nodes = PUB._mapCanvas.Nodes;
// 로그 기록
PUB.log.AddI($"RFID:{PUB.Result.LastTAG} 노드를 자동 추가했습니다 (NodeId: {newNodeId})");
@@ -217,7 +221,7 @@ namespace Project
}
//이 후 상황을 예측한다
if (PUB._mapCanvas != null)
if (PUB._mapCanvas != null && PUB._virtualAGV != null)
{
var nextAction = PUB._virtualAGV.Predict();
var message = $"[다음 행동 예측]\n\n" +

View File

@@ -48,7 +48,7 @@ namespace Project
if (data.Length > 4)
{
var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1);
var node = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag);
var node = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == currTag);
if (node == null)
{
PUB.log.AddE($"[{logPrefix}-SetCurrent] 노드정보를 찾을 수 없습니다 RFID:{currTag}");
@@ -111,7 +111,7 @@ namespace Project
if (data.Length > 4)
{
var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1);
var targetNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag);
var targetNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == currTag);
//자동상태가아니라면 처리하지 않는다.
@@ -131,7 +131,7 @@ namespace Project
}
///출발지
var startNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == PUB._virtualAGV.CurrentNode.Id);
var startNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == PUB._virtualAGV.CurrentNode.Id);
PUB._virtualAGV.StartNode = startNode;
if (startNode == null)
{
@@ -150,7 +150,7 @@ namespace Project
{
//경로예측을 화면에 표시해준다.
PUB._virtualAGV.SetPath(rltGoto.result);
var pathWithRfid = rltGoto.result.GetSimplePath().Select(nodeId => PUB._virtualAGV.GetRfidByNodeId(PUB._mapNodes, nodeId)).ToList();
var pathWithRfid = rltGoto.result.GetSimplePath().Select(nodeId => PUB._virtualAGV.GetRfidByNodeId(PUB._mapCanvas.Nodes, nodeId)).ToList();
PUB.log.Add($"경로예측결과:{pathWithRfid}");
}
}
@@ -260,7 +260,7 @@ namespace Project
AGVNavigationCore.PathFinding.Planning.AGVPathfinder _advancedPathfinder = null;
(AGVNavigationCore.PathFinding.Core.AGVPathResult result, string message) CalcPath(MapNode startNode, MapNode targetNode)
{
var _mapNodes = PUB._mapNodes;
var _mapNodes = PUB._mapCanvas.Nodes;
// 시작 RFID가 없으면 AGV 현재 위치로 설정
if (startNode == null || targetNode == null)
return (null, "시작 RFID와 목표 RFID를 선택해주세요.");