Files
BQP/srcs/RobotNet10/RobotApp/RobotNet10.RobotApp/Services/State/RobotStateMachineUsageExample.md
2026-07-13 09:25:40 +07:00

6.8 KiB

H??ng d?n s? d?ng RobotStateMachine

Gi?i thi?u

RobotStateMachine là m?t singleton service qu?n lý tr?ng thái c?a mobile robot s? d?ng Hierarchical State Machine pattern v?i th? vi?n Appccelerate.StateMachine.

C?u trúc Hierarchical State Machine

Root States (C?p 1)

  • System: Tr?ng thái h? th?ng

    • Initializing: ?ang kh?i t?o
    • Standby: Ch? s?n sàng
    • Shutting_Down: ?ang t?t
  • Auto: Ch? ?? t? ??ng

    • Idle: R?nh r?i, s?n sàng nh?n l?nh
    • Executing: ?ang th?c hi?n nhi?m v?
      • Moving: ?ang di chuy?n
        • Navigation: ?i?u h??ng
        • Avoidance: Tránh ch??ng ng?i v?t
        • Approach: Ti?p c?n m?c tiêu
        • Tracking: Theo dõi m?c tiêu
        • Repositioning: ?i?u ch?nh v? trí
      • ACT: Th?c hi?n action
        • Docking: ?ang dock
        • Docked: ?ã dock
        • Charging: ?ang s?c
        • Undocking: ?ang undock
        • Loading: ?ang t?i hàng
        • Unloading: ?ang d? hàng
        • TechAction: Action k? thu?t
    • Paused: T?m d?ng
    • Canceling: ?ang h?y
    • Recovering: ?ang khôi ph?c
    • Remote_Override: ?i?u khi?n t? xa
  • Manual: Ch? ?? th? công

  • Service: Ch? ?? b?o trì

  • Stop: Tr?ng thái d?ng

  • Fault: Tr?ng thái l?i

Cách s? d?ng

1. ??ng ký Service (trong Program.cs)

// ??ng ký nh? Singleton
builder.Services.AddSingleton<RobotStateMachine>();

2. Kh?i t?o State Machine

public class RobotController
{
    private readonly RobotStateMachine _stateMachine;
    
    public RobotController(RobotStateMachine stateMachine)
    {
        _stateMachine = stateMachine;
        
        // Kh?i t?o state machine
        _stateMachine.Initialize();
        
        // Ho?c s? d?ng async
        await _stateMachine.InitializeAsync();
    }
}

3. Subscribe vào State Change Events

_stateMachine.StateChanged += (sender, e) =>
{
    Console.WriteLine($"State changed to: {e.NewState} via event: {e.EventType}");
};

4. Chuy?n ??i tr?ng thái

// Hoàn thành kh?i t?o -> chuy?n sang Standby
await _stateMachine.FireAsync(RobotEventType.InitializeCompleted);

// Chuy?n sang ch? ?? Auto
await _stateMachine.FireAsync(RobotEventType.EnterAuto);

// B?t ??u th?c hi?n nhi?m v?
await _stateMachine.FireAsync(RobotEventType.StartExecution);

// Pause nhi?m v?
await _stateMachine.FireAsync(RobotEventType.PauseExecution);

// Resume nhi?m v?
await _stateMachine.FireAsync(RobotEventType.ResumeExecution);

// Hoàn thành nhi?m v?
await _stateMachine.FireAsync(RobotEventType.CompleteExecution);

5. Ki?m tra tr?ng thái hi?n t?i

var currentState = _stateMachine.CurrentState;
var stateInfo = _stateMachine.GetStateInfo();
var isInitialized = _stateMachine.IsInitialized;

Ví d? lu?ng ho?t ??ng

Lu?ng kh?i ??ng robot

// 1. Kh?i t?o state machine
await _stateMachine.InitializeAsync();
// State: System -> Initializing

// 2. Hoàn thành kh?i t?o
await _stateMachine.FireAsync(RobotEventType.InitializeCompleted);
// State: System -> Standby

// 3. Chuy?n sang ch? ?? Auto
await _stateMachine.FireAsync(RobotEventType.EnterAuto);
// State: Auto -> Idle

Lu?ng th?c hi?n nhi?m v? di chuy?n

// 1. B?t ??u th?c hi?n
await _stateMachine.FireAsync(RobotEventType.StartExecution);
// State: Auto -> Executing -> Moving -> Navigation

// 2. Phát hi?n ch??ng ng?i v?t
await _stateMachine.FireAsync(RobotEventType.StartAvoidance);
// State: Auto -> Executing -> Moving -> Avoidance

// 3. Ti?p t?c navigation
await _stateMachine.FireAsync(RobotEventType.StartNavigation);
// State: Auto -> Executing -> Moving -> Navigation

// 4. Hoàn thành di chuy?n
await _stateMachine.FireAsync(RobotEventType.CompleteMoving);
// State: Auto -> Idle

Lu?ng th?c hi?n action (Docking & Charging)

// 1. B?t ??u th?c hi?n
await _stateMachine.FireAsync(RobotEventType.StartExecution);
// State: Auto -> Executing -> Moving

// 2. Chuy?n sang ACT
await _stateMachine.FireAsync(RobotEventType.StartACT);
// State: Auto -> Executing -> ACT -> Docking

// 3. Hoàn thành docking
await _stateMachine.FireAsync(RobotEventType.CompleteDocking);
// State: Auto -> Executing -> ACT -> Docked

// 4. B?t ??u s?c
await _stateMachine.FireAsync(RobotEventType.StartCharging);
// State: Auto -> Executing -> ACT -> Charging

// 5. Hoàn thành s?c
await _stateMachine.FireAsync(RobotEventType.CompleteCharging);
// State: Auto -> Executing -> ACT -> Docked

// 6. Undocking
await _stateMachine.FireAsync(RobotEventType.StartUndocking);
// State: Auto -> Executing -> ACT -> Undocking

// 7. Hoàn thành undocking
await _stateMachine.FireAsync(RobotEventType.CompleteUndocking);
// State: Auto -> Executing -> ACT -> Docking

// 8. Hoàn thành ACT
await _stateMachine.FireAsync(RobotEventType.CompleteACT);
// State: Auto -> Idle

X? lý Emergency Stop

// Khi ?ang th?c hi?n nhi?m v?
await _stateMachine.FireAsync(RobotEventType.EnterStop);
// State: Stop

// Gi?i phóng stop
await _stateMachine.FireAsync(RobotEventType.ReleaseStop);
// State: Auto (quay l?i tr?ng thái tr??c ?ó nh? History)

L?u ý quan tr?ng

  1. History Type:

    • System hierarchy s? d?ng HistoryType.None - không l?u tr?ng thái con
    • Auto hierarchy s? d?ng HistoryType.Deep - l?u toàn b? tr?ng thái con khi quay l?i
  2. Thread Safety: State machine là thread-safe, có th? g?i t? nhi?u thread

  3. Exception Handling: T?t c? các l?i khi fire event ??u ???c log và không throw exception

  4. Async Support: Nên s? d?ng các ph??ng th?c Async ?? tránh blocking thread

  5. Singleton Pattern: Service này nên ???c ??ng ký nh? Singleton ?? ??m b?o ch? có m?t instance duy nh?t

Tích h?p v?i VDA5050

public class VDA5050Handler
{
    private readonly RobotStateMachine _stateMachine;
    
    public void HandleOrder(Order order)
    {
        // Khi nh?n order m?i
        await _stateMachine.FireAsync(RobotEventType.StartExecution);
    }
    
    public void HandleInstantAction(InstantAction action)
    {
        switch (action.ActionType)
        {
            case "cancelOrder":
                await _stateMachine.FireAsync(RobotEventType.CancelExecution);
                break;
            case "pause":
                await _stateMachine.FireAsync(RobotEventType.PauseExecution);
                break;
        }
    }
    
    public string GetOperatingMode()
    {
        // Map state machine state to VDA5050 operatingMode
        return _stateMachine.CurrentState switch
        {
            RobotStateType.Auto => "AUTOMATIC",
            RobotStateType.Manual => "MANUAL",
            RobotStateType.Service => "SERVICE",
            _ => "SEMIAUTOMATIC"
        };
    }
}