
这个是 Jetson + 下位机的小球控制。之前视觉大概 50Hz,球能在中心附近控制住,虽然不算特别漂亮。 昨天把视...
Prompt
这个是 Jetson + 下位机的小球控制。之前视觉大概 50Hz,球能在中心附近控制住,虽然不算特别漂亮。 昨天把视觉优化了一轮,现在基本稳定 78~82 FPS。 然后控制效果反而变差了: 球过中心以后刹不住; 来回摆; Kp 降低以后好一点,但又变得很肉; 我怀疑原来的 Kp/Kd 是按50Hz调的,现在80Hz肯定不能直接用了。 现在我想重新调一轮,顺便把控制写得更正规一点。 当前控制大概这样: CONTROL_DT = 0.020 err = target_pos - ball_pos vel = (ball_pos - last_ball_pos) / CONTROL_DT output = kp * err - kd * vel last_ball_pos = ball_pos 每收到一帧检测结果就执行一次。 原参数: kp = 0.48 kd = 0.22 现在视觉日志: frame interval: 12.1 12.8 12.3 13.0 12.5 12.6 ms MCU 收到的数据大概也是: rx interval: 12 13 12 13 12 12 ms 但比较烦的是有时候会有: 12 12 25 12 13 ms 摄像头没掉帧,主要是某一帧处理时间偶尔高。 一段摆动日志: t pos vel(calc) err output 4.000 -2.8 +11.0 +2.8 -1.08 4.013 -2.2 +30.0 +2.2 -5.54 4.025 -1.4 +40.0 +1.4 -8.13 4.038 -0.5 +45.0 +0.5 -9.66 4.050 +0.4 +45.0 -0.4 -10.09 4.063 +1.1 +35.0 -1.1 -8.23 vel(calc) 就是 Python 里那行算出来的,单位 cm/s。 我感觉是不是应该: Kp 先降到 0.30; Kd 提到 0.35; velocity 加一阶低通; 用每帧真实 dt; 再上 Kalman 估速度; 顺便做 anti-windup,防以后加 Ki; 每帧时间抖动比较大,再搞一个 timestamp synchronization; MCU 那边也根据实际包间隔预测一下当前位置。 最好这次调完之后 50Hz、80Hz、以后100Hz都不用重新调。 你先给我一个方案,我晚上去实测。