做一台循迹机器人:从模拟器到真实赛道
一台你从头到尾都真正理解的循迹机器人——从它如何读取黑线,到为它转向的 PID 控制环——而且每个部分都先在仿真里调好,再动手搭建。
循迹车是最好的第一台机器人:感知、决策、运动全有,每部分都简单到完全懂。这条制作路线就把它当路线——不是零件单加接线照片照抄,一节点一节点解锁,每步先懂机制再动手。
先懂一排红外(IR)传感器怎么变成一个转向误差,比例-积分-微分(PID)环怎么把误差变成平滑运动。五个传感器是第一台的甜点:三个低速行但位置粗,八个高速分辨率细但接线标定复杂。把读数压成一个带符号数的加权平均——线左负、线右正——是转向环见过的唯一信号,所以这数算对比选什么板子重要得多。
这个信号接下来必须变成两个不同的轮速。差速驱动意味着机器人靠让两个轮子以不同转速转动来转向,而这条技术路线会带你从最基础的电机驱动出发,经过脉宽调制(PWM),再到把一个修正量变成左右两侧指令的运动学。你还会看到里程计在其中的位置:数清轮子转了多少,就能知道走了多远,以及为什么这个估计在没有外部参考时会漂移——而这个主题会在每一台迷宫机器人身上重新出现。
在花钱或者冒着接错线的风险之前,先在浏览器模拟器里把行为调好:画一条赛道,改变传感器数量和间距,拖动比例、积分、微分增益,同时观察误差、单圈时间和在赛道上的时间。模拟器是一个教学模型而不是硬件:它假设赛道平整且高对比、是二值的,假设标定完美、环境光不变、主循环完全周期化且没有轮子打滑。在这里得到的增益可以直接搬过去当作一个接近的起点,但你仍然要在自己的胶带赛道上重新标定阵列并重调参数。
只有到这一步才去接真实的机器人:反射阵列的输出接到支持模拟输入的引脚,PWM 和方向信号接到 L298N(逻辑引脚无法提供电机电流——真正切换电流的是双 H 桥),电机电源走独立的一路,并用一个共地把所有模块连在一起。最后一个节点是在真实胶带赛道上装配和迭代,把模拟器的增益搬过来,并针对表面材质、电池电压和循环时序做调整。同样的结构稍后还会出现在线迷宫机器人里——它在这台循迹车上又加了一层决策——所以把这个基础打扎实,等于省下两遍时间。
技术树从上往下跟。每节点前置做完解锁,进度存这台设备,周末做完不丢位置。
物料单
| 零件 | 数量 | 约价 | 说明 |
|---|---|---|---|
| Arduino Uno 或 Nano | 1 | $5–8 | Nano 这里更好:引出 A6、A7,8 通道阵列装得下 |
| 红外反射阵列 | 1 | $4–10 | 学用 5 通道,想跑快 8 通道。坚持模拟输出 |
| L298N 或 TB6612FNG | 1 | $2–4 | 买新的 TB6612FNG——L298N 烧成热的约 1.5 V 留住 |
| TT 减速电机 | 2 | $4 | 小黄人。编码器版贵 $2,省一次返工 |
| 两轮底盘带轮万向轮 | 1 | $6–10 | 一般和电机成套卖 |
| 电池包 | 1 | $3–8 | 6×AA 镍氢,或带保护座 2×18650。别 9 V 方块 |
| 杜邦线、胶带、开关 | — | $5 | 赛道 19 mm 哑光电工胶带 |
**合计约 $30–45。**单里最值的升级是带编码器的电机——这项目不用,但循迹几乎总长成线迷宫,那个要。
赛道:**哑光浅地面贴哑光黑胶带。**亮胶带错角度反得像白,亮地面一样,车这面好使那面跪,看着像软件问题。
怎么连
| 从 | 到 | 为什么要紧 |
|---|---|---|
阵列 VCC、GND |
Arduino 5 V、GND | 耗电的是发射管——8 通道阵列 100–200 mA |
阵列 OUT1–8 |
A0–A7 | 模拟,每通道一只。Nano 胜 Uno 就这 |
驱动 PWMA、PWMB |
D9、D3 | 必须 PWM 脚 |
| 驱动方向脚 | D8、D7、D5、D4 | 任一数字脚 |
驱动 STBY(只 TB6612FNG) |
D12,拉 HIGH | 悬空悄无声息纹丝不动 |
电池 + |
驱动 VM / +12V |
绝不 Arduino 5 V 脚 |
电池 − |
驱动 GND、Arduino GND、阵列 GND | 一个共地,并以星形接回同一个点 |
有两种故障占了大多数首次上电出现的问题,而且两者都不会给出任何报错。缺少共地会让方向信号失去参考,于是所有接线看上去都正确,机器人却一动不动。电机电流流经 Arduino 会让 5 V 电源轨下垂,导致板子复位,看上去像是软件崩溃。
里程碑制作
别整车接完再调。一阶段一测试,不过的阶段藏进下阶段。
| # | 里程碑 | 测试 | 通过长这样 |
|---|---|---|---|
| 1 | 电机转 | 架空每轮正反 200 占空比 | 两轮都正反转;记每轮启动占空比 |
| 2 | 死区量出来了 | 占空比从 0 开始,每次加 5 往上爬 | 你手里有了两个数,而且它们不一样——常常差 5 到 10 |
| 3 | 走直线 | 在地面上让两轮前进 2 m | 偏差不到 10 cm;否则在软件里微调其中一台电机 |
| 4 | 传感器读 | 线上地面打印全通道 | 每通道两读数差几百 |
| 5 | 标定 | 线上扫 3 s,打印归一值 | 地面 0,线上近 1000,每通道 |
| 6 | 位置 | 手推车过线,打印加权位置 | 平滑单调——线过传感器边界无跳 |
| 7 | 只用 P | 只开比例增益,不要 I 也不要 D | 它能跟上平缓的弯道,略有蛇行。这一步出现蛇行是正常的 |
| 8 | 加上 D | 加大微分,直到蛇行被压住 | 在直线和缓弯上都能平滑跟踪 |
| 9 | 整圈 | 闭环跑急弯 | 整圈不丢线 |
| 10 | 丢线恢复 | 跑中途把车拿离线 | 朝已转方向转,不直行 |
里程碑 6 是大多数人跳过、而且不该跳过的一步。如果位置信号在黑线从两个传感器之间穿过时会跳变,任何控制环都调不好——这个不连续点在控制器看来就是一个突然出现的巨大误差,机器人每一圈都会在那个位置猛地一顿。这种跳变意味着要么阵列没有逐通道标定,要么某个通道的阈值把它过早地排除在外了。
做好长什么样
| 测量 | 入门 | 调好 |
|---|---|---|
| 直道速度 | 0.15–0.25 m/s | 0.4–0.6 m/s |
| 直道上的蛇行幅度 | ±15 mm | ±5 mm 以内 |
| 抓住的最急弯 | 约 30 cm 半径 | 约 15 cm 半径 |
| 循环频率 | 50 Hz | 200 Hz 或更高 |
| 丢线前能跑几圈 | 几圈 | 一直跑下去,直到电池电压下垂 |
循环频率值得特别关注,因为它会在暗中限制其它所有指标。一个跑在 50 Hz 的控制循环每 20 ms 才看一次线,而在 0.5 m/s 的速度下,两次决策之间机器人已经走了 10 mm。把循环里的每一个 delay() 都去掉、并且只读取你真正用到的传感器,通常就能把第一台机器人的循环频率从 50 Hz 提升到几百赫兹,而跟踪效果会在不动任何增益的情况下变好。
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 纹丝不动 | 无共地或 STBY 低 |
地全连;STBY 拉 HIGH |
| 一跑板子复位 | 电机电流过 Arduino | 电机独立供电;只共地 |
| 直穿线不停 | 阵列无标定或太高 | 这面重标定;离地 3–8 mm |
| 跟但晃得厉害 | P 太大或 D 太小 | P 对半再加 D |
| 振荡越来越快 | P 远远太大 | 一直减小到它稳定下来,再从那里开始调 |
| 在直道上漂移 | 两台电机不一致 | 在软件里做微调,然后在你实际的速度下复测 |
| 只在低速时跑偏 | 两个不同的静摩擦阈值 | 分别测量并分别补偿两台电机的死区 |
| 急弯丢线 | 太快或阵列离轮太近 | 减速;阵列前移多提前量 |
| 丢线后径直开走 | 丢线时把误差置为 0 | 改为保持上一次的误差——因为 0 的含义是“已居中” |
| 跑着跑着就变差 | 电池电压下垂,增益不再合适 | 正常现象;闭一个速度环,或者接受更短的运行时长 |
| 窗边跪 | 环境红外 | 关发射相减或罩住阵列 |
下一步去哪
循迹车是刻意设计成一块地基的,下面有三个方向可以直接从它长出来:
加上路口检测,它就变成了线迷宫机器人——底下的 PID 循环一模一样,只是在上面加了一层很薄的决策层,用来分辨岔路并记住走过的路线。这是最好的下一个项目,因为它把这里的一切都复用了,只新增一个真正的新想法。
加上编码器,你就能保持指令速度而不是指令占空比,这会彻底消除“电池电量下降就越跑越差”的问题,并让整趟运行中的调参结果保持稳定。
跑得更快,这听上去简单,学到的东西却最多。速度会把每一个近似假设都暴露出来:循环频率成为极限,阵列需要更靠前以获得提前量,弯道必须在到达之前减速而不是之后,轮胎也开始打滑。最后这一条就是那道墙——关于它的位置,见轮子打滑与附着力。
项目路线图
搭建路径
沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。
已完成 0 / 15
元器件
本路径中的教程
- 入门 · 阅读约 20 分钟制作循迹机器人:从传感器到 PID 转向从红外反射传感器到加权误差,再到平滑的 PID 转向——循迹机器人究竟是如何工作的。
- 入门 · 20 分钟读取用于循迹的红外反射传感器阵列把一排红外传感器的读数变成一个平滑的线位置,用它来控制转向。
- 入门 · 阅读约 18 分钟用 PWM 与 H 桥电路控制直流电机用 PWM、H 桥和符合实际的电流限制,安全地接线并控制一台有刷直流电机。
- 中级 · 阅读约 20 分钟用车轮编码器实现差速驱动里程计把左右轮的运动积分成移动机器人的位姿,再识别并标定漂移。
- 入门 · 阅读约 18 分钟如何整定 PID 控制器:一份实用指南一套动手整定 P、I、D 增益的顺序,不再靠猜——以及如何实时尝试每一步。
接线之前先练习
用在线模拟器把它调好
搭建路径会经过一个浏览器实验台。先在这里把行为调对,再把参数迁移到真实的机器人上。
常见问题解答
开始这个项目之前需要先买零件吗?
不需要。整个项目中感知与控制这一半都在浏览器模拟器里运行,所以你可以在买任何东西之前,先弄懂循迹车如何读取黑线,并调好它的 PID 增益。只有最后的制作步骤——接线和装配——才需要实体的 Arduino、红外阵列和电机驱动。
做一台循迹机器人需要多长时间?
如果零件齐全,第一台能跑的循迹车就是一个周末的项目:花一个下午学习感知与控制并在模拟器里调好,然后花几个小时给 Arduino、红外阵列和电机驱动接线,再在胶带赛道上反复迭代。你在仿真里调好的参数可以直接搬过来用,这省掉了大部分反复试错。
做循迹车最难的部分是什么?
几乎总是控制环,而不是接线。要让机器人平稳地跟上缓弯而不蛇行,就得针对你具体的电机、传感器高度和速度来调 PID 增益。这正是这条制作路线让你先在模拟器里调参的原因——这样在机器人第一次接触地面之前,增益就已经八九不离十了。
为什么我的循迹车会绕着线来回振荡?
振荡通常意味着比例增益太高、微分阻尼太低,或者机器人跑得比传感器的更新频率所能支撑的更快。先降低基础速度,再把 Kp 降低约 20%,并加一点 Kd。在硬件上,循环里一个很长的 delay() 会引入死区时间,让微分项无论设得多高都不起作用——所以要保持控制周期固定。
循迹车需要几个红外传感器?
五个是一个实用的起点:足以算出平滑的加权位置、看出线往哪边弯,同时接线和位置计算都还容易检查。三个传感器可以应付低速、宽线的练习赛道;竞赛机器人常用八个,以便在高速下获得更细的分辨率,但每多一个传感器,就多一次标定、多一根要接对的线。
怎样标定红外反射阵列?
每次运行之前,让阵列缓慢扫过黑色胶带和白色板面,记录每个传感器的最小和最大读数,然后用这个范围对实时读数做归一化。标定之所以重要,是因为传感器高度、表面反射率和室内光照都会让原始值发生偏移,而一个没有标定的阵列即使在机器人居中时,也会让加权位置产生偏差。