☰
智能车竞赛控制策略详解:舵机PID与速度闭环
2026/10/3 18:46:44 网站建设 项目流程

1. 从备赛第一天起,就必须想清楚的控制链路

全国大学生智能汽车竞赛的四轮组,表面上拼的是机械结构和图像处理,实际上真正决定圈速上限的,往往是那套看不见摸不着的控制策略。第18届竞赛的四轮车,主控从K60到TC264再到TC377,芯片换了一代又一代,但舵机转向和速度闭环这两条控制主线始终没有变过。很多队伍在第一周搭完车、调通摄像头、能在赛道上歪歪扭扭跑起来之后,就陷入了一个尴尬的阶段:车能跑,但跑不快,一快就冲出赛道,或者过弯时左右猛打、车身姿态一塌糊涂。这个阶段的本质问题,就是控制策略没有理顺。

我先说一个备赛初期最容易被忽视的事实:四轮车的控制链路,是一条从"感知"到"决策"再到"执行"的串行通路。摄像头采集到图像,单片机处理出赛道中线偏差,这个偏差经过舵机PID计算得到一个PWM占空比输出给舵机;编码器测得轮速,这个实测值和目标速度经过速度PID计算得到一个PWM占空比输出给电机。这两条链路看似独立,实际上在物理层面是强耦合的。舵机转角变化会导致车体横向加速度变化,横向加速度变化会引起轮速波动,轮速波动又会反过来影响图像采集的稳定性。如果你只调舵机不管速度,或者只调速度不管舵机,那这车永远跑不出稳定圈速。

所以这篇文章我不打算按"舵机PID怎么调、速度PID怎么调"这种割裂的视角去写,而是从一整条控制链路的角度来拆解。我会把第18届四轮车从头到尾的控制策略梳理一遍,包括舵机转向控制的原理与实现、速度闭环的结构与参数整定、以及真正决定圈速的那几个"软技巧"。文章面向正在备赛的学生、指导老师,以及所有对自动控制感兴趣但被PID调参劝退的读者,希望能帮你们少走几个月的弯路。

2. 舵机转向控制:从PWM原理到位置式PID

2.1 舵机的本质是一个"角度伺服系统"

四轮车用的转向舵机,不管是S3010还是SD5,本质都是一个角度伺服系统。给它一个特定脉宽的PWM信号,它就转到对应的角度,并且通过内部电位器形成闭环,始终维持这个角度。这个特性决定了舵机控制不需要像电机那样频繁地做闭环计算,你只需要告诉它"现在该转到哪个角度",它自己会完成剩下的工作。

以常用的S3010舵机为例,它的控制信号是50Hz(周期20ms)的PWM,脉宽范围一般在1ms到2ms之间,对应0度到90度左右的机械转角。在stm32上实现时,我习惯用定时器的PWM输出模式,以TIM1为例,如果PSC设置为839、ARR设置为1999,那PWM频率就是72MHz/(840\times2000)=42.857Hz,实际上大家更常用的是设置PSC=839、ARR=3999,频率为72MHz/(840\times4000)=20.83Hz,基本逼近50Hz的要求。CNT的比较值在500到2500之间调整,对应0.5ms到2.5ms的脉宽,也就是舵机的左右极限位置。

这里有一个非常关键的细节:舵机的机械中值和PWM中值往往不对齐。理论上1.5ms脉宽对应舵机中位,但实际装车之后,由于舵机臂安装角度、连杆长度、轮胎束角的误差,你会发现给1.5ms时前轮并不是正的。解决方法是先给一个估计的中值,然后把车放在赛道上,通过摄像头图像看车头指向是否沿着赛道方向,用串口或者屏幕微调这个值,直到车能保持直线。这个过程我一般叫"舵机机械标定",是整个控制策略里最不起眼但最不能跳过的步骤。

2.2 为什么转向控制要上PID:位置式PID的差分方程

很多新手会问一个问题:既然舵机是角度伺服系统,我直接把图像偏差映射到PWM不就完了吗?理论上确实可以,也就是所谓的"比例转向",比如pwm = mid + k * error。但实际跑起来你就会发现,这个方案有两个致命问题:第一,如果k太小,过弯时转向不足,车头对着弯心但转向角度跟不上,直接冲出赛道;第二,如果k太大,直道上图像有一点点噪声,舵机就会左右猛打,车身姿态极不稳定。

这时候就需要PID来"平滑地逼近目标角度"。四轮车转向常用的位置式PID公式是:

int16_t PID_Steer_Calc(int16_t error) { static float integral = 0.0f; static int16_t last_error = 0; float P = 1.0f * error; integral += error * 0.001f; // 积分项,系数很小 float D = 0.8f * (error - last_error); last_error = error; return (int16_t)(P + integral + D); }

位置式PID的特点是:输出量是绝对的PWM角度值,每一次计算都基于当前误差的完整累积。它的优势是物理意义清晰——输出的就是"舵机现在该去的角度",配合舵机内部的角度闭环,整个系统就是两级串联的闭环结构。积分项的作用是消除稳态误差,但四轮车转向控制里误差要么是0要么是负(在直道上),积分项大部分时间在积累一个固定值,反而会导致过弯后回正变慢,所以实际调参时很多队伍会把积分系数设成0,只用PD控制。

2.3 位置式PID的差分实现:为什么要写成差分方程

前面给的代码用的是数学上的累加形式,但工程上更推荐用差分方程来实现位置式PID。因为单片机是离散系统,无法处理连续积分,必须把积分项离散化。上面代码里的integral += error * dt实际上就是离散化之后的黎曼和,dt就是控制周期。

更严格的写法是这样:设采样周期为T,则位置式PID的离散化公式为:

[ u(k) = K_p \cdot err(k) + K_i \cdot T \cdot \sum_{j=0}^{k} err(j) + K_d \cdot \frac{err(k) - err(k-1)}{T} ]

这个公式看着复杂,实际写代码其实就是三个累加器的事。我见过很多队伍在这一步踩坑:把Ki设成0.01这种小数值,然后积分项在直道上一直累加,过了几十个控制周期之后这个值就变得非常大,一入弯舵机直接猛打,以为是机械问题,折腾半天最后发现是积分饱和。解决办法是给积分项加限幅,或者直接不用积分项。

2.4 舵机PID参数整定的顺序与方法

舵机舵机PID的参数整定我有一个固定的顺序,这个顺序保证了每次调参都能快速收敛,而不是盲目试。先说结论:先调P,再加D,K_i保持为0。

第一次上赛道之前,把D和I都设成0,只留P。用串口把图像偏差和PWM输出实时显示在VOFA+或者匿名上位机上,然后逐渐加大P,观察舵机响应:如果P太小,过弯时舵机转角明显滞后于赛道曲率变化,图像显示偏差只能维持在30到50像素以上,车头对着弯心但转向不足;如果P太大,直道上图像一有噪点,PWM就会在中心值附近剧烈跳动,舵机发出"嗡嗡"的抖动声。找到一个临界值——直道上不抖、过弯时勉强能跟上,这就是P的基础值。

加上D项之后,D的作用是预测误差的变化趋势,超前修正舵机转角。过弯入弯时,误差在快速增大,D项是正的,会推着舵机提前多转一点;出弯回正时,误差在快速减小,D项是负的,会拉着舵机提前回正。这就是为什么PD控制能让过弯更平滑。D加太多的典型现象是过弯时舵机先猛打一下再回一点,车头出现明显的点头动作。我常用的经验值是P在1.0到1.5之间,D在0.5到0.8之间,这个范围对S3010比较合适,但具体还要看你图像处理的输出频率。

| 参数 | 作用 | 调大后的现象 | 调小后的现象 | 我的起始推荐值 | |------|------|-------------|-------------|--------------| | Kp | 响应速度 | 直道抖动、过弯猛打 | 过弯转向不足、冲出赛道 | 1.0~1.5 | | Kd | 趋势预测 | 过弯点头、来回震荡 | 过弯延迟、转向滞后 | 0.5~0.8 | | Ki | 消除稳态误差 | 积分饱和、回正变慢 | 无明显影响 | 0 |

3. 速度闭环设计:从编码器测速到增量式PID

3.1 编码器测速背后的计算逻辑

速度闭环的前提是知道当前车速。四轮车常用的测速方案是编码器加定时器输入捕获,我拿第18届主流的TC264或者STM32来举例。以STM32F103为例,假设你用的是100线的mini编码器,直接接在TIM4的CH1和CH2上,开启编码器模式,TIM4的计数器会在每产生一个计数脉冲时增加或减少。默认情况下,100线编码器经过四倍频之后,电机每转一圈产生400个脉冲,如果减速比为30,那车轮每转一圈产生12000个脉冲。

测速的代码逻辑是这样的:每隔10ms读一次TIM4->CNT,清零后把差值换算成速度。假设车轮直径是64mm,周长约为0.2m,那么:

[ v = \frac{\Delta CNT}{12000} \times 0.2 , \text{m} / 0.01 , \text{s} = \frac{\Delta CNT}{600} , \text{m/s} ]

这个计算看起来很简单,但实际工程里有几个坑。第一,TIM4->CNT是有符号的16位寄存器,正转加计数、反转减计数,如果速度太快或者采样周期太长,CNT可能溢出,读数就错了。解决方法是把采样周期控制在10ms以内,并且用int16_t类型接收CNT的值,让单片机自动处理回绕。第二,编码器装在哪一侧、安装在电机轴还是轮轴上,会直接影响脉冲数和速度量程,安装前先把机械结构看清楚。

3.2 增量式PID:为什么速度环更适合增量式

速度闭环的PID实现,我强烈推荐增量式PID。它和位置式PID的区别在于:增量式PID输出的不是"当前时刻的目标值",而是"相对于上一次输出的变化量"。公式是:

[ \Delta u(k) = K_p \cdot [err(k) - err(k-1)] + K_i \cdot err(k) + K_d \cdot [err(k) - 2err(k-1) + err(k-2)] ]

对应的C代码实现:

int16_t PID_Speed_Calc(int16_t target_speed, int16_t current_speed) { static int16_t err[3] = {0, 0, 0}; static int16_t last_output = 0; int16_t delta; err[2] = err[1]; err[1] = err[0]; err[0] = target_speed - current_speed; delta = 0.8f * (err[0] - err[1]) // Kp项 + 0.05f * err[0] // Ki项 + 0.2f * (err[0] - 2*err[1] + err[2]); // Kd项 last_output += delta; return last_output; }

为什么速度环用增量式而不是位置式?原因有三个。第一,增量式PID只输出变化量,意味着即使在直道上目标速度和实测速度存在恒定偏差,积分项的输出也只是在一个很小的范围内波动,不会像位置式那样把积分值累积到饱和。第二,增量式对执行器有天然的保护作用——即使PID输出突然跳变,它改变的也只是PWM变化量,不会直接把PWM从500跳到2000导致电机堵转。第三,增量式天然适合和电机驱动器的PWM限幅配合,因为累加输出可以方便地做上下限裁剪。

3.3 给定速度规划:直道加速、弯道减速的实现逻辑

速度闭环的另一个核心问题是"目标速度从哪里来"。如果整圈都用同一个目标速度,那过弯时只能把速度设得很低,圈速完全没法看。正确的做法是做一个根据赛道元素动态调整目标速度的速度规划模块。

我第18届比赛时用的方案是:以图像处理输出的赛道类型标记为输入,结合当前舵机PWM值(即转向角度)来决定目标速度。逻辑如下:

int16_t Speed_Planner(int16_t steer_pwm, uint8_t track_type) { int16_t base_speed = 1800; // 直道目标速度 // 依据舵机转角判断弯道急缓 if (steer_pwm > 1600 || steer_pwm < 1400) { base_speed = 800; // 急弯,目标速度降低 } else if (steer_pwm > 1550 || steer_pwm < 1450) { base_speed = 1300; // 中弯 } // 依据赛道元素做修正 if (track_type == TRACK_CROSS) { base_speed = 1000; // 十字路口提前减速 } else if (track_type == TRACK_RAMP) { base_speed = 1400; // 坡道适当减速保持动力 } return base_speed; }

这个模块的核心思想是"预判",而不是"反应"。如果等车已经冲到弯道中间才把目标速度降下来,速度环需要至少200ms的响应时间,车早就甩出去了。所以必须在入弯之前就根据图像信息提前200到300ms把目标速度降下来,等车真正到弯道时速度已经降到位了。这就是为什么我在图像处理里会专门提取一个"入弯检测"信号,而不是只输出中线偏差。

3.4 电机PWM限幅与差速控制的配合

速度闭环输出的是电机PWM值,但左右轮电机不是简单的相同PWM就能保证直线行驶的。因为机械装配误差和轮胎磨损,两个电机的空载转速会有细微差别。我第18届的调试过程让我深刻体会到,底盘机械精度会直接影响速度闭环的工作量。如果车跑直线时总要往一边偏,你会在图像处理里加一个很别扭的补偿系数——这本质上是在用软件去填机械的坑,治标不治本。

在PID输出的PWM上做一个限幅就很有必要了。加限幅前我遇到过的情况是:速度PID在过弯减速时积分项累积得很猛,出弯加速时PID输出直接顶到满占空比,电机瞬间大电流,电池电压被拉低,摄像头图像开始抖动,整个系统失控。加上限幅和输出斜率限制之后,出弯加速变得线性了很多,比赛跑下来的稳定性也好了不少。

另外说一句差速的问题。四轮车转向时四个轮子的转速天然不同,但如果你的车是后轮双电机驱动、前轮舵机转向,就要考虑要不要做差速。我在第18届时采用的是比较保守的方案:两个后轮电机各跑各的速度闭环,但目标速度相同,不额外做差速。这样做的好处是算法简单,坏处是过弯时外侧轮会被动拖慢,增加过弯阻力。如果后面想把圈速再提一档,可以做转速差闭环——根据舵机转角实时计算内外轮目标速差,但这属于进阶优化,新队伍不必一上来就上这个东西。

4. 图像处理与控制策略的接口设计:偏差计算与赛道元素识别

4.1 从摄像头到偏差:为什么中线和偏差是控制的前提

写到这里必须插一个话题:舵机PID和速度闭环再完美,如果图像处理给出来的偏差是抖动的、滞后的、甚至错误的,控制策略做得再好也白搭。第18届很多队伍用的都是总钻风(MT9V03X)摄像头,分辨率虽然不高,但配合二值化处理,能获得稳定的赛道灰度图。

图像处理的第一步是对每一行图像提取赛道边线。我用的方案是从图像底部往上扫,从中间往两边搜,找到灰度跳变点作为左右边界。然后取左右边界的平均值作为该行的赛道中心,再用整幅图像所有行的中心点做一个加权平均,得到最终的偏差值。举例来说,假设图像宽度是188像素,第i行的左右边界是left[i]和right[i],那么该行的中心是:

[ center[i] = \frac{left[i] + right[i]}{2} ]

整个图像的偏差就是:

[ error = \frac{\sum_{i=1}^{N} (center[i] - 94) \cdot w_i}{\sum_{i=1}^{N} w_i} ]

其中94是图像中心列,w_i是权重系数。近处的行权重低,因为近处哪怕偏差很大,实际控制意义也就相当于转角的小幅修正;远处的行权重要高,这样舵机才能提前响应远处的弯道。这个权重系数就是所谓的"前瞻"。

4.2 前瞻距离:控制策略里最核心的隐藏参数

很多队伍调了很久的PID都没解决"过弯总是慢半拍"的问题,其实问题根本不在PID,而在于前瞻距离太小了。前瞻大意味着舵机提前看到了远处的弯道,可以提前打方向,车过弯的姿态自然就更丝滑;前瞻小意味着舵机只能看到近处的赛道,等到弯道逼近时才匆忙转向,哪怕Kd调得再大也弥补不了这个迟滞。

前瞻的具体实现方法可以是在行权重上做文章:远处的行给更大的权重,近处的行几乎忽略。我第18届用的权重方案是:

  • 第0到5行(图像底部,车头前):权重0.1
  • 第6到15行:权重0.3
  • 第16到25行:权重1.0
  • 第26到35行:权重2.0
  • 第36到45行:权重3.0

这样算出来的偏差,其实代表的是"车前方15到25cm处赛道的横向偏移",而不是车头正下方的偏移。这个小小的改动,直接让过弯的流畅度上了一个台阶。

4.3 赛道元素识别:十字、环岛、坡道的控制策略切换

第18届的赛道元素主要包括十字路口、环岛、坡道和路肩(元素分布每年略有不同,但处理方法相通)。这些元素本身不难处理,难的是如何跟控制策略配合好。

十字路口的特征是左右边线在某个行突然消失或者形成对称的断裂。处理方案是在图像处理里检测到"左右同时丢失边线超过N行"时,打一个十字标记,控制策略在十字前300ms将目标速度降到一个安全值(比如1200),并且让舵机保持当前角度,不再做大幅修正,防止误判发散。

环岛的识别和处理则要复杂一些,因为涉及进出环岛的路径规划。我当时的方案是:当图像检测到左侧或右侧出现大面积白色区域时,判断进入环岛,此时把速度降到最低档,并且让舵机沿着环岛内圈固定角度走,等图像重新出现完整赛道边线时退出环岛模式,恢复正常控制。这个方案不依赖复杂的路径规划,但对图像稳定性的要求很高,一度困扰我很久——环岛内沿的弧线是跟随当前角度还是持续修正,在第18届的赛道规则下,最终我选择了固定角度方案,实测圈速反而更稳定。

4.4 图像输出频率与控制周期的匹配

最后说一个容易忽略的工程问题:图像处理的输出频率,和舵机PID、速度PID的计算频率,必须是匹配的。摄像头采集一帧图像需要一定的时间,加上二值化和边线提取,整体帧率大约在50到100Hz。而速度PID的采样周期一般是10ms(即100Hz)。如果图像帧率是50Hz,舵机PID的计算频率统一也是50Hz,问题就不大。但如果舵机PID在图像帧率的两倍频率下计算,那两次计算的偏差必然是同一个值,D项计算出来的变化量就是0,等于白算了;更糟糕的是,如果图像帧率不稳定,第二次计算的error变化量会被错误地放大,造成舵机抖动。

我的建议是:统一做一个10ms定时器,每10ms读一次图像的最新偏差,同时算舵机PID和速度PID,电机PWM直接更新。图像处理模块每来一帧就更新一次全局变量里的偏差值,不需要跟控制同步。这样控制周期的抖动就只取决于定时器精度,跟图像帧率解耦了。

5. PID参数整定的实操套路:从仿真平台到赛道实测

5.1 先用仿真调通逻辑,再上赛道调参数

很多队伍一上来就把车放在赛道上调PID,图省事。我的经验是,先花一个晚上做一个简单的MATLAB或者Python仿真,把PID的逻辑和公式先在仿真里跑通,验证一下代码的逻辑正确性,再上赛道调参数。仿真不需要多么精确的车模模型,一个简化的运动学模型就够用了:假设舵机转角决定横摆角速度,横摆角速度积分得到航向角,航向角改变横向偏差。

这样可以先把参数调节的"手感"建立起来。你在仿真里会发现,Kp太大时系统会振荡,Kp太小时系统会发散,Kd太大时响应会过于保守——这些现象和真车上是一模一样的。而真车上调的每一个参数,因为有传感器噪声、机械摩擦、轮胎滑移这些因素,现象会更"脏"一些,如果不在仿真里建立起对PID行为的直觉,上赛道调参只会越调越乱。

5.2 赛道实测调参的标准流程:临界比例度法

上赛道实测时,我用的方法是临界比例度法,步骤非常固定:

第一步,把所有积分和微分参数归零,只保留P。从小到大逐步增加Kp,直到在直道上观察到舵机开始持续等幅振荡——注意是"持续等幅振荡"而不是偶发抖动。记下这个Kp值为临界比例系数Kc,同时记录振荡周期Tc。

第二步,根据Ziegler-Nichols经验公式,设置初始参数:Kp = 0.6Kc,Ki = 2Kp/Tc,Kd = Kp*Tc/8。这套参数不一定直接最优,但通常能保证系统稳定,而且是一个很好的调参起点。

第三步,在起点附近微调。先加大Kp直到直道出现轻微抖动,然后回调20%;再加入Kd,逐步增大Kd直到过弯变得平滑、入弯没有过度延迟;最后加一点Ki用于消除稳态误差——但对舵机转向来说,我一般直接跳过Ki。

速度环的调参类似,但有一个区别:速度环的振荡不像舵机那样容易肉眼观察,需要通过上位机看速度曲线。我推荐用VOFA+的波形功能,同时显示目标速度和实际速度的曲线,调参时一眼就能看出超调量和调节时间。

现象可能原因调整方式
直道舵机抖动Kp过大Kp下调20%
过弯转向不足Kp过小或前瞻太小Kp上调或增大远行权重
过弯点头、来回摆头Kd过大Kd下调30%
速度超调大、出弯加速冲速度环Kp过大Kp下调,或减少输出限幅
速度响应慢、过弯减速不够速度环Kp过小Kp上调,同时检查目标速度规划

5.3 调参中的"玄学":其实都是物理

最后说一点很多人觉得玄学的东西。比如同一个参数,上午跑得好好的,下午就全线崩溃了。其实这不是玄学,是物理——电池电压变了。比赛用的镍氢电池或者锂电池,在电量高和电量低的时候,内阻和输出电压特性都不一样,电机和舵机的响应速度也不一样。上午满电时同样的PWM能给到更高的转速,下午低电量时同样的PWM转速下降,速度环的积分项就会累积得更多,造成不同的响应特性。

给两个建议。第一,如果条件允许,给控制系统加上电池电压采集,手动补偿PWM输出:电压低时,同样的目标速度对应更高的PWM。第二,调参尽量在同一个电量范围内进行,比如都在7.8V到8.0V之间,不然你调出来的参数其实混合了电量的影响,换一快电池就失效了。

6. 竞赛现场常见的控制策略问题与排查链路

6.1 出弯后车身摇摆不止

第18届赛场上,很多队伍在调试时都会遇到一个典型问题:出弯回正后,车身还在左右摇摆两个到三个周期才稳定下来。从控制的角度看,这是典型的阻尼不足。但根源不一定在舵机PID的Kd上,我建议按这个顺序排查:

先检查机械——车架的螺丝是否拧紧,转向机构的虚位有多大。虚位这东西对控制系统是致命的:舵机PID输出一个转角,但因为连杆虚位,前轮实际转过的角度比PID算出来的小,误差信号认为还没到位,继续加大输出,等虚位被吃掉之后前轮一下子过冲,这就是摇摆的机械根源。用手晃动前轮,如果明显感觉有间隙,先把机械问题解决。

然后检查图像处理的输出是否干净。把偏差值通过上位机打印出来,看直道上偏差是不是在0附近小幅跳变。如果图像噪声本身就大,那Kd项会把噪声微分放大,导致舵机在直道上也抖,出弯后自然会摇摆。这时候要在图像处理端做滤波,而不是盲目调Kd。

最后才回到PID参数。如果在机械和图像都没问题的情况下仍然摇摆,那就是Kd确实偏小了。可以逐步加Kd,每次加0.1,观察摇摆周期的变化,直到车身在一个周期内稳定下来。

6.2 十字路口侧滑冲出赛道

十字路口是四轮车最容易翻车的地方之一。侧滑的本质原因是:车速过快,但十字路口的左右边线信息突然丢失,舵机失去了修正依据,加上轮胎与地面摩擦力不足,横向加速度超过了摩擦极限。

排查链路是这样的:第一步检查图像处理,确认进入十字时是不是真的能稳定输出"十字标志"。如果十字标志丢失或者误判,速度规划就不会提前减速,车自然以直道速度冲进十字。第二步检查速度规划里十字的目标速度是否合理,我见过很多队伍把十字速度设在1500以上,那基本必侧滑。第三步检查轮胎——比赛场地是pvc地板,新轮胎和磨平轮胎的抓地力差距极其明显,磨平的轮胎在十字路口就是滑板。

6.3 环岛入弯后舵机反复震荡

环岛入弯后震荡,是另一个高发问题。现象是车进入环岛后,方向一会儿左一会儿右,完全走不出光滑的弧线,甚至掉头。

这个问题我排查过很久,最后定位到两个原因。第一是图像处理在环岛环境下提取的左右边线不正确。环岛内侧的弧线在图像中不明显,边线提取算法容易把环岛中间的锥桶或者其他杂散物体误判成边线,导致偏差值跳变。这时候要在边线提取里加入"边线连续性"校验——连续几行的边线跳变超过阈值就认为是异常,丢弃这一帧或者用上一帧的数据补上。

第二是控制策略里"入环岛固定角度"和"正常循迹"两种模式的切换有跳变。在环岛边缘,车刚检测到环岛标志时,如果直接强制切换成固定角度输出,而固定角度又和当前PID输出值差得很大,那前轮会猛打一下,车身猛地一晃,图像抖动,又触发了环岛退出条件,模式切回来,又猛地晃回来。解决思路是做一个输出值的缓变过度:在模式切换时,把舵机输出值从当前值逐步过渡到目标值,用100到200ms的时间平滑过去,而不是瞬间跳变。

7. 写在最后:控制策略只是车的一部分,但它是车的大脑

第18届的备赛经历给我的最大感受是,控制策略的重要性远远超过很多人的预期。你看到的那些跑进30秒的队伍,摄像头处理、硬件布局、机械调校都做得很扎实,但真正让他们比别的队伍快那两三秒的,往往就是控制策略的精细程度——前瞻拉得够不够远、目标速度规划得够不够激进、PID参数在电池电压变化的整个区间内稳不稳定。

回到这篇文章的主题,如果你正在备赛,我建议你按这个顺序来构建自己的控制系统:先把舵机的机械标定和前向通道打通,让车能稳定直行;再上车速传感器和速度闭环,让车能稳定匀速;接着调图像前瞻和控制参数的配合,让车能流畅过弯;最后才去做元素识别和策略切换。每一步都稳了再往前推,不要跳步。

我自己在调参过程中踩过的最大的坑,是花了两周时间在赛道上一遍遍地调PID,最后发现直线都跑不稳的原因只是电池电压掉到了警戒线以下,整个控制系统的工作点全变了。所以后面我养成了个习惯,每次调参前先看一眼电压,调完一组参数记录下当时的电压值,复盘的时候才有参考。

另外分享一个对练习很有用的东西:找一段至少有直道、左弯、右弯、S弯的赛道,把它跑一百遍,每次只改一个参数,跑完记录圈速和现象。这个过程虽然枯燥,但能让你对每个参数的作用形成肌肉记忆,赛场上遇到突发状况时,你不用翻笔记就知道该往哪个方向拧。

这套方法不只是适用于第18届的四轮车,它适用于所有基于摄像头和PID的移动机器人平台。把转向和速度这两条控制链路理清楚了,后面不管是做电磁组、平衡组,还是自己玩树莓派小车,思路都是通的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询