This commit is contained in:
Đăng Nguyễn 2025-12-31 14:59:56 +07:00
parent 5c1851e92f
commit b7e7d70855
5 changed files with 33 additions and 28 deletions

View File

@ -134,6 +134,7 @@
</div>
@code {
[Parameter] public RobotMonitorDto? MonitorData { get; set; }
[Parameter] public bool IsConnected { get; set; }
@ -178,7 +179,7 @@
// Auto-follow robot
private bool AutoFollowRobot = false;
private void OnAutoFollowRobotChanged(bool value)
{
AutoFollowRobot = value;
@ -194,7 +195,7 @@
private const double MapImageOriginY = -20.0; // OriginY in world coordinates (meters)
private const double MapImageResolution = 0.1; // Resolution: meters per pixel
private const string MapImageUrl = "images/gara20250309.png";
private bool MapImageLoaded = false;
private double MapImageWidth = 0; // Width in world coordinates (meters)
private double MapImageHeight = 0; // Height in world coordinates (meters)
@ -233,11 +234,11 @@
try
{
var imageDimensions = await JS.InvokeAsync<ElementSize>("robotMonitor.loadImageAndGetDimensions", MapImageUrl);
// Convert pixel dimensions to world coordinates (meters)
MapImageWidth = imageDimensions.Width * MapImageResolution;
MapImageHeight = imageDimensions.Height * MapImageResolution;
if (MapImageWidth > 0 && MapImageHeight > 0)
{
MapImageLoaded = true;
@ -278,16 +279,17 @@
// Kích thước robot trong world coordinates (mét)
const double RobotWidthMeters = 0.606;
const double RobotLengthMeters = 1.106;
// Điều chỉnh kích thước dựa trên ZoomScale
// Tăng kích thước lên 1.5x để robot to hơn
double scaleFactor = 2 / ZoomScale; // Tăng kích thước hiển thị
scaleFactor = scaleFactor < 1 ? 1 : scaleFactor;
double width = RobotWidthMeters * scaleFactor;
double height = RobotLengthMeters * scaleFactor;
double x = -width / 2;
double y = -height / 2;
return (x, y, width, height);
}

View File

@ -116,7 +116,7 @@ public class HighPrecisionTimer<T>(int Interval, Action Callback, Logger<T>? Log
Thread.Start();
}
}
else throw new ObjectDisposedException(nameof(WatchTimer<T>));
else throw new ObjectDisposedException(nameof(HighPrecisionTimer<T>));
}
public void Stop()

View File

@ -1,5 +1,4 @@
using MudBlazor;
using RobotApp.Common.Shares.Dtos;
using RobotApp.Common.Shares.Dtos;
using RobotApp.Common.Shares.Enums;
using RobotApp.Interfaces;
using RobotApp.Services.Exceptions;
@ -9,7 +8,6 @@ using RobotApp.VDA5050.Order;
using RobotApp.VDA5050.State;
using System.Collections.Concurrent;
using System.Data;
using System.Xml.Linq;
using Action = RobotApp.VDA5050.InstantAction.Action;
namespace RobotApp.Services.Robot;
@ -31,7 +29,7 @@ public class RobotOrderController(INavigation NavigationManager,
public int LastNodeSequenceId => LastNode is null ? 0 : LastNode.SequenceId;
public (NodeState[], EdgeStateDto[]) CurrentPath => GetCurrentPath();
private const int CycleHandlerMilliseconds = 100;
private const int CycleHandlerMilliseconds = 200;
private WatchTimer<RobotOrderController>? OrderTimer;
private readonly Dictionary<string, Action[]> OrderActions = [];
@ -435,7 +433,7 @@ public class RobotOrderController(INavigation NavigationManager,
private EdgeStateDto[] SplitChecking(Node lastNode, Node nearLastNode, VDA5050.Order.Edge edge)
{
List<EdgeStateDto> pathEdges = [];
var splitStartPath = RobotPathPlanner.PathSplit([lastNode, nearLastNode], [edge], 0.1);
var splitStartPath = RobotPathPlanner.PathSplit([lastNode, nearLastNode], [edge], 0.5);
if (splitStartPath is not null && splitStartPath.Length > 0)
{
int index = 0;
@ -450,17 +448,31 @@ public class RobotOrderController(INavigation NavigationManager,
index = i;
}
}
for (int i = index; i < splitStartPath.Length - 1; i++)
if (edge.Trajectory is null || edge.Trajectory.Degree == 1)
{
pathEdges.Add(new()
{
StartX = splitStartPath[i].NodePosition.X,
StartY = splitStartPath[i].NodePosition.Y,
EndX = splitStartPath[i + 1].NodePosition.X,
EndY = splitStartPath[i + 1].NodePosition.Y,
StartX = splitStartPath[index].NodePosition.X,
StartY = splitStartPath[index].NodePosition.Y,
EndX = nearLastNode.NodePosition.X,
EndY = nearLastNode.NodePosition.Y,
Degree = 1,
});
}
else
{
for (int i = index; i < splitStartPath.Length - 1; i++)
{
pathEdges.Add(new()
{
StartX = splitStartPath[i].NodePosition.X,
StartY = splitStartPath[i].NodePosition.Y,
EndX = splitStartPath[i + 1].NodePosition.X,
EndY = splitStartPath[i + 1].NodePosition.Y,
Degree = 1,
});
}
}
}
return [.. pathEdges];
}

View File

@ -1,14 +1,5 @@
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RobotApp.Common.Shares;
using RobotApp.Hubs;
using RobotApp.Interfaces;
using RobotApp.Services.State;
using RobotApp.VDA5050.State;
using RobotApp.VDA5050.Type;
using RobotApp.VDA5050.Visualization;
using System.Text.Json;
namespace RobotApp.Services.Robot;

View File

@ -68,7 +68,7 @@ public class WatchTimerAsync<T>(int Interval, Func<Task> Callback, Logger<T>? Lo
Timer.Change(Interval, Timeout.Infinite);
}
}
else throw new ObjectDisposedException(nameof(WatchTimer<T>));
else throw new ObjectDisposedException(nameof(WatchTimerAsync<T>));
}
public void Stop()