姓名:______________________________
日期:____________________
第 6 周
调试与可靠性
查清机器人为什么不听话(是机械、程序还是传感器的问题),并证明它每一次都能跑好。
70 至 85 分钟
要点
调试到底是在做什么
每次运行程序,你脑子里都装着两个结果:预期结果(「应该」发生什么)和实际结果(「确实」发生了什么)。两者对得上,机器人就是正常的。对不上,就说明有问题,而调试就是那种查明它们为什么不一致的侦探工作。
问题的三大家族
问题一共分三大家族,能叫出是哪一族,事情就成了一半。机械问题是机器人身体上的实体故障:轮子松了、线缆拖在地上、齿轮打滑。程序问题是指令上的错误:数字写错、少了一块积木,或者积木顺序不对。传感器问题是感知上的毛病:读数不好、阈值设成了错误的数值,或者传感器该校准了。
变量和计数器:存放并跟踪数值
有时候程序需要记住一个数字。变量就是一个有名字的小盒子,里面装着一个值,而这个值在程序运行时可以变。计数器是一种专门用来计数的变量:它从零开始,每发生一次事情就加一,比如机器人每躲开一个障碍物就加一。
可靠性:用反复试验来证明
只成功过一次的机器人,说不定只是运气好。可靠性指的是一遍又一遍正确完成同一件活儿,而且没有证据你就不能这么宣称。证据就是可靠性试验:你把同一件任务跑好几遍,每一遍都用同样的测试用例,并且每一遍都写下预期结果和实际结果。
要认识的词
- 调试:
- 弄清楚机器人的实际结果为什么和预期结果不一样,然后把它修好,这整个过程就叫调试。
- 变量:
- 程序里一个有名字的存放处,里面的值在程序运行过程中可以改变。
- 计数器:
- 一个用来计数的变量:它从某个数字开始,每发生一次事情就加一。
- 存放的值:
- 程序放在变量里的一个数字或信息,方便日后取用或修改。
- 校准值:
- 你测出来并保存下来的一个数字,好让传感器的读数含义正确,比如白色地板的亮度值。
- 预期结果:
- 程序运行正确时「应该」发生的事,也就是你在测试之前作出的预测。
- 实际结果:
- 你真的把机器人跑起来之后「确实」发生的事,由你亲眼观察并记录下来。
- 测试用例:
- 你为了测试而特意布置出来的一个具体情境,比如「一堵正好在 15 厘米处的墙」。
- 机械问题:
- 机器人身体上的实体故障,比如轮子松了、线缆拖在地上,或者齿轮卡死了。
- 程序问题:
- 指令上的错误:某个积木块或数字写错了、漏掉了,或者顺序不对。
- 传感器问题:
- 感知环节出的岔子:读数不好、阈值不对,或者传感器需要重新校准。
- 可靠性:
- 机器人一遍又一遍正确完成同一件活儿的本事,靠反复试验来证明。
你的活动
「问题侦探」任务
目标:诊断一台不听话的机器人:判断问题属于机械、程序还是传感器,然后把它修好。
- 每个任务都先写下预期结果和实际结果。两者之间的差距,就是你要调查的症状。
- 问一问三大家族的问题:这是实体故障(机械)、指令出错(程序),还是感知不准(传感器)?动手之前先靠症状猜一猜。
- 每次只改「一样」东西,再跑一遍,并记下实际结果现在是不是和预期一致了。
写下发生了什么:
三次运行的可靠性试验
目标:把同一件任务跑三遍,每一遍都把预期结果和实际结果对照,以此证明机器人是可靠的。
- 挑一件明确的任务和一个测试用例(每一遍的布置都完全一样)。预期结果只写一次,因为三遍都一样。
- 把任务跑三遍,两遍之间「什么都不许改」。逐次记下实际结果,并在「一致吗?」栏里标上是或否。
- 三次都一致,就说明在这个测试用例上它是可靠的。只要有一次不一致,那就是个问题,用「问题侦探」的步骤去追。
写下发生了什么:
障碍物计数器
目标:用一个变量当计数器,机器人每躲开一个障碍物就加一,最后再把这个存放的值读出来。
- 开头先把计数器变量设成 0。机器人每感知到并躲开一个障碍物,就给计数器加 1。
- 这就是一个存放的值:计数器记着一共处理了多少个障碍物,你在最后可以查看它。
- 先预测赛道上有几个障碍物,再把你的预测和计数器的最终值对照一下。
写下发生了什么:
预测
动手测试之前,先写下你的猜测。
做三次运行的可靠性试验之前,先预测哪一遍(如果有的话)会和预期结果对不上,以及为什么。
碰机器人之前先看「问题侦探」上的症状:预测这个问题属于哪一族,是机械、程序还是传感器。
对于障碍物计数器,在跑赛道之前先预测最终存放的值会是多少。
测试并记录
三次运行的可靠性测试
挑一件任务和一个测试用例。预期结果只写一次,然后什么都不改,把同一件任务跑三遍。逐次记下实际结果,以及这一遍对没对上。
记录:三遍里,每一遍的实际结果是否和预期结果一致
| Run | 预期结果 | 实际结果 | 一致吗?(是/否) |
|---|---|---|---|
问题诊断记录
每个调试任务都记下症状、你怀疑的问题家族、你尝试的那一处改动,以及它有没有把差异解决掉。
记录:到底是哪一族的问题,以及一处有针对性的改动有没有把它修好
| 症状 | 怀疑的家族 | 尝试的那一处改动 | 修好了吗?(是/否) |
|---|---|---|---|
知识检测
逐题作答。选择题请把最合适的答案圈出来。
诊断一下最可能是哪一类问题。
一台循线机器人昨天还好好的。今天它每次都径直冲过了那条线,可代码根本没改过。今天房间亮得多。
- A.程序问题
- B.需要重新校准的传感器问题
- C.机械问题
- D.机器人彻底坏了
什么是调试?
- A.让机器人跑得更快
- B.弄清楚实际结果为什么和预期结果不一样,然后把它修好
- C.把整个程序删掉重写
- D.给机器人多装几个传感器
一台机器人上周还走直线。它的程序没改过,可现在每一遍都往一边打弯。这最可能属于哪一族问题?
- A.程序问题
- B.传感器问题
- C.机械问题
- D.根本没有问题
什么是计数器?
- A.一种测量距离的传感器
- B.一个从某个数字开始、每发生一次事情就加一的变量
- C.一个让机器人停下来的积木块
- D.机器人的电量
在可靠性试验里,「预期结果」指的是什么?
- A.你把机器人跑起来之后实际发生的事
- B.程序运行正确时「应该」发生的事
- C.机器人身上传感器的数量
- D.可能跑出来的最快时间
在可靠性试验里,为什么要把同一件任务跑三遍?
- A.为了证明机器人一遍又一遍都能行,而不是碰巧成功了一次
- B.因为前两遍只是练手
- C.为了让电池更快耗光
- D.因为只跑一遍是违规的
反思
有哪一处改动,你是因为测试过才改的,而不是靠猜的?
把任务跑三遍,跟只跑一遍相比,让你对自己的机器人多知道了些什么?
为什么每次只改一样东西会让调试更容易?你这么做的时候,出了什么岔子(或者顺利在哪儿)?