优化差速转舵并增加纵向辨识测试

This commit is contained in:
2026-08-27 12:39:22 +08:00
parent 17092c2766
commit 1c5181b327
24 changed files with 1748 additions and 266 deletions
+10 -2
View File
@@ -72,7 +72,8 @@
### 10. 对已观察的舵轮响应加入有限前馈与预瞄
- M层差速转舵角速度前馈已接入,当前默认增益0.9、速度上限0.03m/s;实现位于 `MotorRoutine.CalculateDiffSteerRateFeedforward()`
- M层差速转舵已实施四轮独立的到位迟滞与模型逆前馈:默认回退参数为公共纯P `Kp=0.0042`,到位逻辑为0.5°停止区、0.8°重启区、连续3周期确认;对象逆前馈按 `targetRate/687.06` 计算并经0.15s一阶滤波,独立限幅0.03m/s。两项功能各有默认关闭的独立开关,实车参考配置可显式启用;状态不在四轮之间共享。实现位于 `DiverCartDefinition``MotorRoutine.CalculateDiffSteerRateFeedforward()``UpdateDiffSteerSettlingState()`
-`DiffSteerRateFeedforwardGain` 不再作为模型逆前馈的物理参数;PID反馈与前馈分别限幅后相加,合成差速不再受PID的±0.3m/s阈值二次截断,最终八电机仍由M层既有发送阈值独立保护。
- Stanley曲率前馈预瞄已接入,当前车辆默认时间0.15s、最大距离0.12m。
- 两者均是可配置补偿,不替代底层PID、真实周期和机械响应验证。
@@ -125,10 +126,17 @@
- 主车 `FleetSafetySupervisor` 依据主车本地接收时间、成员状态和故障锁存整队停车决定;每辆车的 `FleetMemberAgent` 依据本机单调时间和命令有效期独立看门狗停车。`FleetRuntime` 已执行本车停止并向可达成员下发停止,两层保护仍不能互相替代。
- 同一 `FleetRuntime` 部署到所有车辆,角色由显式 `selfVehicleId``leaderVehicleId` 决定,不把固定车号硬编码为主车;主车也是成员,本车命令直接执行,不要求传输层回环。
### 17. 纵向辨识区分目标命令、实际发送命令和停车语义
- C层 `LongitudinalIdentificationTests.cs` 提供“速度阶跃与立即停车”和“速度阶跃与正常减速”两个入口,共用舵轮回正、定时命令、CSV记录、停止响应和异常停车流程,不经过Stanley或纵向PID。
- 初次辨识保持生产配置中的 `AccPerSecond/DeAccPerSecond` 固定;上层目标速度只作为参考,车辆对象辨识以M层最终 `SentSpeed*` 为输入、轮组反馈合成速度为输出,避免把已知速度斜坡误认为车辆本体迟滞。
- `SendBodyTwist(Twist2D.Zero)` 表示立即停车并绕过 `DeAccPerSecond`;正常减速实验必须持续发送零目标 `SendMotion`,让底盘内部发送速度按 `DeAccPerSecond` 逐周期下降。两类数据不能混为同一种制动响应。
- 第一轮先完成当前配置的正向重复实验,再依据数据决定是否补充倒车和加减速度参数A/B;辨识过程中不同时改变多个限幅或控制参数。
## 已经确认但尚未实施
- 路线顺序:先完成单车闭环和停车功能验证,再正式实施多车通信、编队和协同控制。来源:`README.md`
- 转舵系统辨识应对四个轮组分别使用相同激励,输入采用实际差速转舵命令(`TotalDiff`或左右轮实际发送命令之差),输出采用实际舵角;若只用目标角到实际角,会把当前PID包含在闭环模型中,更换PID后该模型不能继续代表转舵机构。控制阶段优先保留四个独立PID实例和内部状态、共用一套参数,并依据四个健康轮组中最不利的动态设计稳定裕量;只有硬件健康且公共参数仍无法兼顾时,才评估配置化的逐轮小幅校准,不在代码中硬编码某个轮位特例。
- 转舵系统辨识应对四个轮组分别使用相同激励,输入采用实际差速转舵命令(`TotalDiff`或左右轮实际发送命令之差),输出采用实际舵角;若只用目标角到实际角,会把当前PID包含在闭环模型中,更换PID后该模型不能继续代表转舵机构。当前主辨识流程固定用第一次实验作估计集、第三次实验作验证集,两者角度死区均为0.1°;第二次0.5°死区实验不进入主辨识,只保留作死区敏感性参考。控制阶段优先保留四个独立PID实例和内部状态、共用一套参数,并依据四个健康轮组中最不利的动态设计稳定裕量;只有硬件健康且公共参数仍无法兼顾时,才评估配置化的逐轮小幅校准,不在代码中硬编码某个轮位特例。当前15°/s参数由 `ParkingMaximumGcpAngleRateDegreesPerSecond` 配置并在 `GcpCommandExecutor` 中限制前后虚拟GCP目标,位于上述辨识对象上游,不进入“实际差速命令→实际舵角”模型;实施顺序确定为四轮对象辨识、公共反馈/前馈设计、舵角阶跃与斜坡验证、按最慢健康轮组留裕量设置GCP变化率,最后再用轨迹实验整定曲率预瞄和横向控制参数,不删除GCP变化率保护。
- 当前多车的固定布局滚动任务已形成内存通信可运行链路。仍缺少C层正式动作入口、布局原子激活、成员状态实际采集、跨机时间换算、公共世界坐标验证和无线传输实现。
- 单车 `MultiWheelC/StateEstimation` 继续负责Detour重复帧、跳变候选、轮速短时预测和任务坐标连续化;车队层不复制这套原始定位处理,只消费经过本车校验的成员状态,并负责跨车时间对齐、固定布局反算、成员一致性检查和中心融合。成员状态进入融合前仍必须确认处于同一公共坐标系;各车独立的 `_controlFromDetour` 连续化变换是否会造成跨车基准差异,属于通信/状态接收契约必须验证的事项。
- 第一版保留当前保守的等权车队中心融合;任务生命周期和内存零速运行链已经贯通。公共坐标系与主车时间轴语义确认并取得静止/低速双车日志后,再按数据增加车队历史预测、逐成员创新门控、健康降级和Huber等鲁棒加权;不在缺少Detour协方差时提前实现协方差加权或Covariance Intersection。
+5
View File
@@ -218,12 +218,15 @@ Vrear = (Vx, Vy - ωR)
输入是车体中心有符号平移速度模长、当前运动系中的虚拟前后GCP方向。前后GCP法线交点确定ICR;每个真实轮子使用其运动系位置计算切线舵角和半径速度比例。机械限位通过等效舵角/反向轮速解析,无法满足时返回失败原因。
`SendMotion` 对每个轮子的目标速度应用 `AccPerSecond/DeAccPerSecond` 斜坡;加速或减速的判据是目标速度绝对值相对当前发送速度绝对值增大或减小。`PredefinedDriveStop()` 直接清零发送速度,不经过该减速斜坡。
## 配置接口
- `PilotConfig` 是Clumsy运行配置模型;`[FieldMember]` 字段提供默认值和宿主显示/持久化元数据。
- `PilotDefinition.Conf` 是C层动作实际读取的运行配置对象。
- `MultiWheelC/Configuration/PilotConfig.ParkingControl.cs` 集中停车状态估计、Stanley、纵向PID、原地自转、舵轮准备、GCP与完成条件参数。
- 动作中的 nullable 覆盖字段用于特定动作段或测试;为空时使用车辆配置。车辆级限速和通用控制参数不应在普通实验中随意覆盖。
- 多舵轮底盘几何和 `MaxSpeed/AccPerSecond/DeAccPerSecond``MultiWheelChassisInitializer` 从宿主工作目录相对路径 `../chassis.json` 加载,并覆盖 `AbstractChassis` 的字段默认值;启动输出会打印最终加载值。当前实车参考副本 `参考文档/chassis参考.json``AccPerSecond=0.3m/s²``DeAccPerSecond=1.0m/s²`,但只有部署端实际命名和路径正确的 `chassis.json` 会影响运行。
- `参考文档/*.json` 是样例/实车复制资料;当前源码未发现这些JSON被 `PilotDefinition.Conf` 自动读取的入口。
运行时配置文件格式、位置和覆盖优先级由外部Clumsy宿主决定,当前仓库内待确认。
@@ -232,6 +235,8 @@ Vrear = (Vx, Vy - ωR)
- C层 `PilotDefinition` 和M层 `DiverCartDefinition` 使用 `[AsUpperIO]`/`[AsLowerIO]` 对齐夹臂命令、驱动使能、位置反馈和车号等字段。
- M层 `WheelSpeedDiagnosticLogger` 每次记录生成 `_can.csv``_snapshot.csv`:前者按CAN回调时刻保存八电机速度/位置与四舵角事件,后者按最多50Hz保存目标/实际舵角、目标角速度、PID/前馈/合成差速、限幅前后电机命令、速度/位置/电流反馈及各事件的本机单调时间、序号和数据年龄。MATLAB辨识时可使用 `TargetTh` 作为参考、`TotalDiff``Sent*` 作为执行输入、`ActualTh` 作为输出;左右轮公共/差速通道由方向统一后的左右命令和反馈在分析侧组合。
- C层纵向辨识复用 `TrackingExperimentRecorder` 保存目标 `CommandVx`、Detour位姿和轮组原始/滤波速度;M层诊断中的 `SentSpeed*` 才是经过底盘速度斜坡与最终限幅后的执行输入。正式辨识应一组C层CSV对应一组M层CSV,并以首个非零发送命令边沿对齐两套本机时间。
- `DiffSteerThresh` 通过 `PIDController.ChangeParameters()` 设置差速转舵PID的对称输出上限:例如配置0.3时,PID反馈项限制在[-0.3,+0.3]m/s。`MotorRoutine.UpdateDiffSteerWheelSpeeds()` 先将该反馈项与独立限幅的角速度前馈相加,再按左轮减、右轮加叠加到基础轮速;合成差速不会再次受 `DiffSteerThresh` 限制。最终八个单轮命令还会在 `MCURoutine` 中分别受 `SendThresSpeed` 限制。因此当前前馈增益为0、基础轮速为0且 `SendThresSpeed` 不低于0.3m/s的静止模式切换实验中,配置 `DiffSteerThresh=0.3` 可视为实际转舵差速的±0.3m/s上限;车辆行驶或重新启用前馈时,不能把它误当作每个电机最终总速度的唯一上限。
- `DiverCartDefinition.CommunicationInit()` 默认通过Windows `COM4``1,000,000 baud` 打开MCU桥;`MCUPort` 是可配置初始化参数。
- MCU内部配置为逻辑端口0CAN `500,000 bit/s`;逻辑端口13:串口 `9,600 bit/s``MCURoutine.BatteryPortIndex = 3` 指MCU桥逻辑端口,不等同于Windows `COM3`
- CAN命令/反馈范围集中在 `MCURoutine.cs`:驱动命令 `0x2010x20A`,速度/位置反馈 `0x2810x28A`,状态 `0x1810x18A`,舵角 `0x18B0x18E`,远程帧 `0x7010x70A`
+6 -1
View File
@@ -107,9 +107,14 @@
### 控制周期和舵轮响应
- 代码已经记录控制周期分段耗时、请求/限速后GCP命令和四舵角;M层已有轮速/舵角诊断CSV。
- 差速转舵角速度前馈默认增益0.9曲率预瞄默认0.15s/0.12m。
- 差速转舵角速度前馈实现仍保留0.03m/s独立限幅,但当前源码默认增益为0,作为对象辨识基线;曲率预瞄默认0.15s/0.12m。
- 历史轨迹实验所称“约0.46s延迟”是 `TargetTh``ActualTh` 连续曲线的最佳时间平移量,反映当时工况下的等效跟随滞后,并非命令下发后等待0.46s才开始转动的纯死区时间,也不是任意目标角的固定到位时间。它与旧纯P近似模型约0.49s的90%响应时间数值接近,但两者指标不能等同;后续应分别报告目标变化至首次运动的启动时间、10%~90%上升时间、进入规定角差的稳定时间和连续曲线相位滞后,并在控制器或工况改变后重新测量。
- 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°的瞬态偏差本身不能证明硬件故障,待定位对象是仅该轮不收敛的闭环动态差异;应先用降低公共比例增益的重复切换实验区分控制稳定裕量,再对四轮分别辨识延迟、增益、摩擦和方向不对称,明显离群轮组先排查编码器、机械间隙和低速驱动响应。
- 舵轮辨识数据共有三次物理实验:第一次为Kp=0.0035、死区0.1°、前馈0、约49.6V;第二次为Kp=0.003、死区0.5°、前馈0、约49.5~49.6V,因Kp和死区同时变化而排除在主辨识之外;第三次为重新采集的Kp=0.003、死区0.1°、前馈0,电压中位数约52.0V、范围约51.354.7V。`data_process/系统辨识实验-舵轮延迟/prepare_steering_iddata.m` 当前明确以第一次为Est、第三次为Val,因此“第二个处理批次”是第三次物理实验,不能与第二次0.5°实验混称。第一次与第三次统一了死区但电压不同,不是严格的仅Kp变化A/B实验,验证结果需要同时考虑供电、负载和机械状态差异。
- 第三次验证数据中RR、尤其RRL通道被初步观察到低速跟随偏弱、电流升高及随后突发运动;该现象尚需用原始snapshot与CAN事件时间线复核。在复核前不应用该轮的异常验证结果调整全车公共PID,也不应据此否定LF/LR/RF的正常辨识结果。
- 2026-08-27静止模式切换A/B表明,在公共 `Kp=0.0042` 不变时,同时启用0.5°/0.8°/3周期到位迟滞和0.15s模型逆前馈后,约69°、90°和20.85°动作的 `t90` 分别约缩短17%、18%和44%,进入±2°时间约缩短22%、19%和45%,最大超调也有所下降;当前数据缺少“只启用迟滞、关闭前馈”组,因此不能把总改善严格拆分到单项功能。
- 同批日志显示M层差速转舵周期中位数约49.6ms,3个稳定周期在实车上约150ms而不是按75ms估算的225ms;到位停止区使末端误差中位数上升到约0.4°,并仍存在少量轮组0.8~1.6°未完全收敛样本,后续参数调整应以重复实车数据为依据。
- 不同速度、载荷下的舵轮物理响应和前馈参数仍需按具体工况验证。
- CAN/MCU正常运行逻辑风险较高;除诊断外不应在没有明确方案和实车回退措施时修改。
+5 -1
View File
@@ -1,6 +1,6 @@
# 当前进展
更新日期:2026-08-25。这里只保存当前状态,不作为完整开发历史。
更新日期:2026-08-27。这里只保存当前状态,不作为完整开发历史。
## 已完成/已接入
@@ -16,6 +16,8 @@
- Detour单帧航向异常已增加连续帧/短时预测确认;第六轮实车数据确认前两帧异常由轮组Vw预测承接,持续到第三个异常新帧时才安全终止。
- 原地自转已增加 `RelativeWheelOdometry` 模式和不依赖Detour的 `TryGetWheelTwist()` 接口;第七轮19份记录中17份表现为正常停车回正,轮组积分与Detour原始航向变化绝对差中位数约0.89°、最大约3.07°,但目标角精度尚缺专用字段正式验收。
- C层轨迹/周期CSV与M层轮速/舵角诊断记录。
- M层差速转舵已加入默认关闭、可独立回退的四轮到位迟滞和模型逆前馈;当前实车参考配置采用公共纯P `Kp=0.0042`、0.5°/0.8°/3周期到位判断及 `687.06/0.15s/0.03m/s` 逆前馈参数,首轮模式切换A/B已确认响应时间和超调整体改善。
- C层已新增两个不经过轨迹控制器的纵向辨识入口:速度阶跃后立即停车,以及速度阶跃后按 `DeAccPerSecond` 正常减速;复用现有C层CSV并要求同步开启M层 `SentSpeed*` 诊断。
- C层Detour静态诊断入口,记录源时间、`l_step`、位姿帧差和轮组静态反馈;已有约14分41秒实车静态基线。
- C层轨迹CSV已补充原始/滤波轮组 `Vx/Vy/Vw`、轮组与预测时刻、Detour帧间隔、实际/允许创新、候选原因、估计器状态和不可用原因。
- 停车控制参数集中到 `Configuration/PilotConfig.ParkingControl.cs`
@@ -36,6 +38,7 @@
- 多车共同搬运的固定布局滚动任务已在内存传输下完成端到端贯通。当前重点转为真实无线链路和工程接入:确认无线参数与帧格式,实现串口 `IFleetTransport`,接入公共坐标系成员状态和主车时间轴,再通过静止状态机与低速双车逐级验证。QP/HQP不作为第一版前置条件。
- 车队状态估计第一版保留“成员状态先经单车状态估计处理、车队层做时间对齐与刚体一致性检查、候选中心等权/圆周平均”的保守方案;暂不重复实现单车Detour跳变逻辑,也不在运行链和实车数据建立前加入复杂鲁棒优化。后续内部融合升级应尽量保持 `FleetStateEstimateResult``FleetState``MemberErrors` 外部接口不变。
- β在多车中定位为单车执行坐标系而非车队核心优化量:常规、斜行和横移动作先确定车队主要滚动方向,各车按布局朝向换算本地β,停车预对齐并经车队同步屏障统一释放。轨迹级β搜索只作为机械余量或复杂方向变化下的后续增强。
- 当前单车实验工作转入纵向系统辨识:先固定实车 `AccPerSecond=0.3m/s²``DeAccPerSecond=1.0m/s²`,以M层最终发送速度为输入、轮组反馈速度为输出,取得可重复模型后再调整纵向控制、启动/停车策略和加减速度参数;横向辨识随后进行。
## 阻塞/待确认
@@ -60,3 +63,4 @@
7. 接入C层正式车队动作入口、成员状态实际来源和主车接收时间轴,保证 `FleetMemberReport` 位姿处于同一公共世界坐标系,远端采样时间已换算为主车时间后再形成 `FleetMemberStateSample[]`
8. 先验证静止布局建立、β准备、全员Ready、统一激活和停止,再进行空载低速双车直线与圆弧;共同搬运前补齐夹紧/报警输入和可立即停车措施。
9. 记录各成员候选中心、数据年龄、状态来源、布局误差和减速/停车原因。只有数据证明当前等权融合频繁被单成员异常拖累时,再增加车队预测、逐成员门控和鲁棒加权。
10. 先对纵向辨识两个入口各做一次0.05m/s低速流程验证,再在0.1/0.2/0.3/0.4m/s下采集当前固定配置的重复实验;每次单独保存C/M两份CSV,确认正向模型后再决定倒车补测和参数A/B。