arduino避障小车阶段性开发
This commit is contained in:
44
LogBook.md
44
LogBook.md
@@ -76,4 +76,46 @@
|
||||
**后续影响与建议**:
|
||||
|
||||
* **首要任务是修正单片机固件的ACK发送逻辑**,确保与后端正确对接。
|
||||
* 在完成固件修改后,建议进行完整的MQTT通信测试,覆盖所有指令类型及其ACK流程。
|
||||
* 在完成固件修改后,建议进行完整的MQTT通信测试,覆盖所有指令类型及其ACK流程。
|
||||
|
||||
## 2025-05-24: 后端会话管理核心逻辑强化
|
||||
|
||||
**主要变更与决策:**
|
||||
|
||||
1. **明确用户充电请求流程与并发处理:**
|
||||
* 用户请求充电时 (`ChargingSessionController.requestCharging` -> `ChargingSessionServiceImpl.requestCharging` -> `assignRobotToSession`),系统会检查车位可用性、用户状态,并尝试分配空闲机器人。
|
||||
* **机器人分配机制**: `ChargingRobotServiceImpl.assignIdleRobot()` 负责查找空闲机器人并将其状态更新为 `MOVING` (或类似表示已分配的状态)。此操作与会话创建、车位预定、任务创建均在一个事务内。
|
||||
* **机器人繁忙处理**: 如果没有空闲机器人,`assignRobotToSession` 将返回 `null`,随后 `requestCharging` 方法会将此会话标记为 `CANCELLED_BY_SYSTEM` 并向用户抛出明确的"无可用机器人"或"机器人繁忙"的错误。**系统不会为此类请求创建等待执行的 `RobotTask`**,用户需稍后重试。这简化了后端的任务管理和状态维护。
|
||||
|
||||
2. **MQTT 指令发送与任务状态同步 (`MqttServiceImpl.sendCommand`):**
|
||||
* **任务预创建**: `sendCommand` 方法要求调用者 (如 `ChargingSessionServiceImpl`) 必须预先创建状态为 `PENDING` 的 `RobotTask`,并将任务ID (`associatedTaskId`) 传递给 `sendCommand`。
|
||||
* **机器人繁忙校验**: 在发送指令前,`sendCommand` 会调用 `RobotTaskServiceImpl.hasOtherPendingOrSentTask()` 检查目标机器人是否已有其他 `PENDING` 或 `SENT` 状态的任务(排除当前 `associatedTaskId`)。若是,则通常中止发送(`STOP_CHARGE` 指令除外,它具有优先权)。
|
||||
* **Payload 增强**: `sendCommand` 会自动向发送的MQTT JSON payload 中添加 `taskId` 字段,其值为 `associatedTaskId`。这有助于机器人端将ACK消息与特定任务关联。
|
||||
* **事务与数据一致性**: `sendCommand` 标记为 `@Transactional`。
|
||||
* MQTT消息成功发布后,会调用 `RobotTaskServiceImpl.markTaskAsSent()` 将对应任务状态从 `PENDING` 更新为 `SENT`。
|
||||
* 为确保数据一致性(避免MQTT已发送但任务状态更新失败),`RobotTaskServiceImpl.markTaskAsSent()` 方法已被修改:**在其无法成功将任务标记为 SENT(如任务不存在、原状态非PENDING、数据库更新失败)时,会抛出 `BusinessException`**。此异常会触发 `sendCommand` 所在事务的回滚,从而撤销MQTT发送(如果尚未实际完成网络传输)或至少确保数据库层面的一致性。
|
||||
|
||||
3. **会话状态流转与MQTT消息处理 (初步对齐):**
|
||||
* **"到达即充电"逻辑**: 当前遵循此简化逻辑。当 `MOVE_TO_SPOT` 任务成功被机器人ACK后,`ChargingSessionServiceImpl.handleRobotArrival()` 会直接将会话状态更新为 `CHARGING_STARTED`。
|
||||
* `MqttMessageHandler` 在收到机器人的状态回报(特别是包含 `taskId` 的ACK)后,会首先调用 `RobotTaskService` 更新任务状态,然后基于任务结果调用 `ChargingSessionService` 的相应方法来驱动会话状态的变更。
|
||||
|
||||
4. **兼容性考虑**:
|
||||
* 当前的修改重点在于增强后端逻辑的健壮性和数据一致性,同时尽量维持现有的MQTT消息JSON结构 (仅在payload中增加 `taskId`,这是一个向后兼容的增强) 和主要的业务流程,以避免对前端和单片机代码产生破坏性变更。
|
||||
* MQTT指令名称 (如 `MOVE` vs `MOVE_TO_SPOT`) 与 `CommandTypeEnum` 的映射关系需要在后端处理,以适应单片机固件的期望。
|
||||
|
||||
**后续关注点:**
|
||||
|
||||
* 详细实现 `ChargingSessionService` 中处理充电结束、取消、错误、超时的逻辑。
|
||||
* 设计和实现计费服务。
|
||||
* 确保 `MqttMessageHandler` 中对所有预期机器人回报的完整处理和对 `ChargingSessionService` 的正确调用。
|
||||
* 审阅并完善所有相关的 `@Transactional` 注解,确保事务边界和传播行为的正确性。
|
||||
|
||||
## YYYY-MM-DD (请替换为今天的实际日期)
|
||||
- 新建 Arduino Nano 循迹避障项目 `arduino_nano_tracker`。
|
||||
- 目标:实现单片机控制的循迹和避障功能。
|
||||
- 硬件配置:
|
||||
- TT 电机 x2 (PWM控制转速): 左电机引脚 9, 右电机引脚 10。
|
||||
- TRCT5000 循迹传感器 x2: 左传感器引脚 7, 右传感器引脚 8。
|
||||
- 超声波传感器 (HC-SR04): Trig 引脚 12, Echo 引脚 11。
|
||||
- 180度舵机 (SG90): 引脚 3。
|
||||
- 在 `arduino_nano_tracker/` 目录下创建了 `arduino_nano_tracker.ino` 文件,并包含基础的引脚定义和 `setup()`/`loop()` 结构。
|
||||
Reference in New Issue
Block a user