搭建路径入门一个周末

做一台循迹机器人:从模拟器到真实赛道

一台你从头到尾都真正理解的循迹机器人——从它如何读取黑线,到为它转向的 PID 控制环——而且每个部分都先在仿真里调好,再动手搭建。

做一台循迹机器人:从模拟器到真实赛道 技术示意图SENSOR ERROR

循迹车是最好的第一台机器人:感知、决策、运动全有,每部分都简单到完全懂。这条制作路线就把它当路线——不是零件单加接线照片照抄,一节点一节点解锁,每步先懂机制再动手。

先懂一排红外(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

100%
搭建

给机器人接线

45 分钟

搭建

装配并在真实赛道上运行

60 分钟

目标

循迹车完成

你做出来了

元器件

本路径中的教程

接线之前先练习

用在线模拟器把它调好

搭建路径会经过一个浏览器实验台。先在这里把行为调对,再把参数迁移到真实的机器人上。

常见问题解答

开始这个项目之前需要先买零件吗?

不需要。整个项目中感知与控制这一半都在浏览器模拟器里运行,所以你可以在买任何东西之前,先弄懂循迹车如何读取黑线,并调好它的 PID 增益。只有最后的制作步骤——接线和装配——才需要实体的 Arduino、红外阵列和电机驱动。

做一台循迹机器人需要多长时间?

如果零件齐全,第一台能跑的循迹车就是一个周末的项目:花一个下午学习感知与控制并在模拟器里调好,然后花几个小时给 Arduino、红外阵列和电机驱动接线,再在胶带赛道上反复迭代。你在仿真里调好的参数可以直接搬过来用,这省掉了大部分反复试错。

做循迹车最难的部分是什么?

几乎总是控制环,而不是接线。要让机器人平稳地跟上缓弯而不蛇行,就得针对你具体的电机、传感器高度和速度来调 PID 增益。这正是这条制作路线让你先在模拟器里调参的原因——这样在机器人第一次接触地面之前,增益就已经八九不离十了。

为什么我的循迹车会绕着线来回振荡?

振荡通常意味着比例增益太高、微分阻尼太低,或者机器人跑得比传感器的更新频率所能支撑的更快。先降低基础速度,再把 Kp 降低约 20%,并加一点 Kd。在硬件上,循环里一个很长的 delay() 会引入死区时间,让微分项无论设得多高都不起作用——所以要保持控制周期固定。

循迹车需要几个红外传感器?

五个是一个实用的起点:足以算出平滑的加权位置、看出线往哪边弯,同时接线和位置计算都还容易检查。三个传感器可以应付低速、宽线的练习赛道;竞赛机器人常用八个,以便在高速下获得更细的分辨率,但每多一个传感器,就多一次标定、多一根要接对的线。

怎样标定红外反射阵列?

每次运行之前,让阵列缓慢扫过黑色胶带和白色板面,记录每个传感器的最小和最大读数,然后用这个范围对实时读数做归一化。标定之所以重要,是因为传感器高度、表面反射率和室内光照都会让原始值发生偏移,而一个没有标定的阵列即使在机器人居中时,也会让加权位置产生偏差。