跳到主要内容

第 5 周

让机器人作出反应

把传感器与循环、条件结合起来,让机器人自己对周围的世界作出反应。

  • 70 至 85 分钟
  • 任务: 编写一个能自己作出反应的机器人程序:它不断循环、查看传感器,并用「如果/否则」来避开障碍或沿线行驶。

这是编程的重头戏周。学生要把第 4 周的传感器和第 3 周的顺序结构,跟循环和条件组合到一起,让机器人能自己作出反应。他们会学到:循环负责重复步骤,无限循环会一直重复到有人叫停,而「重复直到」循环则一直跑到某个条件变成真为止。他们还会认识条件和布尔(真/假)判断,然后用「如果」和「如果/否则」来选择动作。他们要编写避障程序:循环、读距离传感器,一旦有东西靠近就转弯;还要探索循线,通过查看光线或颜色传感器来调整方向、始终压在线上。

这一周结束时,你将能够

  • 说明循环、无限循环和「重复直到」循环各自是怎样重复步骤的
  • 把条件描述成一次非真即假(布尔)的判断
  • 用「如果」在条件为真时才执行步骤,用「如果/否则」在两个动作之间作选择
  • 用循环读取距离传感器,并在有东西靠近时转弯,从而编出避障程序
  • 说明循线是怎样不停查看光线或颜色传感器,来调整方向、始终压在线上的

学习

循环:不用重写也能重复

第 3 周你是把每一步一条条排着写下来的。这样也行得通,但要是想让机器人查一百次传感器,你总不能把同一步写上一百遍。循环就是那种替你重复步骤的积木块。

普通的重复循环会把里面的步骤跑固定的次数,比如「重复 4 次:向前走、向右转」就能走出一个正方形。计数由循环来管,你的程序就能保持短小。

例如:重复 4 次,走出一个正方形; 重复 3 次,敲三下门; 重复 10 次,一点一点往前挪并查看

无限循环和「重复直到」循环

无限循环会把里面的步骤一遍遍地重复下去,自己永远不停:一直跑到你把程序停掉。机器人靠无限循环来持续观察世界,比如「一直循环:读传感器并作出反应」。

「重复直到」循环不一样:它一直重复,直到某个条件变成真,然后停下来继续往下走。「重复直到墙很近:向前走」的意思是一直往前走,但只要墙一近,就跳出循环。

例如:一直循环:不停查看距离传感器; 重复直到找到线:向前走; 重复直到按钮被按下:等待

条件非真即假(布尔)

条件是一个关于外界的问题,答案只能是「是」或「否」;在编程里我们说「真」或「假」。一个只可能是真或假的值,就叫布尔值。

「墙是不是比 10 厘米还近?」就是一个条件。此刻它可能为真;一秒之后机器人挪了位置,它可能就为假了。条件就是机器人把传感器读数变成一个可以据以行动的明确「是或否」的办法。

例如:墙近不近?-> 真或假; 传感器是不是在黑线上?-> 真或假; 按钮被按下了吗?-> 真或假

「如果」和「如果/否则」:选择该做什么

「如果」积木块只有在条件为真时才执行里面的步骤。「如果墙很近,就向右转」的意思是:只有真的有墙靠近了机器人才转弯,否则就跳过这个转弯。

「如果/否则」积木块则在两个动作之间挑一个:条件为真时执行一组步骤,为假时执行另一组。「如果墙很近就向右转,否则就向前走」的意思是:机器人总会做其中一件事,具体做哪一件取决于它感知到了什么。

例如:如果跟丢了线,就转弯把它找回来; 如果/否则:墙近 -> 转弯,否则 -> 向前走; 如果物品是红色的,就转向红色的箱子

避障 = 循环 + 传感器 + 如果/否则

现在把这些拼到一起。避障就是一个无限循环:读距离传感器,再用「如果/否则」来决定,有东西靠近就避开,否则继续往前开。由于这个循环每秒重复很多次,障碍物一出现,机器人立刻就有反应。

自动泊车的汽车和扫地机器人背后就是这个套路:感知、决定、行动,一遍又一遍,永不停歇。

例如:一直循环:读距离;近了就转弯,否则向前走; 在房间里到处碰壁绕行的扫地机器人; 绕开一块石头的火星车

循线:不停查看、随时调整方向

循线要用一个朝向地面的光线或颜色传感器。深色的线比浅色的地板反射的光更少,所以传感器能分辨出「在线上」和「离开线」。机器人一遍又一遍地查看,并调整方向,让自己始终压在线上。

有一条简单的规则:如果传感器看到线,就往一边打弯;否则就往另一边打回来。机器人从来不会走出一条笔直的路,它是沿着线的边缘一路扭来扭去、时时刻刻在纠偏。这种不停查看、不停调整,就是反应式行为。

例如:仓库机器人沿着地面上的胶带行驶; 工厂里沿着彩绘线路行驶的小车; 重复直到终点标记:一路循线前进

要认识的词

循环:
一种积木块,它替你把一个或多个步骤重复执行,省得你一遍遍地把它们写出来。
无限循环:
一种一直重复下去的循环,直到你把程序停掉为止。
重复直到:
一种循环,它会一直重复,直到某个条件变成真,然后停下来继续往下走。
条件:
一次关于外界情况的判断,比如「墙近不近?」,答案永远非真即假。
If:
一种积木块,只有条件为真时才执行里面的步骤,条件为假时就跳过。
如果/否则:
一种积木块:条件为真时执行一组步骤,为假时执行另一组步骤。
布尔值:
一种只能取两个值之一的数据:真或假。条件给出的答案就是布尔值。
避障:
一种行为:机器人不断循环、读取距离传感器,一旦有东西靠近就避开。
循线:
一种行为:机器人不停查看光线或颜色传感器,并调整方向,始终压在标出的线上。
反应式行为:
机器人根据自己实时感知到的情况改变做法,而不是照着一张固定的清单走。

注意安全

这一周动手搭建或运行机器人之前,先把这些读一遍。

  • Caution:会作出反应的机器人会自己改变方向,所以它行驶时,让手指、头发和宽松的衣服远离转动的轮子。
  • Caution:把胶带线和障碍赛道的道具都贴平放稳,并清空地面,免得运行时有人绊倒。
  • Note:常常保存你的积木程序,免得刷新浏览器时把成果弄丢。

动手做

选择你的路线

这门课你可以用机器人套件、浏览器模拟器,或者不插电、只用家里的材料来上。挑一条就行,随时可以换,你的成果不会丢。

避障程序

机器人套件

编程让机器人不断循环、读取距离传感器,并用「如果/否则」在有东西靠近时转弯、在前方畅通时前进。

  • 套路始终一样:无限循环,读距离传感器,然后「如果/否则」:有东西靠近就转弯,否则就往前走。
  • 先定好你的「靠近」规则(比如「小于 10 厘米就算近」)。然后把循环搭起来,让机器人在整个运行过程中一直都在作出反应。

用套件机器人躲开真实的障碍物

你需要:一套带距离传感器的机器人套件, 做障碍赛道用的纸箱或书本, 积木程序规划页

步骤

  1. 1摆几个障碍物(纸箱或书本),中间留出机器人能开过去的空隙。
  2. 2搭一个无限循环。在它里面读取距离传感器。
  3. 3加一个「如果/否则」:如果距离小于你设的「靠近」值,就转弯;否则就往前开一小段。
  4. 4运行起来,看着机器人一遍遍循环、感知,自己绕开这些障碍物。

做成了是什么样:机器人自己往前开,一有障碍物靠近就避开,全程不需要人操控。

重点看:
  • 程序用了无限循环(或重复循环)
  • 程序在循环里读取距离传感器
  • 程序用「如果/否则」在近了时转弯、畅通时前进
  • 机器人独立避开了至少一个障碍物

安全:机器人行驶时,手指要离轮子远一点。 给机器人一块干净的地面,别有电线和台阶。

如果不管用

机器人直愣愣地撞上障碍物
- 检查那个「如果」是不是真的在读传感器,以及当墙就在正前方时,你设的「靠近」值是不是比读数更大。
机器人在原地打转,停不下来
- 你的「靠近」值可能太大了,导致它总觉得旁边有东西;把它调小,或者在「否则」里加一小段前进。

再往前一步:再用「如果/否则」加一条规则,让机器人有时左转、有时右转,好从墙角里脱身。

循线探索

机器人套件

用光线或颜色传感器,配合「重复直到」和「如果」,让机器人始终沿着标出的线行进。

  • 循线是一种不停查看的行为:一遍又一遍地读光线或颜色传感器,并调整方向,让自己始终压在线上。
  • 一条简单的规则就够用了:如果传感器在线上,就往一边打弯;否则就往另一边打。再把它包进一个「重复直到」循环里,等机器人到达终点标记时结束。

用光线或颜色传感器沿胶带线行驶

你需要:一套带光线或颜色传感器的机器人套件, 浅色地板上的一条深色胶带线, 积木程序规划页

步骤

  1. 1在浅色地板上贴一条深色胶带线,两端各做一个清楚的起点和终点标记。
  2. 2把光线或颜色传感器朝下对着地板,分别看看它在线上和离开线时的读数。
  3. 3搭一个「重复直到(到达终点标记)」循环,里面放一个「如果」:如果传感器离开了线,就朝线的方向修正;否则就继续沿着边缘打弯。
  4. 4运行起来,看着机器人一路沿线扭着走,最后在终点停下。

做成了是什么样:机器人沿着胶带线行驶,一路左右修正,并在终点标记处停下。

重点看:
  • 程序在循环里读取光线或颜色传感器
  • 程序用「如果」(或「如果/否则」)根据读数来修正方向
  • 机器人在大部分路程上都大致压在线上
  • 机器人在终点标记处停下

安全:运行过程中让手指远离轮子。 把线贴得平平的,免得有人绊倒。

如果不管用

机器人一上来就跟丢了线
- 重新核对在线上和离开线时的读数,把阈值定在两者之间;这两个读数必须差得够明显。
机器人在原地打圈
- 把修正的转弯幅度调小;幅度一大,每次都会冲过头。

再往前一步:给线加一个弯道或一个分岔,再调整方向规则,让机器人照样跟得住。

给机器人编程

Build a program from blocks, then run it on the simulator. On the kit path, use the same steps in your robot's app; unplugged, act the blocks out on a floor grid. Your program saves on this device.

避障程序

一个无限循环,读取距离传感器,并用「如果/否则」在有东西靠近时转弯、在前方畅通时前进。

就绪

添加积木块

事件与执行

移动

控制

输出

变量与计数器

还没有。

你的程序

  • 前进
第 1 列,第 1 行第 2 列,第 1 行:墙第 3 列,第 1 行第 1 列,第 2 行第 2 列,第 2 行第 3 列,第 2 行Goal zone at column 3, row 1Robot at column 1, row 1
  • 机器人(箭头指向它的朝向)
  • 终点区(虚线框)
  • 墙(灰色,带 X)

地图:一片 3 × 2 的网格。 机器人从第 1 列、第 1 行出发,朝向右。 终点区在第 3 列、第 1 行。 有 1 面墙。

就绪.

可以运行了。 · 0 steps

机器人状态

1
1
朝向
前方距离
0
触碰
已按下
在线上
光线
80
在终点区内
碰撞次数
0
步数
0

机器人在第 1 列、第 1 行,朝向右。 前方距离:0 格。 触碰:已按下。 在线上:否。 光线:80。 不在终点区内。

日志输出

还没有记录任何内容。

  • Heads up: This program has no safe stop behavior. Add a safe stop so the robot stops when it is done or blocked.

循线程序

一个「重复直到」循环,每一步都读取光线或颜色传感器,并用「如果」把机器人拉回线上,到终点标记处停下。

就绪

添加积木块

事件与执行

移动

控制

输出

变量与计数器

还没有。

你的程序

  • 前进
第 1 列,第 1 行:线第 2 列,第 1 行:线第 3 列,第 1 行:线第 4 列,第 1 行:线第 5 列,第 1 行:线Goal zone at column 5, row 1Robot at column 1, row 1
  • 机器人(箭头指向它的朝向)
  • 终点区(虚线框)
  • 线(虚线条纹)

地图:一片 5 × 1 的网格。 机器人从第 1 列、第 1 行出发,朝向右。 终点区在第 5 列、第 1 行。 一条线横跨 5 格。

就绪.

可以运行了。 · 0 steps

机器人状态

1
1
朝向
前方距离
4
触碰
没有接触
在线上
光线
20
在终点区内
碰撞次数
0
步数
0

机器人在第 1 列、第 1 行,朝向右。 前方距离:4 格。 触碰:没有接触。 在线上:是。 光线:20。 不在终点区内。

日志输出

还没有记录任何内容。

  • Heads up: This program has no safe stop behavior. Add a safe stop so the robot stops when it is done or blocked.

预测

Commit to a guess before you test - then see how close you were. Your predictions save automatically.

怎样验证:对着一堵墙把程序跑三次,把机器人实际的表现和你的预测对照一下。

怎样验证:把读取传感器那一步挪到循环外面,运行一下,看机器人还会不会对突然出现的障碍物作出反应。

测试与改进

避障可靠性测试

把机器人摆在一个障碍物前面,运行程序。记录它有没有及时避开。从同一个起点重复三次。

要测量的:三次尝试里,机器人成功避开障碍物的有几次

Try有没有避开障碍物?(是/否)它做了什么

知识检测

回答这几题,检验一下你是否理解循环、条件,以及机器人是怎样作出反应的。

  1. 1. 判断这句话是对还是错。

    无限循环过几秒钟就会自己停下来。

  2. 2. 循环在程序里起什么作用?

  3. 3. 无限循环和「重复直到」循环有什么区别?

  4. 4. 像「墙近不近?」这样的条件,答案只能是:

  5. 5. 「如果/否则」积木块是干什么的?

  6. 6. 避障是怎么工作的?

已答 0 / 6

反思

你的反思会自动保存。

下周预告

下周你那台会反应的机器人不会总那么听话,所以我们要学着排查问题,让它每一次都稳稳当当地跑起来。

  • 把你的避障程序和循线程序保存好;下周我们会把它们的某些版本弄坏,再修好。
  • 留意今天你的机器人有哪一次反应错了:那就是一个可以带到第 6 周的问题。
  • 给你的套件充好电,或者把模拟器加入收藏夹。

完成第 5 周

完成以下内容,即可结束本周并解锁下一周:

  • 搭出一个带循环、传感器读取和「如果/否则」的避障程序 (not done yet)
  • 用光线/颜色传感器和循环探索循线 (not done yet)
  • 做三次反应尝试并记录结果 (not done yet)
  • 知识检测至少答对 5 题中的 4 题 (not done yet)
  • 写下你的反思 (not done yet)