跳到主要内容

第 3 周

把指令说明白

把一条路线变成清清楚楚的分步计划,再编程让机器人一步不差地照着走。

  • 60 至 75 分钟
  • 任务: 规划一串精确的前进与转向指令,预测它会在哪里结束,再编程让机器人沿着路线走到终点。

学生会明白:计算机是照字面、一丝不苟地执行指令的,机器人做的是你真正说出口的那件事,而不是你心里想的那件事。他们要写出算法,也就是一份清晰的分步计划,先用日常语言写成伪代码,再把它变成一段由移动指令排成直线的程序,其中包含时间、距离和转向。运行之前先预测机器人会停在哪里,然后运行并对照结果。这一周只讲顺序:还没有循环、条件和传感器,只有精确、有序的指令,用来带着机器人穿过送货路线或迷宫抵达终点。

这一周结束时,你将能够

  • 说明程序就是一串计算机按顺序、照字面、一丝不苟地执行的指令
  • 在写代码之前,先把算法写成伪代码,也就是用日常语言表达的清晰分步计划
  • 用距离、时间和转向指令,按正确的顺序控制机器人的路线
  • 在运行程序之前先预测机器人会停在哪里,然后验证这个预测
  • 只用一串指令,编程让机器人沿着送货路线或穿过迷宫抵达终点

学习

计算机是照字面执行指令的

机器人做的正是你说的那件事,而不是你想说的那件事。如果你说「向前走」却忘了说走多远,机器人猜不出来;它要么做错,要么干脆不动。计算机又快又不知疲倦,可它们没有常识。

这是本周最重要的一点。机器人出岔子的时候,它几乎总是在正确地执行你的指令,只不过你的指令并不是你真正想要的那样。

例如:「做个三明治」会失败,如果你没说「先把面包袋打开」; 只让机器人「转弯」却不说转多少,它就会转过头或者转不够; 「到门口去」对机器人来说毫无意义,它需要的是「前进 3 格,向左转」

程序就是一串按顺序执行的指令

程序是一份指令清单,机器人从上往下一条接一条地执行。每条指令都是一个小小的命令,比如「向前走」或者「向右转」。按次序把它们执行下来,就叫顺序结构。

次序很要紧。「先右转,再前进」和「先前进,再右转」会把机器人送到完全不同的地方,哪怕用的是同样几条指令。

例如:前进 2 格 -> 向右转 -> 前进 1 格; 把两条指令调换位置,机器人的落点就变了

事件让程序跑起来

程序要等到有什么把它启动了才会跑。这个启动的时刻就叫事件:按下「开始」按钮、点一下「被点击时」积木块,或者在模拟器里点「运行」。

这一周,每个程序最上面都有一个事件负责触发这串指令,接着指令就一路按次序跑到底。

例如:程序开头的「当按下开始时」; 在模拟器里点「运行」; 在套件的应用里点一下启动按钮

算法和伪代码:先规划,再编程

算法是完成一项任务的清晰分步计划,每一步都交代清楚,不留任何含糊的地方。在动手写真正的代码之前,工程师会先用日常语言把计划写出来,这份日常语言的计划就叫伪代码。

有了伪代码,你就能先把路线想清楚,暂时不用跟积木块较劲。你可以写「前进 3,向左转,前进 2,停」,确认它说得通,然后才把它搭成指令。

例如:伪代码:「前进 3 格,向左转 90 度,前进 2 格,停」; 算法里没有漏掉的步骤,也没有「你懂我意思」这种含糊地带

用时间、速度和转向来控制距离

这一周你用三件工具来操控机器人:它走多远(距离)、这个动作持续多久(时间)、它转多少(转向)。在很多套件上,距离是由时间和速度一起决定的:速度更快、时间更长,走过的路就更多。

转向让机器人原地旋转,通常按度数来算。转 90 度就是转四分之一圈,也就是一个直角,正好让机器人对准路线的下一段。转对角度,机器人才不会偏离航向。

例如:以速度 50 前进 2 秒; 向右转 90 度,正对着下一条走廊; 掉头 = 180 度,原路返回

先预测,再运行

运行程序之前先作个预测:用手指顺着指令走一遍,标出你认为机器人会停在哪里、朝着哪个方向。先把猜测定下来,某一步错了就会一目了然。

然后运行并对照。如果机器人停在了别处,这个差别正好告诉你该改哪条指令:也许某个转向写了 90 度、其实该是 180 度,或者某段前进少了一格。

例如:预测:「停在星星上,朝上」; 如果它提前一格就停了,说明某条距离指令给小了

要认识的词

程序:
计算机为完成一件活儿而遵循的一份指令清单。这一周,程序就是一串移动指令。
指令:
机器人能执行的一条命令,比如「向前走」或者「向右转」。
顺序:
指令一条接一条、按次序从上往下执行。次序很要紧。
算法:
完成一项任务的清晰分步计划,既不漏步骤,也不含糊其辞。
伪代码:
在把计划变成真正的代码之前,先用日常语言把步骤写下来。
事件:
让程序开始运行的那一刻,比如按下「开始」或者触发「被点击时」积木块。
时间:
一条指令持续多久,以秒计量:这是控制机器人走多远的一种办法。
距离:
一条指令让机器人移动多远,通常用厘米或网格的格数来设定。
转向:
让机器人原地旋转的指令,通常按固定的度数来转,比如 90 度。
速度:
电机转得有多快。速度越快,同样的时间里走的距离就越远。
预测:
运行程序之前,你对机器人会停在哪里作出的最佳判断。

注意安全

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

  • Caution:机器人运行程序时,让手指、头发和宽松的衣服远离轮子。
  • Caution:运行之前,把地板路线上的脚、书包和椅子腿清开,给机器人留一条安全的路。
  • Note:扮演机器人在地板网格上走动时要放慢脚步,免得有人绊倒。
  • Note:使用模拟器时如果眼睛累了,就短暂地离开屏幕休息一下。

动手做

选择你的路线

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

送货路线编程挑战

机器人套件

只用一串精确的前进和转向指令,编程让机器人沿路线或穿过迷宫从起点走到终点。

  • 看着地图,找出起点、终点,以及沿途的墙和拐弯处。先用手指把路线描一遍。
  • 动手搭建之前,先用日常语言把计划写成伪代码:按顺序写下前进、转向和距离。保持一串直线式的顺序结构:这一周没有循环、没有条件判断、也没有传感器。
  • 把伪代码变成指令,运行一遍;如果机器人没到终点,就把出错的那一条指令改掉。

用你的套件机器人跑一趟送货路线

你需要:w3-m5, w3-m6, w3-m1, w3-m2

步骤

  1. 1用胶带在地板上贴出一条路线,设一个起点格、一个终点格,还有一两个拐弯。把那件小物件放在起点,当作要送的货。
  2. 2把路线描一遍,写出伪代码,例如「前进 40 厘米,向右转 90 度,前进 20 厘米,停」。
  3. 3量一量或者掐表测一次前进动作,弄清楚机器人能走多远,再把真实的距离或时间填进去。
  4. 4在应用里把这串指令搭好,按下开始(也就是那个事件),看着机器人沿路线走。
  5. 5如果它没到终点,就只改那条出错的指令(转向的度数或者前进的距离),然后再跑一次。

做成了是什么样:机器人照着这串指令从起点走到终点,带着货停在终点格上。

重点看:
  • 编程之前先写好了伪代码
  • 程序是一串直线式的前进与转向指令
  • 机器人到达终点并停在那里

安全:机器人行驶时,让手指、头发和宽松的衣服远离轮子。 把路线区域清空,别让机器人撞到人的脚或者桌腿。

如果不管用

机器人冲过了终点,或者没走到终点就停了
- 调整那条前进指令的距离或时间;秒数上一点点变化就能让它挪出不小的一段。
机器人转过头了,或者转得不够
- 检查转向的度数(四分之一圈可以试试 90 度),再确认是左转还是右转。

再往前一步:再加一次配送:把指令串延长,让机器人送完第一个终点格之后继续前往第二个。

先预测,再验证结果

机器人套件

在运行一串给定指令之前,先预测机器人会停在哪里、朝着哪个方向,然后运行并对照。

  • 拿一串简短的指令,在地图上用手描一遍。在纸上标出你认为机器人会在哪里结束、朝着哪个方向。
  • 运行任何东西之前,先把你的预测定下来:先写出来。
  • 运行程序,把真实结果和你的预测对照,并指出是哪条指令造成了差别。

预测你的套件机器人会停在哪儿

你需要:w3-m5, w3-m1, w3-m3

步骤

  1. 1拿一串 4 到 6 条的指令(你自己的或者别人给的),在贴好胶带的路线上描一遍。
  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 行第 4 列,第 1 行第 5 列,第 1 行Goal zone at column 5, row 1Robot at column 1, row 1
  • 机器人(箭头指向它的朝向)
  • 终点区(虚线框)

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

就绪.

可以运行了。 · 0 steps

机器人状态

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

机器人在第 1 列、第 1 行,朝向右。 前方距离:4 格。 触碰:没有接触。 在线上:否。 光线: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 行第 1 列,第 2 行第 2 列,第 2 行第 3 列,第 2 行第 1 列,第 3 行第 2 列,第 3 行第 3 列,第 3 行Goal zone at column 3, row 3Robot at column 1, row 1
  • 机器人(箭头指向它的朝向)
  • 终点区(虚线框)
  • 墙(灰色,带 X)

地图:一片 3 × 3 的网格。 机器人从第 1 列、第 1 行出发,朝向右。 终点区在第 3 列、第 3 行。 有 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.

预测

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

怎样验证:运行这串指令,标出它真正停下的格子和朝向,再和记录页上你的预测对照。

怎样验证:数一数你最终跑通的那串指令有几条,再和你的猜测对照。

测试与改进

预测结果与实际结果记录

每次尝试之前,先写下你预测的终点格,然后运行这串指令,记录机器人实际停在了哪里。再记下你为下一次尝试改了哪条指令。

要测量的:历次尝试中预测的终点位置与实际终点位置的对比

第几次尝试预测的终点格实际的终点格为下次改动的指令

知识检测

回答这几题,检验一下你是否理解顺序、算法、伪代码,以及怎样控制机器人的路线。

  1. 1. 把编程让机器人完成一项任务的这些步骤按正确顺序排好。

    用箭头把它们排好顺序。

    1. 1把步骤写成精确的指令
    2. 2在机器人上运行程序
    3. 3检查它有没有做到你预期的事
    4. 4把步骤规划成算法
  2. 2. 机器人一开始朝上。把这个程序走一遍。最后它朝哪个方向?

    向右转
    向右转
    向左转
  3. 3. 你的机器人把整个程序都跑完了,做出来的事却不对。最可能是怎么回事?

  4. 4. 什么是顺序结构?

  5. 5. 什么是伪代码?

  6. 6. 你的机器人停到了正确的位置,方向却不对。你该检查哪条指令?

  7. 7. 在按时间来控制的套件上,你怎样才能让机器人在一条前进指令里走得更远?

已答 0 / 7

反思

你的反思会自动保存。

下周预告

下周机器人要长出感官了:我们会给它加一个传感器,让它能察觉周围的世界,而不是只会跑一串固定的指令。

  • 把你最好的那份送货伪代码留着;你要拿固定指令串和一台会作出反应的机器人作比较。
  • 给你的套件充好电,或者把模拟器加入收藏夹;走套件路线的,把传感器零件找出来。
  • 回想一次:有没有哪回因为路上有什么变了,一套固定的步骤就失灵了?

完成第 3 周

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

  • 在编程之前为你的送货路线写好伪代码 (not done yet)
  • 编出一串能抵达终点的指令 (not done yet)
  • 预测一次结果,并记录预测与实际 (not done yet)
  • 知识检测至少答对 5 题中的 4 题 (not done yet)
  • 写下你的反思 (not done yet)