如果你正在调试智能车直立环,发现小车要么“点头”要么“后仰”,或者速度一快就“抽搐”,那么这篇文章就是为你准备的。这不是一篇泛泛而谈的PID理论,而是聚焦于串级PID在直立调试中的实战经验,特别是针对全国大学生智能汽车竞赛中经典的“摩托组”或“直立车”组别。很多同学在调试时,往往孤立地调直立环、速度环,却忽略了它们之间“串级”耦合带来的复杂影响,导致调试过程漫长且效果不佳。
本文的核心判断是:直立车的稳定性,本质上是姿态环(角度环)与速度环之间动态平衡的艺术。单纯追求直立环的“硬”,会让车像一根僵硬的棍子,抗干扰差;而速度环介入不当,则会成为破坏平衡的“元凶”。我们将从最基础的传感器数据融合讲起,一步步拆解串级PID的调试顺序、参数整定方法,并分享那些在实验室里反复验证过的“坑”和“最佳实践”。无论你是初次接触直立车的新手,还是希望优化现有方案的老手,都能从中找到可立即上手的调试思路和代码参考。
1. 这篇文章真正要解决的问题:为什么你的直立车总调不好?
调试一辆能稳定直立并行驶的智能车,是很多参赛队伍的第一个技术门槛。你可能已经实现了基础的PID控制,但车子总是出现以下几种让人头疼的情况:
- “点头”或“后仰”:静止时,小车无法稳定在设定角度,而是前后周期性摆动。
- “抽搐”或“高频抖动”:行驶中,电机或车身出现不正常的剧烈震动。
- “跑偏”或“画龙”:直线行驶时,无法保持方向,左右摇摆。
- 抗干扰能力差:轻轻一碰就剧烈晃动,甚至倾倒,恢复缓慢。
这些问题,很多时候根源不在于某个PID参数没调对,而在于没有理解串级PID中内外环的职责划分与协作关系。串级PID不是两个独立PID的简单叠加。内环(直立环/角度环)负责快速响应,维持车身姿态;外环(速度环)负责宏观调节,控制车的运动趋势。外环的输出,是内环的设定值。如果内外环的响应速度不匹配(比如速度环比直立环还快),或者参数耦合太紧,系统就会失稳。
本文的目标,就是帮你建立清晰的串级PID调试框架,让你知道:
- 先调什么,后调什么:一个经过验证的、可复现的调试顺序。
- 每个参数影响什么:
Kp,Ki,Kd在直立环和速度环中分别扮演什么角色。 - 如何判断调好了:除了“看起来稳”,有哪些量化或半量化的评估标准。
- 遇到典型问题怎么办:提供一套从现象到原因的排查思路。
2. 基础概念与核心原理:串级PID与直立平衡
在深入调试前,我们必须统一几个关键概念,这是后续所有操作的基础。
2.1 什么是串级PID?
串级PID(Cascade PID)是指将两个或多个PID控制器串联起来,前一个控制器的输出作为后一个控制器的设定值。在直立车中,最典型的串级结构是:速度环(外环) → 直立环(内环) → 电机。
- 速度环:输入是目标速度与实际速度(通常由电机编码器测得)的偏差,输出是一个目标角度(或角度补偿量)。它的作用是,想让车加速,就命令车身前倾;想让车减速,就命令车身后仰。
- 直立环:输入是目标角度与实际角度(由陀螺仪/加速度计融合得到)的偏差,输出直接是电机的PWM占空比。它的作用是,无论速度环给了什么角度指令,它都要快速、稳定地将车身维持在目标角度。
这种结构的好处是分工明确:直立环专注于快速的姿态稳定(抗高频干扰),速度环专注于慢速的速度跟踪(实现巡航、制动等)。
2.2 直立车的平衡原理
两轮直立车的平衡,本质上是一个“倒立摆”问题。其平衡点(竖直向上)是不稳定的,需要通过电机持续施加控制力来维持。控制力的依据就是车身倾角(θ)和角速度(θ')。
- 角度偏差(
θ_error):决定控制力的“方向”和“强度”。车往前倒,电机就往前转提供恢复力。 - 角速度(
θ'):决定控制力的“阻尼”。车倒得快,就需要更大的阻尼力来抑制运动趋势,防止矫枉过正(超调)。
MPU6050这类IMU传感器提供了原始的加速度计和陀螺仪数据。加速度计测得的角度在静态时准,但动态时有严重噪声;陀螺仪测得的角速度积分得到角度,短期准但会随时间漂移。因此,必须使用互补滤波或卡尔曼滤波进行数据融合,得到一个相对准确且稳定的姿态角,这是所有控制的基础。
2.3 关键术语对照表
为了避免混淆,这里明确一下文中常用术语:
| 常用叫法 | 本文采用术语 | 说明 |
|---|---|---|
| 直立环、角度环 | 姿态环 | 内环,控制车身倾角。输入:目标角度、实际角度;输出:PWM基础量。 |
| 速度环 | 速度环 | 外环,控制车体速度。输入:目标速度、实际速度;输出:角度补偿量(给姿态环)。 |
| 方向环、转向环 | 转向环 | 独立环,控制车辆航向。通常与串级PID并联,输出叠加到左右电机差速上。 |
| P、I、D | Kp, Ki, Kd | 比例、积分、微分系数。 |
| 设定值、目标值 | Setpoint | 期望系统达到的状态,如目标速度=0,目标角度=0(竖直)。 |
| 反馈值 | Feedback | 传感器测量并处理后的实际系统状态,如实际速度、实际角度。 |
3. 环境准备与前置条件
在开始PID调试之前,你的硬件和底层软件必须达到可用的稳定状态。跳过这一步,后续所有调试都可能是徒劳。
3.1 硬件清单与检查
- 车模机械结构:确保重心在车轴附近且偏低,机械结构对称,轮胎不打滑,齿轮啮合顺畅,无卡顿。机械问题是许多“玄学”问题的根源。
- 主控板:STM32F4/F1系列或其他MCU。确保供电稳定,电机驱动模块(如TB6612、DRV8833)能提供足够且干净的电流。
- 传感器:
- IMU:MPU6050/MPU9250是主流。确保其牢固安装在车体中心轴上,与车体平行,减少振动传导。
- 编码器:AB相增量式编码器,分辨率越高越好。安装牢固,接线正确,确保计数方向与电机转向一致。
- 电源:使用动力电池(如2S/3S锂电池),并为单片机与传感器提供独立的稳压供电(如LM2596),避免电机噪声污染传感器电源。
3.2 软件框架与驱动
你需要准备好以下基础代码模块:
- 可靠的定时中断:用于控制周期性地执行PID计算与电机输出。周期通常为5ms或10ms(200Hz或100Hz)。必须保持严格恒定!
- 编码器读数:通过定时器编码器模式或外部中断,准确读取左右轮编码器计数值,并转换为速度(单位:cm/s 或 m/s)。
- IMU数据读取与融合:
- 通过I2C正确读取MPU6050的加速度计和陀螺仪原始数据。
- 实现互补滤波或卡尔曼滤波算法,输出俯仰角(Pitch)和俯仰角速度。
- 强烈建议先单独测试IMU模块,将融合后的角度波形通过蓝牙或串口发送到上位机(如匿名科创上位机、SerialPlot),观察在静止和手动摆动时,角度是否平滑、响应是否快速、有无明显漂移。
- 电机PWM输出:配置定时器产生PWM,并能根据控制量正负值实现电机的正反转控制。
核心检查点:在加入任何PID控制之前,你的车在手持状态下,通过串口打印的角度和速度数据应该是稳定、合理的。晃动车身,角度应快速变化;匀速转动轮子,速度值应平稳。
4. 核心流程拆解:四步调试法
这是本文的核心方法论。请严格按照此顺序进行,每一步都稳定后再进入下一步。
4.1 第一步:调平与传感器校准
目标:确保当小车物理上直立时,软件读取的“角度”和“角速度”为零。
- 机械调平:将小车放在绝对水平的桌面上,调整IMU模块的安装位置或通过软件偏移补偿,使俯仰角读数接近0度。
- 软件零偏校准:
- 将小车静止直立放置数秒,采集陀螺仪各轴数据,计算平均值作为零偏(
gyro_offset)。 - 在后续读取陀螺仪数据时,减去这个零偏。
// 示例:陀螺仪零偏校准(在初始化时进行) float gyro_sum = 0; for(int i=0; i<1000; i++) { gyro_sum += MPU6050_ReadGyroY(); // 假设Y轴是俯仰角速度轴 delay(1); } gyr_offset_y = gyro_sum / 1000.0; // 后续读取时 float gyro_y_raw = MPU6050_ReadGyroY(); float gyro_y = gyro_y_raw - gyr_offset_y; // 补偿后的角速度 - 将小车静止直立放置数秒,采集陀螺仪各轴数据,计算平均值作为零偏(
4.2 第二步:独立调试姿态环(直立环)
目标:让小车在不受外力干扰时,能像“不倒翁”一样稳定在直立位置。此时速度环不工作(输出为0)。
- 仅使用PD控制:直立环通常只需要比例(
Kp_angle)和微分(Kd_angle),积分(Ki_angle)容易引入振荡,一般不用。Kp_angle:恢复力系数。越大,小车回正力越强,但过大会导致高频抖动。Kd_angle:阻尼系数。越大,抑制角度变化的能力越强,系统越“稳”,但过大会响应迟钝。
- 调试方法(手持法):
- 将小车用手握住,悬空。
- 设置
Kp_angle为一个较小正值(如1.0),Kd_angle为0。 - 给小车一个小的倾斜,感受电机是否产生正确的抵抗方向(前倾时电机向前转)。
- 逐渐增大
Kp_angle,直到小车有明显“刚性”,试图保持角度。 - 加入
Kd_angle(如0.1),感受晃动小车时,是否有一种“粘滞”的阻尼感,松开手后小车的振荡是否快速衰减。 - 理想状态:小车在手中可以稳定在不同角度(因为你的手提供了外力平衡),且没有高频振动。松手让小车自由落体一小段距离,它能迅速产生抵抗动作。
姿态环伪代码示例:
// 在定时中断(如10ms)中调用 void Angle_PID_Update(void) { // 1. 读取融合后的角度(angle)和角速度(gyro) get_imu_data(¤t_angle, ¤t_gyro); // 2. 计算偏差(此时目标角度为0,即直立) float angle_error = 0 - current_angle; // 目标角度 - 当前角度 // 3. PD计算 float p_out = Kp_angle * angle_error; float d_out = Kd_angle * (-current_gyro); // 注意:微分项通常直接用角速度负反馈 // 为什么是负反馈?因为角速度为正表示向前倒,我们需要一个反向力(负输出)来阻止它。 // 4. 姿态环输出 balance_output = p_out + d_out; // 5. (此时速度环输出为0)最终输出到电机 motor_output = balance_output; set_motor_pwm(motor_output); }4.3 第三步:引入速度环,形成串级
目标:让小车能抵抗缓慢的外力推拉,并在受到推力后能自行回到静止(即速度为零)。这是实现定速巡航的基础。
- 速度环的作用:当小车受到向前推力时,它会有一个向前的速度。速度环检测到这个正速度,就会输出一个负的角度设定值给姿态环(命令车身后仰)。姿态环为了维持这个后仰角度,就会让电机向后转,从而产生制动力,使速度降回零。
- 调试方法(地面推车法):
- 先关闭速度环,确保姿态环单独工作良好。将小车放在地面上,它会因为无法平衡而倒下。
- 加入速度环,但只给很小的Ki_speed。速度环通常使用PI控制。
Kp_speed用于快速响应,Ki_speed用于消除静差。初期可以先设Kp_speed=0,Ki_speed为一个很小的值(如0.001)。 - 用手轻轻推小车,它应该会抵抗你的推力。松开后,它应该缓慢回到原点,而不是跑远或振荡。
- 关键观察:如果一松手小车就向反方向加速冲出去,说明
Ki_speed过大或极性错误。如果对推力毫无抵抗,说明Ki_speed过小或速度测量有问题。 - 逐渐微调
Ki_speed,直到小车能温和地抵抗推力并缓慢复位。然后可以尝试加入很小的Kp_speed来加快响应。
串级PID伪代码示例:
void Speed_Angle_Cascade_PID_Update(void) { // 1. 读取当前速度(编码器测量值) get_current_speed(¤t_speed); // 2. 速度环 PI 计算 (外环) float speed_error = target_speed - current_speed; // 目标速度常为0(静止) speed_integral += speed_error; // 积分项累加 // 积分限幅,防止饱和 if(speed_integral > INTEGRAL_LIMIT) speed_integral = INTEGRAL_LIMIT; if(speed_integral < -INTEGRAL_LIMIT) speed_integral = -INTEGRAL_LIMIT; float speed_output = Kp_speed * speed_error + Ki_speed * speed_integral; // speed_output 即为给姿态环的角度补偿量 // 3. 姿态环 PD 计算 (内环) get_imu_data(¤t_angle, ¤t_gyro); // 目标角度 = 速度环输出 (原本直立目标为0,现在加上速度环的补偿) float angle_target = speed_output; // 注意:这里可能需要对speed_output进行比例缩放 float angle_error = angle_target - current_angle; float p_out = Kp_angle * angle_error; float d_out = Kd_angle * (-current_gyro); // 4. 串级输出 motor_output = p_out + d_out; // 姿态环输出直接作为最终控制量 set_motor_pwm(motor_output); }4.4 第四步:调试转向环(如果适用)
目标:让小车能保持直线行驶或按设定转弯。转向环独立于直立-速度串级,其输出以差速形式叠加到左右电机。
- 输入:目标转向量(由路径识别算法给出,如摄像头中线偏差、电磁导引偏差)或目标角速度。
- 输出:左轮PWM增加/减少量,右轮PWM反向变化。
- 调试:先让小车原地旋转,调试转向环的响应。再结合速度进行直线调试。关键点:转向环的输出强度需要与车速匹配,高速时转向应更平缓。
5. 完整示例与代码实现
下面提供一个基于STM32 HAL库的简化版串级PID控制代码框架,重点展示结构。
5.1 数据结构定义
// pid.c / pid.h typedef struct { float target; // 设定值 float feedback; // 反馈值 float error; // 本次偏差 float last_error; // 上次偏差 float integral; // 积分项 float kp, ki, kd; // PID参数 float output; // 输出值 float output_max; // 输出限幅 float integral_max; // 积分限幅 } PID_Controller; void PID_Init(PID_Controller *pid, float kp, float ki, float kd, float out_max, float i_max) { pid->kp = kp; pid->ki = ki; pid->kd = kd; pid->output_max = out_max; pid->integral_max = i_max; pid->target = pid->feedback = pid->error = pid->last_error = pid->integral = pid->output = 0.0f; } float PID_Calculate(PID_Controller *pid, float target, float feedback) { pid->target = target; pid->feedback = feedback; pid->error = pid->target - pid->feedback; // P float p_out = pid->kp * pid->error; // I pid->integral += pid->error; // 抗积分饱和 if (pid->integral > pid->integral_max) pid->integral = pid->integral_max; if (pid->integral < -pid->integral_max) pid->integral = -pid->integral_max; float i_out = pid->ki * pid->integral; // D (采用不完全微分或直接使用反馈微分) float d_out = pid->kd * (pid->error - pid->last_error); // 或者用 -pid->kd * gyro pid->last_error = pid->error; pid->output = p_out + i_out + d_out; // 输出限幅 if (pid->output > pid->output_max) pid->output = pid->output_max; if (pid->output < -pid->output_max) pid->output = -pid->output_max; return pid->output; }5.2 主控制逻辑集成
// main.c 或 control.c #include "pid.h" #include "imu.h" #include "encoder.h" #include "motor.h" PID_Controller speed_pid; // 速度环 PID_Controller angle_pid; // 姿态环 // 转向环可以另设 float target_speed = 0.0f; // 目标速度,静止时为0 float target_angle = 0.0f; // 目标角度基准,直立时为0 float imu_angle, imu_gyro; // 融合后的角度和角速度 float motor_left_output, motor_right_output; float turn_output = 0; // 转向环输出 // 定时中断服务函数 (10ms) void Control_Loop_Callback(void) { // 1. 读取传感器数据 IMU_GetAngleGyro(&imu_angle, &imu_gyro); // 获取角度(度)和角速度(度/秒) float current_speed = Encoder_GetSpeed(); // 获取平均速度 (cm/s) // 2. 速度环计算 (外环) -> 输出为目标角度补偿量 float angle_compensation = PID_Calculate(&speed_pid, target_speed, current_speed); // 注意:angle_compensation 可能需要乘以一个缩放系数,将速度量纲转换为角度量纲 angle_compensation *= 0.05f; // 示例系数,需实际调整 // 3. 姿态环计算 (内环) -> 输出为基本PWM float angle_target = target_angle + angle_compensation; // 合成最终角度目标 // 姿态环微分项直接使用陀螺仪角速度负反馈,更稳定 float angle_error = angle_target - imu_angle; float p_out = angle_pid.kp * angle_error; float d_out = angle_pid.kd * (-imu_gyro); // 关键:负反馈 float balance_output = p_out + d_out; // 姿态环输出 // 4. 转向环计算 (并联) -> 输出为差速量 // turn_output = ... 根据路径识别算法计算 // 5. 合成最终电机输出 (基础直立量 ± 转向差速量) motor_left_output = balance_output + turn_output; motor_right_output = balance_output - turn_output; // 6. 输出限幅并驱动电机 MOTOR_Output_Limit(&motor_left_output, &motor_right_output, PWM_MAX); MOTOR_SetPwm(motor_left_output, motor_right_output); }5.3 初始化与参数设置
void Control_Init(void) { // 初始化传感器 IMU_Init(); Encoder_Init(); MOTOR_Init(); // 初始化PID控制器 // 姿态环: Kp较大提供恢复力,Kd提供阻尼,Ki=0 PID_Init(&angle_pid, 25.0f, 0.0f, 0.8f, 5000, 0); // 参数仅为示例起点 // 速度环: Kp较小或为0,Ki较小提供“韧性”,Kd=0 PID_Init(&speed_pid, 0.0f, 0.5f, 0.0f, 10, 100); // 输出限幅小,防止影响姿态环 // 启动定时器中断,周期10ms HAL_TIM_Base_Start_IT(&htim2); }6. 运行结果与效果验证
调试过程中,不能只靠“感觉”,必须有客观的验证手段。
6.1 上位机波形分析
使用串口将关键数据发送到上位机(如匿名科创上位机、SerialPlot、Vofa+),观察波形是调试的“眼睛”。需要发送的数据至少包括:
- 融合后的角度(
imu_angle) - 角速度(
imu_gyro) - 速度环输出(
angle_compensation) - 最终电机PWM输出(
balance_output) - 编码器测得的速度(
current_speed)
验证场景与预期波形:
- 手持静止:
imu_angle应在0度附近小幅波动,balance_output为应对微小晃动的调整信号。 - 轻推小车:
current_speed出现正负脉冲,angle_compensation随之产生反向脉冲(速度为正时,补偿为负),balance_output叠加此变化,产生制动力。速度归零后,所有信号应平稳回归。 - 突然施加干扰:观察系统的恢复时间和超调量。恢复应快速且平滑,无持续振荡。
6.2 实地跑车测试标准
- 静态直立:小车能在地面上长时间(>30秒)保持静止直立,无肉眼可见的高频抖动。
- 抗干扰性:用手指轻推车体,小车应能抵抗推力并在松手后1-2秒内平稳回到直立位置,不会来回摆动多次。
- 运动性能:给定一个小的目标速度,小车能平稳加速到该速度并保持。刹车时能平稳减速至停,不“点头”或后倒。
- 负载变化:在小车上增加少量配重,系统性能不应有显著恶化。
7. 常见问题与排查思路
调试过程就是不断遇到和解决问题的过程。下表列出了典型问题及其排查方向:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 小车完全不动或向一边倒 | 1. 电机输出极性反了。 2. 角度或角速度极性反了。 3. PID参数全为0或极小。 | 1. 手持小车,手动给一个角度,观察电机转向是否正确。 2. 查看上位机,角度前倾时是否为正,角速度前倾时是否为正。 | 1. 交换电机接线或代码中的PWM输出极性。 2. 检查IMU安装方向,必要时在代码中对角度/角速度取反。 3. 从小的 Kp_angle开始调试。 |
| 小车高频剧烈抖动 | 1. 姿态环Kp过大。2. 姿态环 Kd过小或为0。3. 控制周期不稳定或太慢。 4. 机械结构松动或电机齿轮间隙大。 | 1. 听电机声音,是否为高频啸叫。 2. 观察上位机PWM输出波形,是否为高频方波。 3. 检查定时器中断配置。 | 1.大幅降低Kp_angle。2. 增加 Kd_angle,提供阻尼。3. 确保控制周期固定(如10ms)。 4. 紧固所有机械部件。 |
| 小车缓慢周期性“点头” | 1. 速度环Ki过大,与姿态环产生低频振荡。2. 姿态环 Kd不足。 | 1. 观察点头周期,通常较慢(0.5-2秒)。 2. 暂时关闭速度环( Ki_speed=0),看是否消除。 | 1.降低Ki_speed,这是最常见原因。2. 适当增加姿态环 Kd_angle。 |
| 一推就跑,不回来 | 1. 速度环极性错误(Ki_speed为正?)。2. 速度环 Ki过大,积分饱和。3. 编码器方向错误。 | 1. 推车时,观察上位机速度环输出。速度为正时,输出应为负(命令后仰)。 2. 检查编码器计数方向。 | 1. 尝试将Ki_speed改为负值(或交换速度偏差计算顺序)。2. 减小 Ki_speed,并加入积分限幅。3. 修正编码器方向。 |
| 启动瞬间倒下 | 1. 上电时IMU未完成校准或数据异常。 2. 初始PWM输出不为0。 | 1. 检查上电后IMU数据是否稳定后再启动控制。 2. 确保控制循环开始时,所有输出为0。 | 1. 增加上电后1秒的IMU数据采集和校准时间。 2. 在控制使能前,将电机PWM强制设为0。 |
| 直线跑偏 | 1. 左右轮机械差异或摩擦力不同。 2. 左右电机PID参数未单独微调。 3. IMU安装不水平(横滚角不为0)。 | 1. 交换左右电机驱动线,看跑偏方向是否改变。 2. 查看静止时横滚角是否为零。 | 1. 对左右轮的速度环或转向环输出乘以一个微调系数。 2. 在代码中补偿横滚角零偏。 3. 考虑加入航向角(Yaw)闭环。 |
8. 最佳实践与工程建议
掌握了调试方法后,这些工程化技巧能让你的系统更鲁棒、更容易维护。
参数管理策略:
- 宏定义或配置文件:将所有PID参数定义为宏或存储在单独的配置头文件中,方便批量修改和版本管理。
- 在线调参:实现通过蓝牙或串口指令实时修改参数并保存的功能,能极大提升调试效率。
// 例如,通过串口发送 “kp_a 25.5” 来修改姿态环Kp输出限幅与积分抗饱和:
- 必须对每个PID控制器的输出进行限幅,防止突发错误导致电机全速转动。
- 对积分项进行限幅是防止“积分饱和”的关键,当系统长时间存在偏差时(如被卡住),积分项会累积到巨大值,一旦恢复,会导致系统剧烈震荡。
低通滤波:
- 对编码器测得的速度进行低通滤波,可以平滑速度信号,减少速度环的高频噪声。
- 对陀螺仪数据也可以进行轻度滤波,但需注意不要引入过大延迟。
// 一阶低通滤波示例 float low_pass_filter(float new_value, float old_value, float alpha) { return alpha * new_value + (1 - alpha) * old_value; // alpha ∈ (0, 1], 越小越平滑 } filtered_speed = low_pass_filter(raw_speed, filtered_speed, 0.3f);分阶段调试与日志记录:
- 严格按照传感器→姿态环→速度环→转向环的顺序调试。
- 每调好一个阶段,记录下当前的参数和对应的现象。这样当修改其他部分导致系统崩溃时,可以快速回退到稳定状态。
安全保护:
- 增加软件倾角保护:当检测到角度超过安全范围(如±45度)时,立即切断电机输出,防止“飞车”损坏硬件或伤人。
- 增加看门狗(Watchdog)定时器,防止程序跑飞。
9. 总结与后续学习方向
调试一辆稳定的直立车,是一个将理论(控制理论)、数据(传感器融合)和工程(代码与机械)紧密结合的过程。本文提供的“四步调试法”和串级PID框架,旨在为你建立一个清晰、可操作的调试路径,避免在参数海洋中盲目摸索。
本文的核心复盘:
- 理解串级:速度环是“指挥官”,给出战略意图(角度补偿);姿态环是“执行者”,负责战术实现(快速稳定)。两者带宽要匹配(内环快于外环)。
- 调试顺序是关键:先保证传感器数据靠谱,再让车能“站住”(姿态环),最后让它能“抵抗推拉”并“定速”(速度环)。
- 参数意义要清晰:
Kp决定响应强度,Kd决定系统阻尼,Ki消除静差但易引发振荡。在姿态环中慎用Ki。 - 工具不可或缺:上位机波形分析是调试的“眼睛”,没有它就像盲人摸象。
后续你可以深入的方向:
- 更优的控制算法:尝试模糊PID、自适应PID或线性二次型调节器(LQR),它们能提供更好的动态性能和鲁棒性。
- 运动规划:如何让小车更平滑地加速、减速、过弯?研究S曲线速度规划或梯形速度规划。
- 系统辨识:通过实验数据建立车模的数学模型,为高级控制算法提供设计依据。
- 全状态控制:除了角度和角速度,考虑将位置、速度也纳入统一的状态空间进行控制。
调试过程充满挑战,但当你看到小车稳稳立住并听从指挥的那一刻,所有的努力都是值得的。建议你将本文作为手边参考,在调试中结合自己的车模特性灵活运用。