源码主线 05|视觉误差、环绕几何与命令的有效期
检测器给出“图像里有什么”,任务控制器需要决定“现在该怎样动”。项目跟随与环绕控制都从中心、面积等图像量出发,但身份关联、运动平滑、丢失处理和桥接有效期决定了检测结果能否成为连贯的闭环行为。
从检测框到可控制的误差
decision_logic.py::make_observation用归一化中心和面积减轻图像分辨率变化的影响。640×480图像里,框中心(384,216)、框宽高(80,120),得到e_x=0.2、e_y=−0.1、a=0.03125。它们表达“偏右20%半幅、偏上10%半幅、占全图3.125%”,不是米或米每秒。中心误差常驱动转艏与垂直修正,面积误差驱动接近或远离。
当目标尺寸、姿态和成像条件近似固定,面积为期望面积的四分之一,距离约为期望距离的两倍。遮挡或目标转身也会改变面积,因此面积是距离线索而不是无条件的测距仪。把真实运动、目标形变和测量噪声区分开,是图像闭环设计的核心。
为什么不能每帧只选最高分
跟随路径主要使用高置信度检测;环绕路径orbit_logic.py还结合中心距离、面积比例和连续候选确认做轻量关联。同一画面有两个相似目标时,最高置信度可能来回切换,控制器便会追着不同目标摇摆。身份连续性应先于误差平滑:先决定跟谁,再滤波它的位置。
随时间调整EMA权重,使10 Hz和20 Hz时的平滑时间常数更接近。固定α则把时间常数绑在帧率上,推理变慢时闭环也随之变迟钝。确认帧与方向滞回抑制跳变,输出变化率限制控制命令的陡变;这些机制分别处理身份、方向和执行动态,不能互相替代。
环绕为何同时需要侧移与转艏
侧移让机器人围绕目标改变方位,转艏让相机继续指向目标。在理想平面、距离r近似固定时,切向速度v_t对应视线角速度大小v_t/r。教学例:r=2 m、v_t=0.2 m/s,所需偏航前馈约0.1 rad/s,即5.73°/s;具体符号由相机和运动方向决定。中心误差反馈修正残差,几何前馈提前抵消主动侧移造成的视线变化。
项目环绕控制把面积误差映射为surge,中心误差映射为yaw/vertical,并加入侧移相关yaw前馈,同时限制变化率和水平控制预算。阅读时可把每一项标记为“保持距离”“保持居中”“主动环绕”三类,就能解释为什么仅用中心PID会在开始侧移后总是慢半拍。
短时预测为什么必须带过期时间
丢失一帧不必立刻认定目标永久消失,但继续执行旧运动也不能无限延长。环绕逻辑包含短时宽限、预测搜索和超时复位;配置中的图像最大年龄约0.25 s、丢失搜索上限约0.8 s,属于当前策略参数。OrbitPublisher携带session、seq、image_age与TTL,使桥接知道命令是谁生成的、是否更新、还剩多久有效。
session区分进程重启;seq拒绝重复或乱序;TTL限制指令生命;image_age指出决策所依据图像有多旧。它们解决的是不同问题。尤其收到一条新UDP包,不代表里面的图像也新;推理前检查新鲜度后,还应在发布决策时重新计算年龄。
协议转换就是控制器的一部分
跟随发布端的v1/direction_magnitude与tracking v2/normalized不是同一种表示;转换器需要定义方向如何变成带符号数、幅值尺度如何变换、yaw或sway分别送往哪个控制轴。项目CIRCLE水平量是归一化forward/lateral,GUIDED水平量是导航系速度;把字段名对上仍不够,必须连同物理量、坐标、模式一起对齐。
练习使用固定视频或合成框序列:中心缓慢移动、短暂遮挡、两个目标交叉、帧延迟200 ms。逐帧输出选中的目标、e_x/e_y/a、状态、最终命令和到期时间。再在中途模拟进程重启、序号回退;观察桥接怎样避免旧会话的命令重新获得控制权。整个练习可用内存消息完成,不连接机器人。