Scratch巡线小车:从颜色侦测到比例控制的调参全攻略 📅 发布时间:2026/9/17 3:02:07 👁 浏览次数: 简介面向少儿编程教育的超级轨迹赛项目资料包围绕图形化编程与巡线程序展开适合零基础学生及机器人竞赛入门者。项目包含赛车巡线、障碍转向、自动停止等典型任务同时提供快车软件版本便于从积木式编程向文本编程过渡。压缩包共七十一个文件以源码文件、巡线配置程序、运行文件、工程文件及说明文档构成整体仅七百四十八千字节结构紧凑。目前已有六百七十四人学习下载包内包含多条赛道方案及程序更新说明文档可帮助读者理解巡线逻辑、传感器模拟与条件循环的实际运用。通过搭建控制指令并对比不同版本能有效培养逻辑思维与问题拆解能力为参加超级轨迹赛或进一步探索科技项目打下基础。1. 一条黑线跑起来超级轨迹赛的 Scratch 巡线原型多数人以为巡线比赛比的是速度其实比的是对线的敏感度。这套超级轨迹赛资源包不是一个成品小游戏而是把机器人竞赛里经典的循迹任务搬进了 Scratch 图形化环境让孩子第一节课不是背语法而是看着一辆小车怎么咬住黑线。包里 E3 Line5_scratch 版本适合刚入门图形化编程的孩子E2 快车版本则像是一座从积木向文本语言过渡的桥。整套设计围绕颜色侦测和双轮差速展开闭环反馈集中在几块积木里。带竞赛的老师可以拿它当蓝桥杯 scratch 初级组巡线题的课前缩略版自学者则可以反复拆装、调参、观察现象从坐标和变量里真正理解反馈控制。2. 巡线原理与亮度判定传感器模拟、阈值与 P 型控制2.1 从物理巡线到 Scratch 颜色侦测实体巡线小车底部装有两到三个红外或灰度传感器黑线反射率低白底反射率高传感器返回的数值差被单片机用来决定打轮方向。Scratch 没有物理传感器替代品是颜色碰到积木它比较角色某个像素点与设定颜色的 RGB 距离返回真假值。注意这个侦测是连续的不是离散的 0 或 1两个颜色越接近越容易判定为碰到。这一点正好映射真实灰度传感器接近黑线时数值连续变化的特性。所以搭建巡线场景时背景用纯白底加纯黑线赛车车头下方额外放一个直径 4 像素的圆形侦测角色用它去读颜色。比赛场地的线宽通常为 15~25 毫米换算到 Scratch 舞台一般是 18~24 像素。线太细时侦测角色会同时覆盖黑线和白底亮度值被平均控制就会失灵。常见做法是把线宽固定为 20 像素再微调侦测角色大小。2.2 阈值与亮度为什么不能只写如果碰线就转初学者容易写出的逻辑是碰到线就往左否则往右。这种单阈值判断在直角弯和细线上会疯狂抖动因为是/否丢掉了一个关键信息——偏离程度。真实灰度传感器返回的是范围值黑线附近低白底附近高正确做法是把这个连续值映射成偏差量再参与控制。Scratch 的亮度积木正好提供 0~100 的连续值黑线亮度接近 0白底亮度接近 100。可以让侦测角色在循环里不断读取亮度并存入变量当绿旗被点击 将 [亮度值] 设为 0 重复执行 将 [亮度值] 设为 亮度 如果 (亮度值) (50) 那么 将 [转向变量] 设为 ((50) - (亮度值)) 否则 将 [转向变量] 设为 ((50) - (亮度值)) 结束 结束这个代码用 50 作为中位阈值转向变量保存的是当前亮度与阈值的差。当亮度为 20 时偏差为 30亮度为 80 时偏差为 -30。这里的正负号代表线在车头的哪一侧为接下来的比例控制做准备。注意如果背景和线的反光情况特殊固定阈值 50 不总是最优需要先校准。2.3 手动校准阈值从亮度表到判定边界我一般会让赛车分别停在白底和黑线上用侦测角色读取白底亮度white和黑线亮度black阈值取两者的中点。把采样过程写成一个简单的按键程序当按下 [空格 键] 将 [white] 设为 亮度 等待 1 秒 将 [black] 设为 亮度 将 [阈值] 设为 (((white) (black)) / (2))按下空格后先把车拖到白底程序会记录白底亮度一秒钟后需要立刻把车拖到黑线上程序记录黑线亮度并算出阈值。不同场地的测量值差异很大见下表场地情况whiteblack计算阈值普通打印黑线92850地面反光801246灰底深色线602040反光严重时黑线的亮度会升高如果继续用 50 做阈值很可能把灰白区域也当成线导致赛车在东张西望中乱转。灰底场地则相反白底亮度不高60 的阈值可能让赛车以为已经压线。每到一个新场地至少做一次这样的采样再继续调参。2.4 最简单的比例控制P 型巡线比例控制的公式是转向量 Kp × 偏差。Kp 是比例系数偏差就是上文算出的转向变量。左右轮速度用基础速度加/减转向量得到将 [左轮速度] 设为 ((基础速度) ((Kp) * (转向变量))) 将 [右轮速度] 设为 ((基础速度) - ((Kp) * (转向变量)))假设赛车在线的左侧侦测点略微压到黑线亮度低于阈值偏差为正左轮加速、右轮减速赛车向右修正。当赛车回到线正上方时亮度约等于阈值偏差为 0两轮速度相等赛车直行。Kp 过大会造成蛇形摆动Kp 过小则过弯时拉不回来。初次调试时 Kp 从 1.5 开始每次加 0.5观察车身抖动。正确的状态是直道几乎不摆弯道能平稳划出弧线。3. E3 Line5_scratch 实车调参积木逻辑、轮速配置与落地复现3.1 E3 Line5 的文件结构与角色设计打开超级轨迹赛.rar里面的E3 Line5_scratch_e3 Line_160510最有价值。从时间戳看这是 2016 年 5 月 10 日前后对 E3 方案 Line5 巡线策略的一次迭代。工程里通常包含一个黑线赛道背景、一个赛车角色、一个颜色侦测辅助角色。用 Scratch 2.0 或 3.0 都能打开但 3.0 打开 2.0 工程时亮度积木需要从侦测分类里重新确认否则会出现积木置灰。赛车角色的旋转模式必须设置成左右翻转否则车头朝向改变时角色整个倒转侦测点的位置也会异常。第二件事是在车头正中放一个很小的颜色标记这个标记用于和背景线条做碰撞对比。很多工程直接用赛车角色自身的颜色碰到积木但那样采样点会跟随车身旋转发生偏移。我一般会建一个独立的侦测子角色直径 4 像素放在车头前方 12 像素处每帧用移到 赛车刷新它的坐标让它始终对准车头方向。3.2 运动核心双轮差速的积木实现Scratch 没有轮子积木需要用移动步数和旋转角度模拟差速效果。E3 工程里常见的做法是维护左轮和右轮两个速度变量然后用平均速度推动小车前进用左右轮速度差推动转向当绿旗被点击 将 [基础速度] 设为 4 将 [Kp] 设为 2 重复执行 将 [亮度值] 设为 亮度 将 [偏差] 设为 ((阈值) - (亮度值)) 将 [左轮] 设为 ((基础速度) ((Kp) * (偏差))) 将 [右轮] 设为 ((基础速度) - ((Kp) * (偏差))) 将 [平均速度] 设为 (((左轮) (右轮)) / (2)) 移动 (平均速度) 步 右转 ((((左轮) - (右轮)) / (2)) * (0.3)) 度 结束这段代码中移动 平均速度 步保证赛车不会因为左右轮速度相加而原地卡死右转 ((左轮-右轮)/2 × 0.3)把两轮速度差映射成角度变化。系数 0.3 是转向灵敏度取决于赛车造型的中心点位置。如果只移动不转向车会直直冲出赛道只转向不移动车会在原地打转。两个积木必须同时存在。还有一个细节阈值要用第二章校准出来的结果不要用写死的 50。3.3 速度参数表和弯道调试调参是巡线项目最花时间的环节。建议把下面的表抄下来每跑一圈记录现象和当前参数参数名典型范围起始值过大表现过小表现基础速度2~84弯道冲出线直线太慢比赛吃亏Kp0.5~42蛇形摆动弯道拉不回来转向灵敏度0.1~0.50.3原地猛甩转向作用不明显阈值30~70校准值把灰边当线检测时断时续最典型的失败是过弯时赛车冲上白底。先不要动 Kp把基础速度降到 3如果仍然冲线再把 Kp 提升到 2.5。每次只改一个参数改完至少跑三圈。注意 Kp 提高后的蛇形抖动往往在直道末端如果抖动出现在弯前说明转向灵敏度也需要同步降低到 0.25。E3 工程的赛道如果包含十字交叉线需要增加判断当三个采样点同时看到黑线时按上次的偏差方向继续走而不是立刻归零。3.4 检查线宽与采样点大小如果赛车巡线时忽左忽右但亮度值读取正常问题多半在采样点与线宽的匹配。4 像素的侦测角色在 20 像素宽的线上工作良好但如果线宽只有 8 像素采样点同时压住黑线和白底亮度值被平均到 50 左右系统会误以为车在线中央。临时把采样点颜色改成红色跑一圈观察红色区域是否完全在线内。如果红色区域频繁压出线外就把采样点直径改成 2 像素或者把背景黑线描粗到 20 像素。提示线宽和采样点比例失衡时调 Kp 和阈值都没有意义先改形状再调参数。E3 方案的优势在于使用了左、中、右三个采样点。左右两个前置采样点能在车头进入弯道前检测到线条边界产生预判效果。实现时在侦测角色之外再复制两个角色分别放在车头左右 8 像素处每个角色各自读取亮度并写入自己的变量控制逻辑取三个偏差中绝对值最大的那个参与计算。4. E2 快车版对比与排错从 Scratch 到文本化控制的边界4.1 E2 快车的定位文本化编程的前奏E2 快车 scratch并不是另一个图形化版本而是一个用更紧凑的 Scratch 工程去模拟文本化编程思路的变体。它把巡线算法封装进一个自定义积木里用大量变量暴露中间计算结果相当于把以后要移植到 Python 或 C 的算法骨架先搭出来。E2 和 E3 的核心区别在于E2 用单传感器 比例控制完成基础巡线E3 用左中右三采样点 加权融合处理更多赛道形状。E2 的工程结构更适合教学中讲解输入—处理—输出一个亮度变量输入两个轮速变量输出中间只做一次乘法和加减法。4.2 变量作用域和坐标系的差异图形化编程里最容易被忽略的是变量作用域。E2 工程里可能同时存在两个同名变量一个是全局的检测偏差另一个只在侦测角色内使用。Scratch 的全局变量所有角色都能读写但如果你在赛车角色里读取亮度积木读到的是赛车所在位置的颜色而不是侦测辅助角色的。E2 快车版最常见的错误就在这里侦测角色已经发现了线控制逻辑却写在赛车角色里读取的还是赛车本体的亮度导致明明有色块却检测不到。解决办法是让侦测角色把亮度结果写入一个全局变量当前亮度控制角色只读这个变量。一个角色负责感知另一个角色负责决策中间用变量传递信息。这种职责分离的设计在文本语言里对应函数封装和参数传递。打开 E2 工程后如果发现赛车左摇右晃但变量面板里的检测偏差始终不变就可以确定是变量读取位置错了。4.3 常见问题检测不到线、震动、冲线检测不到线时先检查采样点颜色与线条颜色是否匹配。Scratch 的颜色比较基于 RGB 距离如果你用油漆桶填充的纯黑与线条的近黑不一致会出现大量漏检。更稳定的做法是通过亮度校准来回避 RGB 差异只要亮度跨度足够大颜色是否严格相同就不再重要。车身震动多来自 Kp 过高但还有一种情况是转向角度没有做限幅。有些人直接用右转 ((左轮) - (右轮)) 度当偏差为 60、Kp 为 2 时左右轮差为 120转向角 120 度赛车会直接跳头。需要在代码里限制转向角最大不超过 45 度将 [转向角] 设为 ((((左轮) - (右轮)) / (2)) * (0.3)) 如果 (转向角) (45) 那么 将 [转向角] 设为 45 否则 如果 (转向角) (-45) 那么 将 [转向角] 设为 (-45) end end 右转 (转向角) 度这段限幅逻辑对 E2 和 E3 都有效。冲线问题则多发生在直角弯和发卡弯因为单采样点没有前瞻能力等侦测点完全进入弯道才反应已经太晚。E3 的前置左右采样点就是为了解决这个问题而存在的。4.4 E2 与 E3 的选择参考对比维度E2 快车E3 Line5传感器采样点1 个3 个左中右控制复杂度单比例控制比例控制 预判适合年龄刚学变量和循环已能调试多条件逻辑排错难度低变量少中需要观察变量面板赛道适应性简单曲线直角、交叉、急弯如果孩子刚接触 Scratch 巡线先用 E2 把单点阈值和比例控制搞清楚如果目标是蓝桥杯 scratch 初级组真题或青少年等级考试图形化编程中的巡线题再切换到 E3。两者内核完全一致从 E2 到 E3 的迁移成本很低只是多了一个求最大偏差的步骤。5. 提速与稳线发车、急弯和计数停止的实用技巧5.1 发车时先直行 0.3 秒发车位置经常在白底上如果直接进入巡线循环偏差很大赛车会瞬间往一边猛打。解决办法是设置一个发车直行阶段让赛车先以固定速度向前走几步等侦测到线后再切换到巡线逻辑。示例代码将 [发车中] 设为 1 重复执行直到 (发车中) (0) 移动 4 步 如果 (亮度值) (阈值) 那么 将 [发车中] 设为 0 end 结束这里发车中是布尔标志当侦测角色连续一次读到亮度小于阈值时认为车已经骑上黑线退出直行循环。为了避免弯道刚起步时误判可以改成连续 3 次低于阈值再退出。发车阶段不要用右转积木让车保持当前方向直线移动。5.2 急弯的临时降低比例系数急弯处偏差会突然变大此时如果仍使用直线上的 Kp转向量会瞬间拉满导致过冲漂移。一个实用做法是用亮度变化率动态调整 Kp。实现方式是记录上一次亮度值把本次亮度与上次亮度的差作为变动幅度当变动幅度大于 25 时把 Kp 临时乘以 0.6将 [上次亮度] 设为 亮度值 将 [亮度变化率] 设为 ([绝对值] 使 () 取绝对值) (((亮度值) - (上次亮度))) 如果 (亮度变化率) (25) 那么 将 [当前Kp] 设为 ((Kp) * (0.6)) 否则 将 [当前Kp] 设为 Kp 结束这个逻辑相当于在 PID 控制器里做了一个当误差微分较大时降低比例增益的变体虽然不规范但在 Scratch 竞赛里比完整 PID 更容易调通。注意当前Kp要与基础 Kp 区分开避免把基准值也覆盖掉。5.3 用变量记录圈数并自动停车比赛通常要跑两到三圈到达目标圈数后赛车需要停稳。用圈数变量记录经过起跑线的次数起跑线处画一条与赛道垂直的深色标记作为触发点。避免弯道误判的两种手段一是只允许在赛车方向角接近正北90 度时计数二是使用布尔变量防止同一圈内重复计数。当绿旗被点击 将 [圈数] 设为 0 将 [目标圈数] 设为 2 将 [亮过标记?] 设为 是 重复执行 巡线一步 如果 (方向) (80) 且 (方向) (100) 那么 如果 (亮度值) (阈值) 那么 如果 (亮过标记?) 是 那么 将 [圈数] 增加 1 将 [亮过标记?] 设为 否 结束 否则 将 [亮过标记?] 设为 是 结束 结束 如果 (圈数) (目标圈数) 那么 将 [基础速度] 设为 0 结束 结束亮过标记?的作用是当赛车正在黑线上时如果还没有记录过这一次就记录并翻转布尔值等赛车离开标记区域后布尔值恢复为是为下一圈做准备。这样即使标记线宽度超过一个循环帧也不会重复计数。最后基础速度设为 0 后移动步数变为 0赛车停止。这个计数逻辑可以直接移植到蓝桥杯 scratch 初级组真题的巡线题目中也可以用在青少年等级考试图形化编程里的顺序控制题型中作为到达指定圈数自动停止的标准模板。5.4 用计时器检验稳定性判断巡线参数是否稳定不要靠肉眼。打开舞台的计时器让车连续跑 10 圈把每圈耗时记录到一个列表变量。按下空格圈数增加时用计时器减去上一圈时间得到单圈耗时。如果单圈耗时波动超过 0.5 秒说明 Kp 或转向灵敏度仍需微调。波动来自直道上的蛇形摆动累计偏差通常把 Kp 降低 10% 就能改善。等 10 圈耗时稳定后把 Kp 提高 10% 再测试找到临界抖动点最终参数取临界值的 70%。这个做法能让发车、弯道和计数逻辑都在同一组参数下压缩出最佳成绩。本文还有配套的精品资源点击获取