Initial commit
This commit is contained in:
758
docs/ai-guide/README.md
Normal file
758
docs/ai-guide/README.md
Normal file
@@ -0,0 +1,758 @@
|
||||
# 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<FleetCoordinator> _logger;
|
||||
private readonly IMqttClient _mqttClient;
|
||||
private readonly IRepository<Robot> _robotRepository;
|
||||
|
||||
// ✅ Correct: Constructor injection
|
||||
public FleetCoordinator(
|
||||
ILogger<FleetCoordinator> logger,
|
||||
IMqttClient mqttClient,
|
||||
IRepository<Robot> robotRepository)
|
||||
{
|
||||
_logger = logger;
|
||||
_mqttClient = mqttClient;
|
||||
_robotRepository = robotRepository;
|
||||
}
|
||||
}
|
||||
|
||||
// ❌ Wrong: Don't use service locator pattern
|
||||
public class BadExample
|
||||
{
|
||||
public void DoSomething()
|
||||
{
|
||||
var service = ServiceLocator.Get<ISomeService>(); // 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<T> where T : class
|
||||
{
|
||||
Task<T> GetByIdAsync(Guid id);
|
||||
Task<IEnumerable<T>> GetAllAsync();
|
||||
Task<T> AddAsync(T entity);
|
||||
Task UpdateAsync(T entity);
|
||||
Task DeleteAsync(Guid id);
|
||||
}
|
||||
|
||||
public class Repository<T> : IRepository<T> where T : class
|
||||
{
|
||||
private readonly DbContext _context;
|
||||
private readonly DbSet<T> _dbSet;
|
||||
|
||||
public Repository(DbContext context)
|
||||
{
|
||||
_context = context;
|
||||
_dbSet = context.Set<T>();
|
||||
}
|
||||
|
||||
public async Task<T> 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<bool> 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<Node> Nodes { get; set; }
|
||||
|
||||
[JsonPropertyName("edges")]
|
||||
public List<Edge> 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<Result<Mission>> CreateMissionAsync(MissionRequest request)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Validate input
|
||||
if (request == null)
|
||||
return Result<Mission>.Failure("Request cannot be null");
|
||||
|
||||
// Business logic
|
||||
var mission = await _missionPlanner.CreateMissionAsync(request);
|
||||
|
||||
if (mission == null)
|
||||
return Result<Mission>.Failure("Failed to create mission");
|
||||
|
||||
// Persist
|
||||
await _repository.AddAsync(mission);
|
||||
|
||||
_logger.LogInformation("Mission created: {MissionId}", mission.Id);
|
||||
return Result<Mission>.Success(mission);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error creating mission");
|
||||
return Result<Mission>.Failure($"Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// Result class for clean error handling
|
||||
public class Result<T>
|
||||
{
|
||||
public bool IsSuccess { get; set; }
|
||||
public T Data { get; set; }
|
||||
public string ErrorMessage { get; set; }
|
||||
|
||||
public static Result<T> Success(T data) =>
|
||||
new Result<T> { IsSuccess = true, Data = data };
|
||||
|
||||
public static Result<T> Failure(string errorMessage) =>
|
||||
new Result<T> { IsSuccess = false, ErrorMessage = errorMessage };
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Logging Best Practices / Thực hành Log tốt
|
||||
|
||||
```csharp
|
||||
public class OrderProcessor
|
||||
{
|
||||
private readonly ILogger<OrderProcessor> _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<bool> HandleOrderAsync(Order order);
|
||||
}
|
||||
|
||||
public class OrderHandler : IOrderHandler
|
||||
{
|
||||
private readonly ILogger<OrderHandler> _logger;
|
||||
private readonly IVda5050Validator _validator;
|
||||
private readonly INavigationController _navigation;
|
||||
|
||||
public OrderHandler(
|
||||
ILogger<OrderHandler> logger,
|
||||
IVda5050Validator validator,
|
||||
INavigationController navigation)
|
||||
{
|
||||
_logger = logger;
|
||||
_validator = validator;
|
||||
_navigation = navigation;
|
||||
}
|
||||
|
||||
public async Task<bool> 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<IOrderHandler, OrderHandler>();
|
||||
```
|
||||
|
||||
### 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<Mission> CreateMissionAsync(MissionRequest request);
|
||||
Task<bool> ValidateMissionAsync(Mission mission);
|
||||
}
|
||||
|
||||
// 2. Implementation
|
||||
public class MissionPlanner : IMissionPlanner
|
||||
{
|
||||
private readonly ILogger<MissionPlanner> _logger;
|
||||
private readonly IRouteOptimizer _routeOptimizer;
|
||||
|
||||
public MissionPlanner(
|
||||
ILogger<MissionPlanner> logger,
|
||||
IRouteOptimizer routeOptimizer)
|
||||
{
|
||||
_logger = logger;
|
||||
_routeOptimizer = routeOptimizer;
|
||||
}
|
||||
|
||||
public async Task<Mission> CreateMissionAsync(MissionRequest request)
|
||||
{
|
||||
// Implementation
|
||||
}
|
||||
|
||||
public async Task<bool> ValidateMissionAsync(Mission mission)
|
||||
{
|
||||
// Implementation
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Register
|
||||
builder.Services.AddScoped<IMissionPlanner, MissionPlanner>();
|
||||
```
|
||||
|
||||
### 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<Robot> Robots { get; set; }
|
||||
public DbSet<Mission> Missions { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<Robot>(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)
|
||||
Reference in New Issue
Block a user