第二章 运动控制基础回顾

各位同学,欢迎来到《AI运动控制》的第二讲。在正式进入AI与运动控制的结合之前,我觉得有必要先带大家把底层的「硬功夫」捋一遍。说白了,运动控制这行当,算法再花哨,最后都得落到电机怎么转、位置怎么准这些基本问题上。

我个人习惯是,不管项目多急,先花半天时间把基础元件的手册翻一遍。为什么?因为我在项目里吃过亏——有一次伺服电机选型差了一档,结果高速运行时扭矩不够,整个产线停了两天。嗯,从那以后我再也不敢轻视这些「老古董」了。

2.1 伺服电机与步进电机原理

这两种电机,是运动控制的两大「主力」。你想想看,一个追求精度,一个追求力矩,各有各的脾气。

2.1.1 步进电机:开环控制的「倔脾气」

步进电机的原理其实很简单:你把脉冲给它,它就转一个固定的角度。这个角度叫「步距角」,常见的是1.8°(也就是200步转一圈)。

核心特点:

  • 开环控制:没有反馈,给多少脉冲转多少步
  • 低频振动:转速低的时候,电机容易「抖」
  • 失步风险:负载突然变大,电机可能「丢步」
⚠️ 我曾经踩过的坑: 有一次做3D打印机,步进电机在高速时突然丢步,打印出来的模型直接「错层」。后来发现是加速曲线太陡,电机跟不上。所以,步进电机一定要配加减速曲线,别一上来就全速跑。

2.1.2 伺服电机:闭环控制的「精密仪器」

伺服电机就不一样了。它自带编码器,随时知道自己的位置。说白了,它是个「有脑子」的电机。

核心特点:

  • 闭环控制:位置、速度、电流三环反馈
  • 高精度:编码器分辨率可达23位(约838万脉冲/圈)
  • 响应快:加速时间可以做到毫秒级
对比项 步进电机 伺服电机
控制方式 开环 闭环
精度 步距角(1.8°) 编码器分辨率
低速性能 振动明显 平稳
高速性能 扭矩下降快 恒扭矩输出
成本

2.2 PID控制原理与局限

说到运动控制,PID是绕不开的话题。我刚开始做控制的时候,觉得PID就是「调三个参数完事」。后来发现,事情远没那么简单。

2.2.1 PID的「三兄弟」

PID说白了就是三个环节:

  • P(比例):当前误差有多大,我就给多大力量。调大了会震荡,调小了反应慢。
  • I(积分):把过去的误差累积起来,消除稳态误差。但积分饱和是个大坑。
  • D(微分):预测未来的误差趋势,提前刹车。但噪声会被放大。
// 位置式PID的离散实现
float pid_update(float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 比例项
    float p_out = Kp * error;
    
    // 积分项(带限幅)
    integral += error * dt;
    integral = clamp(integral, -integral_limit, integral_limit);
    float i_out = Ki * integral;
    
    // 微分项(带滤波)
    float derivative = (error - prev_error) / dt;
    derivative = lowpass_filter(derivative, cutoff_freq);
    float d_out = Kd * derivative;
    
    prev_error = error;
    
    return p_out + i_out + d_out;
}
💡 我的经验: 调PID有个「笨办法」——先把I和D设为0,只调P。让系统刚好不震荡,然后加一点I消除静差,最后加一点点D改善响应。别一上来就三个参数一起调,会疯的。

2.2.2 PID的「软肋」

PID虽然经典,但局限性也很明显:

  • 非线性系统搞不定:比如摩擦力变化、间隙、饱和
  • 参数整定麻烦:换一个负载,可能就得重新调
  • 无法预测未来:PID只看当前误差,不会「提前规划」

这也是为什么我们要引入AI。说白了,AI可以帮PID「开天眼」——提前知道路况,提前调整参数。

2.3 轨迹规划:梯形 vs S形曲线

电机怎么从A点跑到B点?直接全速冲过去?不行,那样会「过冲」或者「撞墙」。我们需要规划一条平滑的路径。

2.3.1 梯形速度曲线

梯形曲线是最简单的:加速→匀速→减速。优点是计算量小,缺点是加速度突变,会有「冲击感」。

// 梯形速度规划
void trapezoidal_plan(float total_dist, float v_max, float a_max) {
    // 计算加速段距离
    float accel_dist = v_max * v_max / (2 * a_max);
    
    // 判断是否达到最大速度
    if (2 * accel_dist <= total_dist) {
        // 有匀速段
        float cruise_dist = total_dist - 2 * accel_dist;
        float cruise_time = cruise_dist / v_max;
        // ... 生成轨迹
    } else {
        // 没有匀速段,三角形曲线
        float v_peak = sqrt(a_max * total_dist);
        // ... 生成轨迹
    }
}

2.3.2 S形速度曲线

S形曲线就「温柔」多了。它把加速度也做了平滑处理,加加速度(Jerk)是有限的。这样电机运动更平稳,适合精密定位。

🔧 实际项目建议: 如果做的是传送带、搬运这种粗活,梯形曲线就够了。但如果是芯片贴装、精密测量,必须用S形曲线。我在做晶圆搬运项目时,就因为用了梯形曲线导致晶圆片在加减速时「滑移」,后来换成S形曲线才解决。

2.4 编码器与反馈系统

没有反馈,运动控制就是「盲人摸象」。编码器就是电机的「眼睛」。

2.4.1 编码器类型

  • 增量式编码器:输出A、B两相脉冲,通过相位差判断方向。便宜,但断电丢位置。
  • 绝对式编码器:每个位置有唯一编码,断电不丢位置。贵,但省心。

2.4.2 反馈系统的「坑」

我遇到过最头疼的问题,是编码器信号受干扰。有一次在工厂调试,伺服电机总是莫名其妙地「抖动」。查了两天,最后发现是变频器的强电干扰了编码器线。从那以后,我所有项目都强制要求编码器线用屏蔽双绞线,而且远离动力线。

⚠️ 重要提醒: 编码器分辨率不是越高越好。分辨率太高,反馈频率跟不上,反而会引起震荡。一般伺服电机配17位(131072脉冲/圈)就够用了,除非是做纳米级定位。

本章知识体系

下面这张图,是我自己总结的运动控制基础框架。你可以把它当作一张「地图」,以后遇到问题,先看看是哪个环节出了岔子。

运动控制基础知识体系 运动控制系统 电机类型 PID控制 轨迹规划 编码器反馈 步进电机 伺服电机 比例P 积分I 微分D 梯形曲线 S形曲线 增量式 绝对式 核心:选对电机 → 调好PID → 规划轨迹 → 闭环反馈 AI的介入点:参数自适应、轨迹优化、故障预测

好了,这一章的内容就到这里。基础打牢了,后面我们才能放心地往系统里「塞」AI算法。下一章,我会带大家看看AI到底能在运动控制里扮演什么角色——是「锦上添花」还是「雪中送炭」?到时候你就知道了。


专注资料整理