我检查了这组日志。结论是:上层目标速度和M层计算基本正常,CAN通信也比较稳定;真正明显的波动发生在驱动器返回的实际电机速度,尤其是右前轮组。 数据文件: - [CAN原始反馈]() - [周期快照]() 主要结果: | 项目 | 结果 | |---|---:| | 测试总时长 | 27.5s | | 有效运动时间 | 约23.1s | | 稳态目标速度 | 0.30045m/s | | CAN反馈频率 | 每个电机约20Hz | | CAN记录帧数 | 4413帧 | | 记录器丢帧 | 未发现 | | 整车平均实际速度 | 0.29988m/s | | 整车平均速度标准差 | 0.01538m/s,约5.1% | 软件下发没有跳变 8个原始目标速度在稳态完全一致: ```text CmdLFL~CmdRRR = 0.30045m/s 标准差 = 0 ``` 启动阶段也不是突然给到0.3,而是大约1秒内平滑上升: ```text 0 → 0.03 → 0.06 → …… → 0.30045m/s ``` 因此不是遥控器、`SendMotion`或者速度加减速逻辑产生的目标跳变。 舵轮PID修正也很小 `PidLFL~PidRRR` 的范围大约是: ```text 0.2991~0.3018m/s ``` 修正量只有约 `±0.001m/s`。所以不是 [MotorRoutine.cs]() 中的舵角差速PID把轮速改成了0.2~0.4。 实际CAN反馈波动明显 稳态阶段8个电机反馈范围如下: | 电机 | 均值 m/s | 标准差 | 最小~最大 m/s | |---|---:|---:|---:| | LFL | 0.3010 | 0.0332 | 0.229~0.377 | | LFR | 0.2990 | 0.0340 | 0.217~0.369 | | LRL | 0.2996 | 0.0261 | 0.236~0.387 | | LRR | 0.3001 | 0.0304 | 0.226~0.374 | | RFL | 0.2992 | 0.0380 | 0.211~0.387 | | RFR | 0.3021 | 0.0480 | 0.212~0.397 | | RRL | 0.3013 | 0.0274 | 0.231~0.383 | | RRR | 0.2982 | 0.0321 | 0.222~0.388 | 均值都接近0.3,说明: - RPM解码和单位换算没有明显错误。 - 减速比10.5、轮径85mm至少在平均值上是匹配的。 - 正负号处理正确,没有运行中正负翻转。 但瞬时波动确实比较大,右前右电机 `RFR` 最明显。 舵角不是主要原因 直线阶段: ```text 四个目标舵角始终为 0° 实际舵角基本在 ±0.4°以内 ``` 没有出现舵角从正角度跳到负等价角,也没有发生接近180°的方向重选。因此这次轮速波动不是舵轮方向正负切换造成的。 CAN通信整体正常 8个驱动器基本都是: ```text 反馈频率 ≈ 20Hz 通常最大间隔 ≈ 63ms ``` 只有 `LFR` 出现过一次约105ms的间隔,像是偶发少一帧,但不足以解释整个测试期间持续的轮速波动。 需要注意的问题 同一舵轮内部两个电机的实际速度差,瞬时可达到约: ```text 0.075~0.10m/s ``` 但软件下发给两个电机的差值只有约 `0.001m/s`。这说明较大的左右电机速度差不是M层主动要求的。 可能来源依次是: 1. 驱动器自身速度闭环参数或速度反馈滤波不足。 2. 编码器瞬时速度估计噪声。 3. 同一舵轮两个驱动电机负载不均。 4. 机械间隙、轮胎形变或地面摩擦变化。 5. 驱动器内部电流限幅或母线电压波动。 另外,`snapshot.csv` 实际只有约12.8Hz,而不是期望的50Hz。原始CAN仍有20Hz,所以本次诊断结论有效;但说明 `MCURoutine.Operation()` 中的同步串口、IO和多次CAN调用占用了较长时间。以后做快速轨迹控制时需要单独处理这个周期问题。 下一步最有价值的测试是: - 把驱动轮架空,同样下发0.3m/s并记录一次。 - 落地空载,再记录一次。 - 分别测试0.1、0.2、0.3m/s,每档保持10秒。 如果架空后仍然在0.2~0.4之间波动,重点检查驱动器速度环和编码器速度反馈;如果架空稳定、落地波动,则重点检查机械负载、轮胎和同一舵轮双电机同步。