# AI Collaboration Guide / Hướng dẫn cho AI Agents ## 🤖 Welcome AI Agent! / Chào mừng AI Agent! Tài liệu này được thiết kế đặc biệt để giúp các AI agents (như bạn) hiểu nhanh dự án RobotNet10 và làm việc hiệu quả. **QUAN TRỌNG**: Đọc tài liệu này TRƯỚC KHI bắt đầu làm việc với dự án. ## 📋 Quick Context / Bối cảnh Nhanh ### Project Summary / Tóm tắt Dự án **What**: Mobile robot AMR fleet management system **Goal**: Manage multiple autonomous mobile robots following VDA 5050 standard **Components**: - **RobotApp**: Software runs on each robot (Ubuntu 22.04) - **FleetManager**: Central management system on factory server - **Communication**: MQTT broker with VDA 5050 protocol **Technology Stack**: - **.NET 10** (C#) - FleetManager và RobotApp - **Blazor Web App** (Web UI) - FleetManager dashboard - **MQTT** (MQTTnet library) - VDA 5050 communication - **SQL Server** - FleetManager database - **SQLite** - RobotApp local database - **VDA 5050** (v2.1.0) - Standard protocol (backward compatible with v2.0.0) - **VDMA LIF** - Map data standard ### Project Status / Trạng thái Dự án **Current Phase**: 📝 Documentation & Architecture Design **What exists**: - ✅ Project structure defined - ✅ Comprehensive documentation - ✅ Linux RT kernel prepared - ⏳ Source code implementation (NOT started yet) **What doesn't exist yet**: - ❌ RobotApp source code - ❌ FleetManager source code - ❌ Shared libraries - ❌ Tests - ❌ Database schemas **This means**: When implementing, you'll be creating NEW code, not modifying existing code. ## 🎯 Key Design Decisions / Quyết định Thiết kế Quan trọng ### 1. Why VDA 5050? - **Interoperability**: Work with third-party systems - **Standardization**: Clear protocol specification - **Industry adoption**: Widely supported ### 2. Why .NET/Blazor? - **Cross-platform**: Runs on Linux (robots) and Windows/Linux (server) - **Performance**: High-performance runtime - **Unified UI**: Blazor for both RobotApp and FleetManager web interfaces - **Strong typing**: C# type safety reduces bugs - **Ecosystem**: Rich libraries (MQTTnet, EF Core, etc.) ### 3. Why MQTT? - **Lightweight**: Low overhead for IoT/robotics - **Publish-Subscribe**: Perfect for 1-to-many communication - **QoS Levels**: Reliable message delivery - **VDA 5050 requirement**: Standard specifies MQTT ### 4. Architecture Pattern - **Clean Architecture**: Separation of concerns - **Dependency Injection**: Testable, maintainable code - **Async/Await**: Non-blocking I/O operations - **Repository Pattern**: Data access abstraction ### 5. FleetManager Core Modules FleetManager được tổ chức thành 7 core modules: 1. **Identity**: Authentication & Authorization (ASP.NET Identity, RBAC) 2. **MapEditor**: Map management theo VDMA LIF standard (shared library) 3. **RobotConnections**: MQTT connection management, heartbeat monitoring 4. **RobotManager**: Robot state, order, và action management 5. **TrafficControl**: Route calculation (A*), conflict detection & resolution 6. **ScriptEngine**: C# scripting engine cho custom behaviors (shared library) 7. **FleetManagerConfig**: Dynamic configuration management (runtime updates) **Important**: ScriptEngine và MapEditor là shared libraries được dùng bởi cả RobotApp và FleetManager. ## 📂 Code Organization Principles / Nguyên tắc Tổ chức Code ### Project Structure ``` srcs/ ├── RobotApp/ # Robot control application │ ├── Services/ # Business logic │ │ ├── Navigation/ # Navigation algorithms │ │ ├── VDA5050/ # VDA 5050 protocol handling │ │ └── Hardware/ # Hardware abstraction │ ├── Models/ # Data models │ ├── Controllers/ # API controllers (if needed) │ ├── Components/ # Blazor UI components │ └── Pages/ # Blazor pages │ ├── FleetManager/ # Fleet management system │ ├── Modules/ # Core modules │ │ ├── Identity/ # Authentication & Authorization │ │ ├── MapEditor/ # Map management (VDMA LIF) │ │ ├── RobotConnections/ # MQTT connection management │ │ ├── RobotManager/ # Robot state, order, action management │ │ ├── TrafficControl/ # Route calculation, conflict resolution │ │ ├── ScriptEngine/ # Script management, mission/task execution │ │ └── FleetManagerConfig/ # Dynamic configuration │ ├── Models/ # Data models │ ├── Data/ # EF Core DbContext (SQL Server) │ ├── Controllers/ # API controllers │ ├── Components/ # Blazor UI components │ └── Pages/ # Blazor pages │ └── Shared/ # Shared libraries ├── ScriptEngine/ # C# scripting engine (shared) ├── MapEditor/ # Map editor library (shared) ├── VDA5050/ # VDA 5050 models (shared) ├── MQTT/ # MQTT utilities └── Common/ # Common utilities ``` **Important Notes**: - **ScriptEngine** và **MapEditor** là shared libraries được dùng bởi cả RobotApp và FleetManager - **FleetManager** sử dụng **SQL Server** cho database - **RobotApp** sử dụng **SQLite** cho local database - **MQTT Broker** chạy trên service riêng, không phải trong FleetManager ### Naming Conventions **Interfaces**: ```csharp public interface IFleetCoordinator { } public interface IMissionPlanner { } public interface IVda5050Handler { } ``` **Services**: ```csharp public class FleetCoordinator : IFleetCoordinator { } public class MissionPlanner : IMissionPlanner { } ``` **Models** (VDA 5050 - match standard): ```csharp public class Order { } // Exactly as in VDA 5050 public class State { } // Exactly as in VDA 5050 public class Node { } // Exactly as in VDA 5050 ``` **Models** (Domain-specific): ```csharp public class Robot { } public class Mission { } public class Waypoint { } ``` ## 🔍 Important Patterns / Các Pattern Quan trọng ### 1. Dependency Injection **Always use constructor injection**: ```csharp public class FleetCoordinator : IFleetCoordinator { private readonly ILogger _logger; private readonly IMqttClient _mqttClient; private readonly IRepository _robotRepository; // ✅ Correct: Constructor injection public FleetCoordinator( ILogger logger, IMqttClient mqttClient, IRepository robotRepository) { _logger = logger; _mqttClient = mqttClient; _robotRepository = robotRepository; } } // ❌ Wrong: Don't use service locator pattern public class BadExample { public void DoSomething() { var service = ServiceLocator.Get(); // Don't do this } } ``` ### 2. Async/Await **All I/O operations must be async**: ```csharp // ✅ Correct public async Task PublishStateAsync(RobotState state) { var message = CreateMqttMessage(state); await _mqttClient.PublishAsync(message); } // ❌ Wrong: Blocking synchronous call public void PublishState(RobotState state) { var message = CreateMqttMessage(state); _mqttClient.PublishAsync(message).Wait(); // Don't do this } ``` ### 3. Repository Pattern **Abstract data access**: ```csharp public interface IRepository where T : class { Task GetByIdAsync(Guid id); Task> GetAllAsync(); Task AddAsync(T entity); Task UpdateAsync(T entity); Task DeleteAsync(Guid id); } public class Repository : IRepository where T : class { private readonly DbContext _context; private readonly DbSet _dbSet; public Repository(DbContext context) { _context = context; _dbSet = context.Set(); } public async Task GetByIdAsync(Guid id) { return await _dbSet.FindAsync(id); } // ... other implementations } ``` ### 4. VDA 5050 Message Handling **Always validate VDA 5050 messages**: ```csharp public class OrderProcessor { private readonly IVda5050Validator _validator; public async Task ProcessOrderAsync(Order order) { // 1. Validate against VDA 5050 spec var validationResult = _validator.ValidateOrder(order); if (!validationResult.IsValid) { _logger.LogError("Invalid order: {Errors}", validationResult.Errors); return false; } // 2. Check business logic if (!IsOrderFeasible(order)) { _logger.LogWarning("Order not feasible: {OrderId}", order.OrderId); return false; } // 3. Process order await ExecuteOrderAsync(order); return true; } } ``` ## 🚨 Critical Implementation Guidelines / Hướng dẫn Triển khai Quan trọng ### 1. VDA 5050 Compliance / Tuân thủ VDA 5050 **DO**: - ✅ Use exact field names from VDA 5050 specification - ✅ Follow sequence ID ordering (nodes: even, edges: odd) - ✅ Validate all messages against VDA 5050 schema - ✅ Handle all mandatory fields - ✅ Implement all required message types **DON'T**: - ❌ Change VDA 5050 field names (e.g., don't rename `orderId` to `OrderId`) - ❌ Skip message validation - ❌ Ignore optional fields that might be used by third-party systems **Example - Correct VDA 5050 Model**: ```csharp // ✅ Correct: Matches VDA 5050 exactly public class Order { [JsonPropertyName("headerId")] public long HeaderId { get; set; } [JsonPropertyName("timestamp")] public DateTime Timestamp { get; set; } [JsonPropertyName("version")] public string Version { get; set; } [JsonPropertyName("manufacturer")] public string Manufacturer { get; set; } [JsonPropertyName("serialNumber")] public string SerialNumber { get; set; } [JsonPropertyName("orderId")] public string OrderId { get; set; } [JsonPropertyName("orderUpdateId")] public long OrderUpdateId { get; set; } [JsonPropertyName("nodes")] public List Nodes { get; set; } [JsonPropertyName("edges")] public List Edges { get; set; } } // ❌ Wrong: Field names don't match VDA 5050 public class BadOrder { public long Id { get; set; } // Should be "headerId" public string OrderNumber { get; set; } // Should be "orderId" } ``` ### 2. MQTT Connection Management / Quản lý Kết nối MQTT **Implement reconnection logic**: ```csharp public class MqttService { private readonly IMqttClient _mqttClient; private bool _isReconnecting; public async Task ConnectAsync() { var options = new MqttClientOptionsBuilder() .WithTcpServer(_config.BrokerAddress, _config.Port) .WithClientId(_config.ClientId) .WithCleanSession(false) .WithKeepAlivePeriod(TimeSpan.FromSeconds(60)) .Build(); _mqttClient.DisconnectedAsync += async e => { if (_isReconnecting) return; _isReconnecting = true; _logger.LogWarning("MQTT disconnected. Reconnecting..."); await Task.Delay(TimeSpan.FromSeconds(5)); try { await _mqttClient.ConnectAsync(options); _logger.LogInformation("MQTT reconnected successfully"); } catch (Exception ex) { _logger.LogError(ex, "MQTT reconnection failed"); } finally { _isReconnecting = false; } }; await _mqttClient.ConnectAsync(options); } } ``` ### 3. Error Handling / Xử lý Lỗi **Use structured error handling**: ```csharp public async Task> CreateMissionAsync(MissionRequest request) { try { // Validate input if (request == null) return Result.Failure("Request cannot be null"); // Business logic var mission = await _missionPlanner.CreateMissionAsync(request); if (mission == null) return Result.Failure("Failed to create mission"); // Persist await _repository.AddAsync(mission); _logger.LogInformation("Mission created: {MissionId}", mission.Id); return Result.Success(mission); } catch (Exception ex) { _logger.LogError(ex, "Error creating mission"); return Result.Failure($"Error: {ex.Message}"); } } // Result class for clean error handling public class Result { public bool IsSuccess { get; set; } public T Data { get; set; } public string ErrorMessage { get; set; } public static Result Success(T data) => new Result { IsSuccess = true, Data = data }; public static Result Failure(string errorMessage) => new Result { IsSuccess = false, ErrorMessage = errorMessage }; } ``` ### 4. Logging Best Practices / Thực hành Log tốt ```csharp public class OrderProcessor { private readonly ILogger _logger; public async Task ProcessOrderAsync(Order order) { // ✅ Use structured logging with parameters _logger.LogInformation( "Processing order: OrderId={OrderId}, UpdateId={UpdateId}, Nodes={NodeCount}", order.OrderId, order.OrderUpdateId, order.Nodes.Count ); // ❌ Don't use string interpolation in logs // _logger.LogInformation($"Processing order: {order.OrderId}"); try { await ExecuteOrderAsync(order); _logger.LogInformation("Order completed: {OrderId}", order.OrderId); } catch (Exception ex) { // ✅ Include exception and context _logger.LogError(ex, "Failed to process order: OrderId={OrderId}", order.OrderId ); } } } ``` ## 📝 Common Tasks & Workflows / Nhiệm vụ & Quy trình Thường gặp ### Task 1: Implement a VDA 5050 Message Handler **Steps**: 1. Review VDA 5050 specification for the message type 2. Create/verify model in `Shared/VDA5050/Models/` 3. Create handler in appropriate project 4. Add validation logic 5. Implement business logic 6. Add unit tests 7. Add integration tests **Example**: ```csharp // 1. Model (in Shared project) public class Order { [JsonPropertyName("orderId")] public string OrderId { get; set; } // ... other fields } // 2. Handler (in RobotApp project) public interface IOrderHandler { Task HandleOrderAsync(Order order); } public class OrderHandler : IOrderHandler { private readonly ILogger _logger; private readonly IVda5050Validator _validator; private readonly INavigationController _navigation; public OrderHandler( ILogger logger, IVda5050Validator validator, INavigationController navigation) { _logger = logger; _validator = validator; _navigation = navigation; } public async Task HandleOrderAsync(Order order) { // Validate var validationResult = _validator.ValidateOrder(order); if (!validationResult.IsValid) { _logger.LogError("Invalid order: {Errors}", validationResult.Errors); return false; } // Process _logger.LogInformation("Handling order: {OrderId}", order.OrderId); await _navigation.ExecuteOrderAsync(order); return true; } } // 3. Register in Program.cs builder.Services.AddScoped(); ``` ### Task 2: Add New Service **Steps**: 1. Define interface in appropriate namespace 2. Implement service class 3. Add dependencies via constructor injection 4. Add unit tests 5. Register in DI container (Program.cs) 6. Use in other services/controllers **Example**: ```csharp // 1. Interface public interface IMissionPlanner { Task CreateMissionAsync(MissionRequest request); Task ValidateMissionAsync(Mission mission); } // 2. Implementation public class MissionPlanner : IMissionPlanner { private readonly ILogger _logger; private readonly IRouteOptimizer _routeOptimizer; public MissionPlanner( ILogger logger, IRouteOptimizer routeOptimizer) { _logger = logger; _routeOptimizer = routeOptimizer; } public async Task CreateMissionAsync(MissionRequest request) { // Implementation } public async Task ValidateMissionAsync(Mission mission) { // Implementation } } // 3. Register builder.Services.AddScoped(); ``` ### Task 3: Add Database Entity **Steps**: 1. Create model class in Models/ 2. Add DbSet to DbContext 3. Create migration 4. Apply migration 5. Create repository (if needed) 6. Add seed data (if needed) **Example**: ```csharp // 1. Model public class Robot { public Guid Id { get; set; } public string SerialNumber { get; set; } public string Manufacturer { get; set; } public RobotStatus Status { get; set; } public double? CurrentX { get; set; } public double? CurrentY { get; set; } public double? BatteryLevel { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } } // 2. DbContext public class FleetDbContext : DbContext { public DbSet Robots { get; set; } public DbSet Missions { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.SerialNumber).IsUnique(); entity.Property(e => e.SerialNumber).IsRequired().HasMaxLength(50); }); } } // 3. Create migration // dotnet ef migrations add AddRobotEntity // 4. Apply migration // dotnet ef database update ``` ## 🔍 When to Ask for Human Help / Khi nào Cần Hỏi Con người **Ask for clarification when**: - Requirements are ambiguous or conflicting - Multiple valid approaches exist (e.g., architectural decisions) - Security-sensitive decisions - Performance trade-offs - Budget constraints (e.g., cloud services) **You can decide independently**: - Naming conventions (follow established patterns) - Code organization (follow project structure) - Implementation details (algorithms, data structures) - Refactoring for code quality - Adding logging/error handling - Writing tests ## 🎓 Learning Resources for AI / Tài liệu Học cho AI **📚 Documentation Structure Note**: Tài liệu đã được tổ chức thành cấu trúc modular: - Mỗi module có file README.md tổng quan và các file chi tiết riêng - FleetManager: 7 module files trong `docs/fleetmanager/` - ScriptEngine: 9 module files trong `docs/ScriptEngine/` - MapEditor: 7 module files trong `docs/MapEditor/` - Luôn bắt đầu từ README.md của module để có overview, sau đó đọc các file chi tiết khi cần **Priority Reading Order**: 1. **This document** (you're here!) - Start here 2. [Architecture Overview](../architecture/README.md) - Understand system design 3. [FleetManager Documentation](../fleetmanager/README.md) - Core modules overview - [Identity Module](../fleetmanager/Identity.md) - Authentication & Authorization - [MapEditor Module](../fleetmanager/MapEditor.md) - Map management - [RobotConnections Module](../fleetmanager/RobotConnections.md) - MQTT management - [RobotManager Module](../fleetmanager/RobotManager.md) - Robot state & orders - [TrafficControl Module](../fleetmanager/TrafficControl.md) - Route & conflict resolution - [ScriptEngine Module](../fleetmanager/ScriptEngine.md) - Scripting integration - [FleetManagerConfig Module](../fleetmanager/FleetManagerConfig.md) - Configuration 4. [ScriptEngine Documentation](../ScriptEngine/README.md) - Shared scripting library - [Script Files](../ScriptEngine/ScriptFiles.md) - [Variables](../ScriptEngine/Variables.md) - [Tasks](../ScriptEngine/Tasks.md) - [Missions](../ScriptEngine/Missions.md) - [Extension APIs](../ScriptEngine/ExtensionAPIs.md) 5. [MapEditor Documentation](../MapEditor/README.md) - Shared map editor library - [VDMA LIF Standard](../MapEditor/VDMA_LIF_Standard.md) - [Database Design](../MapEditor/Database_Design.md) - [PathFinding](../MapEditor/PathFinding.md) 6. [VDA 5050 Integration](../vda5050/README.md) - Critical protocol details 7. [RobotApp Documentation](../robotapp/README.md) - Robot-side implementation 8. [Development Guide](../development/README.md) - Technical setup **When implementing**: - VDA 5050 spec: Official standard document - .NET docs: https://docs.microsoft.com/en-us/dotnet/ - MQTTnet: https://github.com/dotnet/MQTTnet ## ✅ Pre-Implementation Checklist / Checklist Trước Khi Code Before starting a task, verify: - [ ] I understand the requirement clearly - [ ] I've read relevant documentation - [ ] I know which project the code belongs to (RobotApp/FleetManager/Shared) - [ ] I understand the dependencies needed - [ ] I know the design patterns to follow - [ ] I understand VDA 5050 requirements (if applicable) - [ ] I know how to test the feature ## 🚀 Getting Started / Bắt đầu **First steps for a new AI agent joining the project**: 1. **Read this document completely** ✋ 2. **Scan architecture docs** for system understanding 3. **Review VDA 5050 docs** if working on protocol 4. **Check current project status** (see git commits, issues) 5. **Ask clarifying questions** if needed 6. **Start coding** following patterns above ## 💡 Pro Tips for AI Agents / Mẹo cho AI Agents 1. **Always validate VDA 5050 compliance** - This is critical for interoperability 2. **Use structured logging** - Makes debugging easier for humans 3. **Write async code** - All I/O should be non-blocking 4. **Follow naming conventions** - Consistency matters 5. **Add XML documentation** - Helps other AI and human developers 6. **Think about error cases** - Don't just code the happy path 7. **Consider scalability** - System will manage 100+ robots 8. **Security first** - Validate inputs, encrypt sensitive data 9. **Test your code** - Write unit tests 10. **Keep it simple** - Don't over-engineer ## 🤝 Collaboration with Humans / Cộng tác với Con người **Communication style**: - Be concise but complete - Explain technical decisions - Highlight trade-offs - Ask questions when uncertain - Provide examples **Code review expectations**: - Humans will review your code - Be open to feedback - Explain your reasoning - Learn from review comments ## 📞 Summary / Tóm tắt **Remember**: - 🎯 **Goal**: Build VDA 5050-compliant AMR fleet management system - 🏗️ **Tech**: .NET 10, Blazor Web App, MQTT, SQL Server (FleetManager), SQLite (RobotApp) - 📏 **Standards**: VDA 5050 v2.1.0 (critical!, backward compatible with v2.0.0), VDMA LIF, Clean Architecture, Async/Await - 📂 **Structure**: - RobotApp (on robot, SQLite) - FleetManager (on server, SQL Server) với 7 core modules - Shared libraries: ScriptEngine, MapEditor - ✅ **Quality**: Tests, logging, error handling, validation - 🔑 **Key Modules**: Identity, MapEditor, RobotConnections, RobotManager, TrafficControl, ScriptEngine, FleetManagerConfig **Your mission**: Write clean, maintainable, VDA 5050-compliant code that enables robots and fleet managers to communicate effectively. --- **Welcome to the team! Happy coding! 🤖✨** **Last Updated**: 2025-11-13 **Status**: Essential Reading for AI Agents **Version**: 2.0 (Updated with modular documentation structure and correct tech stack)