# 多车联动问题修复记录 对照产品源 `StandardMultiWheelLifterC/PilotDefinition.cs`,Tutorial `MultiWheelC` 中已修复或规避的问题如下。 ## 1. CenterTh 弧度/角度混用 | 项 | 说明 | |----|------| | **位置** | 产品源约 L534–536 | | **问题** | `Math.Sin(v.Th)` / `Math.Cos(v.Th)` 中 `v.Th` 为角度(deg),但 `Sin/Cos` 需要弧度,导致车队中心航向错误 | | **影响** | 自动/定位补偿模式下 fleet 中心朝向偏差,联动走形异常 | | **修复** | 改为 `Math.Sin(v.Th * Math.PI / 180.0)` | ## 2. 空 fleet 上调用 Average() | 项 | 说明 | |----|------| | **位置** | 产品源约 L531–535 | | **问题** | 主车在把自己写入 fleet **之前**对 `MultiVehicleFleet.Values` 求平均,早期 tick 可能为空 | | **影响** | 可能抛 `InvalidOperationException`,sync 线程崩溃 | | **修复** | 先写入主车自身,再 `Count > 0` 时才 Average | ## 3. 阻塞式 HTTP (.Result) | 项 | 说明 | |----|------| | **位置** | 产品源约 L484, L778, L802 | | **问题** | 50ms 循环内 `hc.GetStringAsync(...).Result` 阻塞,超时 2s | | **影响** | sync 线程卡顿,motion 与 notify 延迟累积 | | **修复** | 改为 `FireAndForgetRegister/Notify`,`ContinueWith` 记录失败 | ## 4. if(true)/if(false) 死分支 | 项 | 说明 | |----|------| | **位置** | 产品源约 L674–679 | | **问题** | fleet 数量门控与预对齐阶段被硬编码关闭 | | **影响** | 未齐套也 SendMotion;对齐逻辑永不执行 | | **修复** | 恢复 `fleetReady = Count == MultiVehicleFleetNum` 门控后再 SendMotion | ## 5. _accumulateTh 积分 dt 异常 | 项 | 说明 | |----|------| | **位置** | 产品源约 L547–550 | | **问题** | `_lastThTime` 初值为 `MinValue` 或 >1s 重置导致首帧/恢复后 dt 异常 | | **影响** | 手动编队转向突变或几乎不动 | | **修复** | 初始化 `_lastThTime = Now`,dt 上限 0.2s | ## 6. 主车 HTTP 通知自身 | 项 | 说明 | |----|------| | **位置** | 产品源约 L770–778 | | **问题** | notify 循环包含主车自己的 IP | | **影响** | 冗余自调用、handler 重入 | | **修复** | `ip == Conf.SimpleIp` 时 skip | ## 7. 从车覆盖全局 Conf | 项 | 说明 | |----|------| | **位置** | 产品源约 L585–596 | | **问题** | 从 notification 写回 `Conf.TestCarSyncTh` 等全局配置 | | **影响** | 网络数据污染本地配置,难以调试 | | **修复** | 使用局部变量 `syncTh/syncDistance/...`,不修改 `Conf` | ## 8. ChassisController API 名称/签名错误 | 项 | 说明 | |----|------| | **位置** | 产品源 `ChassisController.cs` L95–117 | | **问题** | 使用 `MultiVehicleGetCenterPos`(不存在)及 3 参 `MultiVehicleSendMotion` | | **影响** | 自动联动可能无法编译或静默失效 | | **修复** | 使用 `MultiVehicleGetFleetPos` + 5 参 `Action` | ## 9. VehicleSyncInfo JSON 反序列化 | 项 | 说明 | |----|------| | **位置** | 产品源 DTO 定义 | | **问题** | 只读字段 + 有参构造,Newtonsoft 默认难反序列化 | | **影响** | register/notify 解析失败 → HTTP 500 | | **修复** | 改为可写属性 + `[JsonProperty]`(见 `VehicleSyncModels.cs`) | ## 10. 手动联动未接线(产品层) | 项 | 说明 | |----|------| | **位置** | `StandardMultiWheelLifterM/Remote.cs`,`MultiWheelRemote.MultiVehicleModeChassisLogic` 为空 | | **问题** | `MultiVehicleManual*` LowerIO 从未被 M 插件赋值 | | **影响** | 遥控器无法驱动 fleet | | **修复** | Tutorial `MultiWheelM`:`FleetMode` 开关 + `MultiVehicleManual*` UpperIO 字段 | ## 11. MultiVehicleManualVy 未使用(产品源) | 项 | 说明 | |----|------| | **位置** | 产品源声明但未读 | | **问题** | 横移联动未实现 | | **Tutorial 状态** | 保留字段,当前手动模式仅 Vx + Vth;Vy 固定为 0 | ## 12. 产品源仍存在的已知限制(Tutorial 未改框架) - ~~激光两腿检测联动~~ → 已上移到 MDCSToolBox 接口;Tutorial 默认不启用检测,产品在插件内实现 `DetectNeighborBias` - `ClumsyLite` 与 Medulla share-object tag 的绑定机制依赖运行时 CartActivator 配置,需与 `startup.iocmd` 中 `SetShareObjectTag` 一致 ## 13. 同机多 Detour/Clumsy 串台(2026-06) | 项 | 说明 | |----|------| | **问题** | 写死 `DObject("DetourPos")`、Detour HTTP `127.0.0.1:4321`、同步 HTTP `:8008`,同 PC 双实例互相覆盖 | | **修复** | Detour `shareObjectTag` + Clumsy `soTag`;Clumsy `detourHost`/`detourPort`;`WebAPI.port` + `VehicleSyncInfo.Port`;主车端点 `MultiVehicleMasterEndpoint`(`ip:port`) | | **配置** | 见 `deploy/clumsy_agv*/clumsyconsole.json`、`detour.json` | ## 14. 车队中心取平均(2026-06) | 项 | 说明 | |----|------| | **问题** | 旧逻辑对全部车位姿取平均,且假设每台都有 Detour | | **修复** | 固定 slot 表 + 仅对 `PosAvailable` 车反推中心;有效车集合运行中可变 | | **位置** | `MultiWheelPilotDefinition.MultiVehicle.cs` → `TryInferFleetCenter` | ## 15. 同步引擎重复实现(2026-06) | 项 | 说明 | |----|------| | **问题** | Tutorial 与 `StandardMultiWheelLifterC` 各维护一套 register/notify/loop | | **修复** | 统一到 MDCSToolBox 基类 `InitMultiVehicleCoordination()`;子类仅配置 + `DetectNeighborBias` 重写 |