贯通车队运行链并支持轨迹自动推导β

This commit is contained in:
2026-08-25 17:59:18 +08:00
parent 95c0b19a26
commit 17092c2766
37 changed files with 3632 additions and 37 deletions
+17 -3
View File
@@ -89,7 +89,7 @@ MovementTest / MotionPlanExecutor
`TrajectoryTrackingMovement` 默认从 `PilotDefinition.Conf` 读取车辆级参数,同时保留少量动作级覆盖字段;横向控制器可通过 `LateralControllerFactory` 替换,纵向控制器当前固定创建为 `PidLongitudinalController`
## 车队组件与尚未贯通的执行链
## 车队组件与首版运行链
```text
夹紧且静止时的成员世界位姿快照
@@ -109,13 +109,27 @@ MovementTest / MotionPlanExecutor
车队动作主要滚动方向β_fleet
→ FleetPreparationCoordinator(换算每车β_i并等待全员Ready)
→ FleetMemberAgent(本车停车准备、舵轮到位、激活、Execute/Stop
主车FleetCommand
→ IFleetTransport
→ 从车FleetMemberAgent
从车FleetMemberReport
→ IFleetTransport
→ 主车状态缓存 / FleetSafetySupervisor
FleetRuntime
├─ 主车:准备屏障 → 状态/安全 → FleetCoordinator → 本车执行/远端分发
└─ 从车:接收命令 → FleetMemberAgent → 本地看门狗 → 状态上报
```
`FleetLayoutCapture` 只负责固定布局的几何计算:车队原点X/Y取成员车体中心的算术平均,车队Yaw取主车Yaw,再把各成员世界位姿反变换为 `VehicleLayout.PoseInFleet`。它不读取通信或Detour,也不负责静止/夹紧确认、时间对齐和布局激活。
上述类目前是可以独立构造和测试的组件,并没有正式的车队任务运行入口把两条链串起来。缺少的外层需要负责布局原子激活、成员状态实际采集与时间对齐、准备/激活状态机、每周期协调、安全门控、成员命令分发、任务完成与取消。`FleetCoordinator` 生成零速或故障结果不等于实车已经停车;只有运行层把结果送到各车 `FleetMemberAgent.Execute()``Stop()` 后才会影响底盘
`Shared/Fleet/FleetProtocol.cs` 已定义最小任务命令和成员报告值类型,`IFleetTransport` 已把运行逻辑与无线串口或内存队列隔离;测试项目中的 `InMemoryFleetTransport` 只用于无通信硬件验证,不进入正式部署。`FleetSafetySupervisor` 在主车侧按成员报告接收时间、状态和故障锁存整队停车决定,`FleetMemberAgent.UpdateCommandWatchdog()` 在每辆车本地按命令有效期独立停车,避免通信中断时只依赖主车广播停止
实际部署为每车独立电脑,因此主车还需要状态/命令通信,从车需要本地命令超时看门狗。无线串口初始化可以后接,但消息契约、任务号、心跳/有效期和本地失联停车语义必须在运行层接入前明确
`MultiWheelC/Fleet/FleetRuntime.cs` 已贯通首版固定布局滚动任务:同一类型按 `selfVehicleId`/`leaderVehicleId` 区分角色;主车执行β准备、全员Ready、统一激活、状态缓存、安全判定、周期协调、本车直接执行和远端分发;从车执行任务/序列校验、舵轮准备、激活、速度命令、本地看门狗和状态上报。完成、通信/状态/成员故障和取消都会由运行层转换为本车停车及可达成员停止命令,失联成员最终由本地命令有效期兜底
当前端到端链路只通过测试项目的内存传输验证,尚未接入C层正式 `Movement/Experiment`、实际成员状态采集、无线串口和真实跨机时间换算。实际部署仍是每车独立电脑;主车也是普通成员,其本车命令不经传输层回环。无线实现不能改变已经定义的任务号、序列号、命令有效期和本地失联停车语义。
## 状态数据流
+17 -7
View File
@@ -112,24 +112,34 @@
- `PathTrackingContext` 只携带受控刚体的车体系速度、速度有效性、轨迹投影和周期控制量,不依赖 `VehicleState``FleetState`
- `PathTrackingCore` 集中实现投影连续性、保护/终点策略、曲率预瞄、横纵向控制和GCP分配;`ParkingGeometricController``FleetController` 分别组合该核心,负责各自的状态适配和输出边界,不通过继承复制控制流程。
- `FleetController` 第一版只闭环车队虚拟中心,并支持固定 `β_fleet`:实际纵向速度沿β投影,GCP结果从运动坐标系旋转到车队坐标系后形成车队原点处的 `FleetMotionCommand`;成员速度继续由 `FleetKinematics.Decompose()` 确定性分解。
- `FleetStateEstimator` 已根据固定 `FleetLayout` 和时间对齐目标时刻反算、融合车队中心,并输出每车 `FleetMemberLayoutError`;成员样本的实际采集和跨电脑时间处理仍属于外层接收链。
- `FleetCoordinator` 已串联状态估计、虚拟中心控制、布局误差警告区间内的统一速度缩放、刚体分解和 `FleetMemberCommandCorrector` 小范围纠偏;越过停止阈值时返回故障和零速成员命令,但尚无正式运行层把该结果送到实车
- `FleetPreparationCoordinator` 已按 `beta_i = beta_fleet - theta_i` 生成成员准备目标,并通过任务号和全员Ready形成统一激活屏障;`FleetMemberAgent` 已封装本车停车准备、舵轮到位确认、激活、命令校验和底盘执行。两者尚未接入同一个车队任务生命周期,也未接入跨电脑通信
- `FleetStateEstimator` 已根据固定 `FleetLayout` 和时间对齐目标时刻反算、融合车队中心,并输出每车 `FleetMemberLayoutError`当前第一版先做候选中心两两一致性检查,再对X/Y等权平均、对Yaw做圆周平均。正负候选偏差的公共分量进入车队中心,相对分量仍保留在成员布局误差中,不会因平均而消失。成员样本的实际采集和跨电脑时间处理仍属于外层接收链。
- `FleetCoordinator` 已串联状态估计、虚拟中心控制、布局误差警告区间内的统一速度缩放、刚体分解和 `FleetMemberCommandCorrector` 小范围纠偏;`FleetRuntime` 已把周期结果转换为本车直接执行和远端成员命令
- `FleetPreparationCoordinator` 已按 `beta_i = beta_fleet - theta_i` 生成成员准备目标,并通过任务号和全员Ready形成统一激活屏障;`FleetMemberAgent` 负责本车舵轮准备、激活、命令校验和底盘执行;`FleetRuntime` 将二者接入同一固定布局滚动任务生命周期
- 控制算法的可替换性继续由 `ILateralController``ILongitudinalController` 组合注入;状态源、通信、底盘发送和成员协调不进入纯核心。
- `MultiWheelC.Tests` 已覆盖8个Stanley前进/倒车符号场景、8个车队控制周期场景、6个布局采集场景和4个刚体分解场景;统一构建与打包通过。
### 16. 车队通信保持最小值契约,失联停车采用主车与本车双层保护
- `Shared/Fleet/FleetProtocol.cs` 只保存 `FleetCommand``FleetMemberReport`、枚举和协议常量,不绑定停车机器人控制器、串口实现或复杂消息类层次;无线字节帧和校验留在具体传输实现。
- `IFleetTransport` 是运行层唯一传输边界;当前 `InMemoryFleetTransport` 只在测试项目中模拟定向命令、广播和成员报告,后续无线实现替换该接口而不改车队算法。
- 主车 `FleetSafetySupervisor` 依据主车本地接收时间、成员状态和故障锁存整队停车决定;每辆车的 `FleetMemberAgent` 依据本机单调时间和命令有效期独立看门狗停车。`FleetRuntime` 已执行本车停止并向可达成员下发停止,两层保护仍不能互相替代。
- 同一 `FleetRuntime` 部署到所有车辆,角色由显式 `selfVehicleId``leaderVehicleId` 决定,不把固定车号硬编码为主车;主车也是成员,本车命令直接执行,不要求传输层回环。
## 已经确认但尚未实施
- 路线顺序:先完成单车闭环和停车功能验证,再正式实施多车通信、编队和协同控制。来源:`README.md`
- 当前多车的布局、状态估计、中心控制、刚体分解、成员纠偏、β准备屏障和本车执行代理均已有代码组件,但尚未形成可运行的多车链路。仍缺少车队任务运行入口、布局原子激活、成员状态实际采集/时间对齐、跨电脑通信、命令分发和可实际触发停车的安全执行链
- 转舵系统辨识应对四个轮组分别使用相同激励,输入采用实际差速转舵命令(`TotalDiff`或左右轮实际发送命令之差),输出采用实际舵角;若只用目标角到实际角,会把当前PID包含在闭环模型中,更换PID后该模型不能继续代表转舵机构。控制阶段优先保留四个独立PID实例和内部状态、共用一套参数,并依据四个健康轮组中最不利的动态设计稳定裕量;只有硬件健康且公共参数仍无法兼顾时,才评估配置化的逐轮小幅校准,不在代码中硬编码某个轮位特例
- 当前多车的固定布局滚动任务已形成内存通信可运行链路。仍缺少C层正式动作入口、布局原子激活、成员状态实际采集、跨机时间换算、公共世界坐标验证和无线传输实现。
- 单车 `MultiWheelC/StateEstimation` 继续负责Detour重复帧、跳变候选、轮速短时预测和任务坐标连续化;车队层不复制这套原始定位处理,只消费经过本车校验的成员状态,并负责跨车时间对齐、固定布局反算、成员一致性检查和中心融合。成员状态进入融合前仍必须确认处于同一公共坐标系;各车独立的 `_controlFromDetour` 连续化变换是否会造成跨车基准差异,属于通信/状态接收契约必须验证的事项。
- 第一版保留当前保守的等权车队中心融合;任务生命周期和内存零速运行链已经贯通。公共坐标系与主车时间轴语义确认并取得静止/低速双车日志后,再按数据增加车队历史预测、逐成员创新门控、健康降级和Huber等鲁棒加权;不在缺少Detour协方差时提前实现协方差加权或Covariance Intersection。
- 布局生命周期区分夹紧前后的语义:夹紧前的预设布局只用于引导车辆就位;车辆夹紧且静止后,应同步取得同一世界坐标系下的成员位姿,调用 `FleetLayoutCapture` 创建新的不可变布局,再由上层协调器原子激活。共同搬运期间的相对位姿变化属于状态误差,不能通过修改 `FleetLayout` 吸收;松开车辆后清除激活布局。实际数据采集和激活接口尚未实施。
- 多车共同搬运不能只闭环车队中心:整体位姿误差与成员相对布局误差必须分开估计和约束,否则成员误差可能相互抵消而使平均中心看似正确。
- 计划采用分层职责:车队控制器产生参考点 `FleetTwist`,分配层依据成员 `VehicleLayout` 计算每车真实车体系 `BodyTwist`,单车层继续负责β变换、GCP和本车四轮解算。
- 第一版采用确定性的虚拟刚体速度分配,不先引入QP/HQP:若成员在车队系中的固定布局为位置 `(x_i,y_i)`、朝向 `theta_i`,则成员中心在车队系中的速度为 `(Vx-omega*y_i, Vy+omega*x_i, omega)`,再通过 `R(-theta_i)` 转到本车体系后交给 `SendBodyTwist()`。QP/HQP只在需要同时调整车队参考速度、处理成员能力差异、松弛约束或严格任务优先级时再引入。
- “按状态最差车辆协调速度”第一步已经对成员相对布局误差实现警告阈值至停止阈值之间的统一速度缩放。成员报警、通信超时、夹紧异常、状态持续不可用等整队停车条件仍需由真实运行层统一执行;时间戳、心跳、命令有效期和从车本地超时停车属于第一版安全契约,延迟预测补偿可以后续增加。
- “按状态最差车辆协调速度”第一步已经对成员相对布局误差实现警告阈值至停止阈值之间的统一速度缩放。通信超时、状态不可用、成员故障和命令有效期已经进入运行链;成员报警/夹紧信号来源、可恢复降级策略和实车阈值仍待接入,延迟预测补偿可以后续增加。
- 虚拟车队使用固定在车队坐标系中的对称前后GCP,把横向控制结果转换成车队原点 `FleetTwist`;这些点不是物理轮轴,也不直接参与单车四轮解算。横向控制器与GCP到Twist转换必须使用同一控制点半径;具体车辆级配置值和实车验证仍待完成。
- 每辆成员车都应作为反馈来源,但反馈职责必须分层:成员Detour位姿用于融合车队整体位姿和检查相对布局,单车轮速/舵角用于确认命令执行偏差,电机电流、扭矩或力传感信息用于负载与内力监控。相对位姿接近目标并不能证明没有内力,因此不能只依靠刚性连接或位姿误差判断负载均衡。
- 第一版不把每车β作为复杂优化变量:`FleetController` 支持固定车队主要滚动方向 `beta_fleet`(如正常0°、斜行45°、横移90°)及其控制坐标转换;`FleetPreparationCoordinator` 按布局换算成员 `beta_i`并采用180°等效轴保持在方便的本地表示范围。β是单车执行坐标系,不改变刚体分配得到的真实车体系 `BodyTwist`,也不会让各车命令数值相同。当前缺的是把停车预对齐、全员Ready和统一激活接入真实运行链;只有出现复杂布局、整段方向变化、限位余量或频繁反号问题时,才增加轨迹级β候选搜索。
- 第一版不把每车β作为复杂优化变量:`FleetController` 支持固定车队主要滚动方向 `beta_fleet``FleetPreparationCoordinator` 按布局换算成员 `beta_i` 并采用180°等效轴`FleetRuntime` 已将停车预对齐、全员Ready和统一激活接入运行链。β是单车执行坐标系,不改变刚体分配得到的真实车体系 `BodyTwist`;只有出现复杂布局、整段方向变化、限位余量或频繁反号问题时,才增加轨迹级β候选搜索。
- 旧版参考项目采用固定双车布局:各车由 `carWorld ∘ layout⁻¹` 反推车队中心,再对位置和圆周航向求平均;路径控制器以该虚拟中心跟踪轨迹。同时它可按 `fleetTarget ∘ layout_i` 生成每车理想位姿,并叠加Detour布局纠偏和邻车两腿检测纠偏,因此并非只控制平均中心。来源:`原版停车机器人/parkingrobot/ClumsyPilot/PilotDefinition.cs``ChassisController.cs`
- 旧版 `SetOriginBias(layoutX, layoutY, layoutTh)` 是把各车真实轮子统一表达在车队虚拟坐标系中,属于固定编队布局变换。旧版联动显式区分常规、蟹行和绕车队中心旋转三类模式;蟹行角可由动作或遥控给出任意值(`FleetCrabWalk` 默认45°),并在运动前以零速度对齐舵轮、运行时使用180°等效和轮速反号,但没有根据整段轨迹和每车约束自主求解β的统一规划过程。给定简单蟹行动作时,它与新版固定β可能产生相同的实际轮子姿态和车辆运动。
- 旧版自动 `FleetCurveWalk``FleetCrabWalk` 会先以零速度下发初始GCP角,等待成员新鲜、布局正确、命令可行、舵轮到位和从车应用新序列后才开始运动;原地旋转通过 `RotateWheelsAligned``FleetMotionReleased` 做整队释放。普通手动入口仍有 `SendMotion` 本车舵轮未对齐时速度置零的门控,但不保证与自动动作相同的车队级同步屏障。
@@ -140,7 +150,7 @@
## 待评估
- 多车共同搬运时的车队参考点与固定GCP距离、任意成员布局、加权/异常值鲁棒车队位姿估计、队形误差闭环,以及 `FleetMotionCommand → 每车Twist2D` 的具体分配与限幅算法
- 多车共同搬运时的车队参考点与固定GCP距离、逐成员能力/命令可行性限幅,以及带时间预测和异常成员隔离的鲁棒车队位姿融合;当前任意成员布局、确定性刚体分解和小范围队形误差闭环已有第一版实现
- 确定性刚体分配验证完成后,再评估集中式单步QP/HQP:安全和刚体可行性应作为硬约束或更高层级,相对布局、中心跟踪、平滑与能耗依次降低优先级;严格HQP不能仅靠单个加权QP的大权重近似。短时域MPC及舵轮动态延迟预测属于更后续阶段。
- 负载共享和内力监控可用信号、阈值、降级与停车策略;当前项目尚未建立可确认的力/扭矩闭环。
- 正式轨迹规划层与 `Trajectory2D` 的接入格式;当前 `TestTrajectoryFactory` 仅用于实验。
+22
View File
@@ -47,6 +47,28 @@
该接口是纯几何计算,调用者必须在外部保证成员位姿处于同一世界坐标系,并完成夹紧、静止、数据新鲜度和时间对齐检查;布局的存储与原子激活也不属于该类。
## 车队通信与安全接口
`Shared/Fleet/FleetProtocol.cs` 只定义与具体无线模块无关的值类型:
- `FleetCommand`:任务号、主车命令序号、目标车号、命令类型、成员β、成员车体系速度、有效期和原因码。目标车号0表示广播。
- `FleetMemberReport`:车号、任务号、本车报告序号、来源采样时间、公共世界系位姿/速度、状态有效性、本地任务阶段、最近执行命令序号和故障码;它同时承担心跳和命令确认。
- `FleetCommandKind` 当前覆盖滚动准备、自转准备、激活、运动和停止;`FleetMemberState` 覆盖空闲、准备、就绪、活动和故障。
`MultiWheelC/Fleet/IFleetTransport.cs` 仅提供 `SendCommand``SendReport``TryReceiveCommand``TryReceiveReport`。它不负责串口初始化、字节序列化、任务/序列校验、安全判定或时钟同步;测试项目的 `InMemoryFleetTransport` 按车号路由FIFO消息,广播只送从车,主车本地命令由 `FleetRuntime` 直接执行。
时间语义分层:报告的 `SampleTimestampSeconds` 是来源车的采样时刻,真实跨机接收层必须换算到主车时间轴后才能用于 `FleetMemberStateSample` 对齐;`FleetMemberSafetyStatus.LastAcceptedReportTimeSeconds` 必须使用主车本地单调接收时间;`FleetMemberAgent` 的命令接收时间和截止时间必须使用本车本地单调时钟。Detour `tick` 不能直接替代这三类时间。
`FleetSafetySupervisor` 只在主车侧检查成员缺失、任务不一致、通信超时、状态不可用和故障,并锁存首个 `ShouldStop` 原因;它不直接操作底盘。`FleetMemberAgent.UpdateCommandWatchdog()` 是每车本地最后一道失联保护,活动状态下命令过期或本地时钟倒退会立即 `StopImmediately()` 并进入 `Faulted`。运行循环即使没有收到新命令也必须周期调用该方法。
### `FleetRuntime`
- 构造时传入本车ID、主车ID、`IFleetTransport`、本车 `FleetMemberAgent``IVehicleStateProvider`;本车ID等于主车ID时,还必须传入 `FleetPreparationCoordinator``FleetCoordinator``FleetSafetySupervisor`
- `StartRollingPlan(planId, layout, trajectory)` 只允许主车调用;成员准备β直接取自 `FleetCoordinator.MotionDirectionInFleetRadians`,避免准备方向与控制方向出现两份配置。
- `Update(currentTimeSeconds, deltaTimeSeconds)` 使用本机单调时间驱动准备超时、主车报告新鲜度和本地命令看门狗。主车缓存的远端报告采样时间必须已经换算到主车时间轴,当前运行层不会自行估计跨机时钟偏移。
- `Stop(reason)` 正常取消本车任务;主车同时广播当前任务停止。运行状态覆盖 `Idle``Preparing``Ready``Active``Completed` 和锁存的 `Faulted`
- 第一版公开启动入口只支持固定布局滚动轨迹;协议和从车执行器虽已保留 `PrepareSpin`,但整队自转尚无对应主车任务入口。
## 轨迹契约
文件:`MultiWheelC/Trajectory/`
+1
View File
@@ -109,6 +109,7 @@
- 代码已经记录控制周期分段耗时、请求/限速后GCP命令和四舵角;M层已有轮速/舵角诊断CSV。
- 差速转舵角速度前馈默认增益0.9,曲率预瞄默认0.15s/0.12m。
- 2026-08-19第六轮共9131个轨迹控制周期:周期中位数约31.24ms、P95约32.68ms、最大约59.44ms;控制计算总耗时中位数约0.12ms、P95约0.22ms。当前C层计算不是主要周期瓶颈,历史约110ms现象不应继续归因于控制算法计算量。
- 2026-08-25静止诊断确认:目标角和角速度前馈均为零时,右后轮仍可形成约1s量级的持续差速转舵往复;死区由0.1°增至0.5°后,另外三轮均停止输出,但一次自转模式切回正常模式后的右后轮仍在约-1.9°至+2.9°间振荡。约2°的瞬态偏差本身不能证明硬件故障,待定位对象是仅该轮不收敛的闭环动态差异;应先用降低公共比例增益的重复切换实验区分控制稳定裕量,再对四轮分别辨识延迟、增益、摩擦和方向不对称,明显离群轮组先排查编码器、机械间隙和低速驱动响应。
- 不同速度、载荷下的舵轮物理响应和前馈参数仍需按具体工况验证。
- CAN/MCU正常运行逻辑风险较高;除诊断外不应在没有明确方案和实车回退措施时修改。
+12 -9
View File
@@ -1,6 +1,6 @@
# 当前进展
更新日期:2026-08-24。这里只保存当前状态,不作为完整开发历史。
更新日期:2026-08-25。这里只保存当前状态,不作为完整开发历史。
## 已完成/已接入
@@ -21,7 +21,8 @@
- 停车控制参数集中到 `Configuration/PilotConfig.ParkingControl.cs`
- `PathTrackingContext` 已解除对单车 `VehicleState` 的依赖;`PathTrackingCore` 统一单车与车队的投影、保护/终点策略、横纵向控制和GCP分配,`ParkingGeometricController` 保留单车状态读取与实体命令执行职责。
- `MultiWheelC.Tests` 已提供不依赖实车的Stanley前进/倒车横向符号回归,8个场景通过;该项目不进入正式解决方案和打包脚本。
- `Shared/Fleet` 已加入不可变 `FleetLayout`、成员/车队命令模型确定性 `FleetKinematics``MultiWheelC/Fleet` 已具备 `FleetLayoutCapture``FleetStateEstimator`、固定 `β_fleet``FleetController``FleetMemberCommandCorrector``FleetCoordinator``FleetPreparationCoordinator``FleetMemberAgent`。这些组件覆盖布局采集、车队中心/成员误差估计、中心轨迹闭环、统一速度缩放、刚体分解、小范围成员纠偏、成员β准备屏障和本车命令执行边界,但尚未由正式车队任务运行入口贯通
- `Shared/Fleet` 已加入不可变 `FleetLayout`、成员/车队命令模型确定性 `FleetKinematics` 及最小 `FleetCommand`/`FleetMemberReport` 契约;`MultiWheelC/Fleet` 已具备布局采集、车队状态估计、固定 `β_fleet` 中心控制、统一速度缩放、刚体分解、小范围成员纠偏、成员β准备屏障和本车执行边界。
- 车队安全、通信边界和首版运行链已经贯通:`FleetRuntime` 按显式本车/主车ID执行主从分支,串联β准备屏障、全员激活、状态缓存、主车安全判定、周期协调、本车直接执行、远端分发、完成/取消和从车本地命令看门狗;`IFleetTransport` 隔离具体传输,测试项目提供不回环主车命令的内存实现。Fleet相关自动化测试共70个场景通过。
- 本次建立工作区/项目AGENTS导航和 `docs/` 按需知识库。
以上表示代码入口存在,不表示全部实车工况已经验收。
@@ -32,15 +33,16 @@
- 暂时冻结普通运动跳变阈值和30°/s、40°/s²自转参数,等待Detour接口语义后再决定是否实施自转结束后的条件化仅位置连续化或调整航向恢复策略。
- Detour对接最小问题已整理到 `docs/detour-information-checklist.md`,不要求取得源码。
- 验证非零β运动系,当前已有45°蟹行直线入口;曲线蟹行仍需设计实验。
- 多车共同搬运的核心算法和本车执行组件已基本具备,当前重点不再是增加孤立算法文件,而是建立完整车队任务运行链:布局激活→β准备→全员Ready→统一激活→周期状态估计与协调→安全门控→成员命令分发→完成/故障/取消。没有这层调用者时,`FleetCoordinator` 的零速输出或任何独立安全判定都不会自动让实车停车。QP/HQP不作为第一版前置条件。
- 多车共同搬运的固定布局滚动任务已在内存传输下完成端到端贯通。当前重点转为真实无线链路和工程接入:确认无线参数与帧格式,实现串口 `IFleetTransport`,接入公共坐标系成员状态和主车时间轴,再通过静止状态机与低速双车逐级验证。QP/HQP不作为第一版前置条件。
- 车队状态估计第一版保留“成员状态先经单车状态估计处理、车队层做时间对齐与刚体一致性检查、候选中心等权/圆周平均”的保守方案;暂不重复实现单车Detour跳变逻辑,也不在运行链和实车数据建立前加入复杂鲁棒优化。后续内部融合升级应尽量保持 `FleetStateEstimateResult``FleetState``MemberErrors` 外部接口不变。
- β在多车中定位为单车执行坐标系而非车队核心优化量:常规、斜行和横移动作先确定车队主要滚动方向,各车按布局朝向换算本地β,停车预对齐并经车队同步屏障统一释放。轨迹级β搜索只作为机械余量或复杂方向变化下的后续增强。
## 阻塞/待确认
- Clumsy/Medulla正式宿主、插件部署和配置持久化说明未纳入仓库。
- 完整停车业务流程和验收指标未确认。
- 多车通信协议、统一时间轴、成员状态实际采集方式、布局原子激活接口、刚体误差实车阈值、夹紧/报警状态来源和故障降级策略未确认;车队参考点和纯几何采集方法已经确定,运行布局应在夹紧后生成不可变快照并由上层整体激活
- 实际部署为每车独立电脑。主车需要成员状态接收和命令分发,从车必须具备本地命令超时停车;仅依赖主车广播停止不能覆盖通信中断场景
- 最小内存消息契约已经确定,但真实无线串口的端口参数、帧格式、序列化/校验和跨机时钟换算尚未实现;成员状态实际采集方式、布局原子激活接口、刚体误差实车阈值、夹紧/报警状态来源和故障降级策略仍待确认
- 各车经过独立 `_controlFromDetour` 任务坐标连续化后的位姿如何统一到同一公共车队坐标系仍待验证。车队参考点和纯几何采集方法已经确定,运行布局应在夹紧后生成不可变快照并由上层整体激活
- 最新实车实验数据对控制周期与舵轮滞后的结论尚未沉淀为可复核结果。
- Detour `l_step` 精确定义、显式重定位/坐标重置状态和部署端MDCS恢复策略待确认;当前不能把 `l_step<4` 当作唯一有效性条件。
- Detour `getCartLocation()` 的位姿坐标系、`tick` 采样/解算/发布语义、是否已有独立连续里程计或定位状态接口,以及部署版本和实际里程计/SLAM配置待确认。
@@ -53,7 +55,8 @@
2. 在Detour信息返回前不继续全局放宽状态估计边界,也不提高自转角速度/角加速度;现有偶发定位不可用保持安全停车。
3. 为轮组里程计自转CSV补充请求角度、内部积分角、完成/超时/手动停止原因,按固定目标角重复验证误差和重复性;绝对航向任务继续保留Detour模式,不用轮组积分冒充世界航向。
4. 为轨迹插值/投影、坐标变换、状态跳变候选和终点策略继续补充不依赖宿主的数学回归测试。
5. 先建立车队任务运行入口,把布局原子激活、`FleetPreparationCoordinator``FleetCoordinator` 和成员执行结果串成明确的生命周期;不要再增加没有运行消费者的独立安全判定器
6. 定义最小通信数据契约:成员状态、成员准备/执行状态、任务号、主车命令、心跳和命令有效期。无线串口初始化可后接,但运行层不能假设主车能直接调用另一台电脑上的 `FleetMemberAgent`
7. 接入成员状态实际来源和主车接收时间轴,形成 `FleetMemberStateSample[]`;再把 `FleetCoordinator` 输出按车号分发到各车 `FleetMemberAgent.Execute()`
8. 在真实执行链内实现安全门控:可恢复状态下持续下发零速并保留任务;硬故障时锁存任务失败、整队停止;每辆从车独立实现命令超时停车。随后补充无通信模拟的端到端测试,再进行低速双车实车验证
5. 确认无线模块的Windows COM端口、波特率、数据位、停止位、校验方式、收发模式和模块配置;定义带版本、长度、类型、任务/序列号及CRC的最小字节帧
6. 实现串口版 `IFleetTransport`,先只做主车心跳/命令和从车状态报告的静态通信测试,测量丢包、乱序、延迟和断线;不得绕过现有命令有效期与本车看门狗
7. 接入C层正式车队动作入口、成员状态实际来源和主车接收时间轴,保证 `FleetMemberReport` 位姿处于同一公共世界坐标系,远端采样时间已换算为主车时间后再形成 `FleetMemberStateSample[]`
8. 先验证静止布局建立、β准备、全员Ready、统一激活和停止,再进行空载低速双车直线与圆弧;共同搬运前补齐夹紧/报警输入和可立即停车措施
9. 记录各成员候选中心、数据年龄、状态来源、布局误差和减速/停车原因。只有数据证明当前等权融合频繁被单成员异常拖累时,再增加车队预测、逐成员门控和鲁棒加权。