学生会明白:计算机是照字面、一丝不苟地执行指令的,机器人做的是你真正说出口的那件事,而不是你心里想的那件事。他们要写出算法,也就是一份清晰的分步计划,先用日常语言写成伪代码,再把它变成一段由移动指令排成直线的程序,其中包含时间、距离和转向。运行之前先预测机器人会停在哪里,然后运行并对照结果。这一周只讲顺序:还没有循环、条件和传感器,只有精确、有序的指令,用来带着机器人穿过送货路线或迷宫抵达终点。
这一周结束时,你将能够
- 说明程序就是一串计算机按顺序、照字面、一丝不苟地执行的指令
- 在写代码之前,先把算法写成伪代码,也就是用日常语言表达的清晰分步计划
- 用距离、时间和转向指令,按正确的顺序控制机器人的路线
- 在运行程序之前先预测机器人会停在哪里,然后验证这个预测
- 只用一串指令,编程让机器人沿着送货路线或穿过迷宫抵达终点
学习
计算机是照字面执行指令的
机器人做的正是你说的那件事,而不是你想说的那件事。如果你说「向前走」却忘了说走多远,机器人猜不出来;它要么做错,要么干脆不动。计算机又快又不知疲倦,可它们没有常识。
这是本周最重要的一点。机器人出岔子的时候,它几乎总是在正确地执行你的指令,只不过你的指令并不是你真正想要的那样。
例如:「做个三明治」会失败,如果你没说「先把面包袋打开」; 只让机器人「转弯」却不说转多少,它就会转过头或者转不够; 「到门口去」对机器人来说毫无意义,它需要的是「前进 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用胶带在地板上贴出一条路线,设一个起点格、一个终点格,还有一两个拐弯。把那件小物件放在起点,当作要送的货。
- 2把路线描一遍,写出伪代码,例如「前进 40 厘米,向右转 90 度,前进 20 厘米,停」。
- 3量一量或者掐表测一次前进动作,弄清楚机器人能走多远,再把真实的距离或时间填进去。
- 4在应用里把这串指令搭好,按下开始(也就是那个事件),看着机器人沿路线走。
- 5如果它没到终点,就只改那条出错的指令(转向的度数或者前进的距离),然后再跑一次。
做成了是什么样:机器人照着这串指令从起点走到终点,带着货停在终点格上。
- 编程之前先写好了伪代码
- 程序是一串直线式的前进与转向指令
- 机器人到达终点并停在那里
安全:机器人行驶时,让手指、头发和宽松的衣服远离轮子。 把路线区域清空,别让机器人撞到人的脚或者桌腿。
如果不管用
- 机器人冲过了终点,或者没走到终点就停了
- - 调整那条前进指令的距离或时间;秒数上一点点变化就能让它挪出不小的一段。
- 机器人转过头了,或者转得不够
- - 检查转向的度数(四分之一圈可以试试 90 度),再确认是左转还是右转。
再往前一步:再加一次配送:把指令串延长,让机器人送完第一个终点格之后继续前往第二个。
先预测,再验证结果
机器人套件在运行一串给定指令之前,先预测机器人会停在哪里、朝着哪个方向,然后运行并对照。
- 拿一串简短的指令,在地图上用手描一遍。在纸上标出你认为机器人会在哪里结束、朝着哪个方向。
- 运行任何东西之前,先把你的预测定下来:先写出来。
- 运行程序,把真实结果和你的预测对照,并指出是哪条指令造成了差别。
预测你的套件机器人会停在哪儿
你需要:w3-m5, w3-m1, w3-m3
步骤
- 1拿一串 4 到 6 条的指令(你自己的或者别人给的),在贴好胶带的路线上描一遍。
- 2在记录页上,标出你预测机器人会停在哪一格、朝着哪个方向。
- 3运行这串指令,标出机器人实际停在了哪里。
- 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.
送货路线指令串
一串直线式的前进与转向指令,把机器人从起点带到终点格。只用顺序结构:没有循环、条件和传感器。
添加积木块
事件与执行
移动
变量与计数器
你的程序
- 前进
- 机器人(箭头指向它的朝向)
- 终点区(虚线框)
地图:一片 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.
迷宫顺序挑战
规划一串有序的前进与转向指令,带着机器人绕过那面墙到达终点,然后停下。运行之前先预测结果。只用顺序结构:没有循环、条件和传感器。
添加积木块
事件与执行
移动
变量与计数器
你的程序
- 前进
- 机器人(箭头指向它的朝向)
- 终点区(虚线框)
- 墙(灰色,带 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把步骤写成精确的指令
- 2在机器人上运行程序
- 3检查它有没有做到你预期的事
- 4把步骤规划成算法
2. 机器人一开始朝上。把这个程序走一遍。最后它朝哪个方向?
向右转 向右转 向左转
3. 你的机器人把整个程序都跑完了,做出来的事却不对。最可能是怎么回事?
4. 什么是顺序结构?
5. 什么是伪代码?
6. 你的机器人停到了正确的位置,方向却不对。你该检查哪条指令?
7. 在按时间来控制的套件上,你怎样才能让机器人在一条前进指令里走得更远?
已答 0 / 7
反思
你的反思会自动保存。
下周预告
下周机器人要长出感官了:我们会给它加一个传感器,让它能察觉周围的世界,而不是只会跑一串固定的指令。
- 把你最好的那份送货伪代码留着;你要拿固定指令串和一台会作出反应的机器人作比较。
- 给你的套件充好电,或者把模拟器加入收藏夹;走套件路线的,把传感器零件找出来。
- 回想一次:有没有哪回因为路上有什么变了,一套固定的步骤就失灵了?
完成第 3 周
完成以下内容,即可结束本周并解锁下一周:
- 在编程之前为你的送货路线写好伪代码 (not done yet)
- 编出一串能抵达终点的指令 (not done yet)
- 预测一次结果,并记录预测与实际 (not done yet)
- 知识检测至少答对 5 题中的 4 题 (not done yet)
- 写下你的反思 (not done yet)