收藏 分享(赏)

乐高ROBOLAB教程chapter05.pdf

上传人:HR专家 文档编号:6250508 上传时间:2019-04-03 格式:PDF 页数:63 大小:3.38MB
下载 相关 举报
乐高ROBOLAB教程chapter05.pdf_第1页
第1页 / 共63页
乐高ROBOLAB教程chapter05.pdf_第2页
第2页 / 共63页
乐高ROBOLAB教程chapter05.pdf_第3页
第3页 / 共63页
乐高ROBOLAB教程chapter05.pdf_第4页
第4页 / 共63页
乐高ROBOLAB教程chapter05.pdf_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、基于乐高组件和 ROBOLAB 软件的工程教学 第五章 第五章 蓝 带 本章可获得的“技能牌” : 基于乐高组件和 ROBOLAB 软件的工程教学 第五章 5.1 蓝带挑战 老实说,当处理高级技能牌时,创造设计挑战需要你使用特定的技巧,有一定的难度。问题是挑战变得非常枯燥,不再有趣。对于本章和第六章,你不会像前面章节那样可以发现许多设计挑战。我们希望高级技巧能应用于大量的机器人竞赛中或者让学生使用这些技巧来完成前面的设计挑战。 5.1.1 快速行走(第二次) 挑战 :设计和搭建一个机器人,使用光电传感器测量了高马达的转矩与转速之间的关系。 此书授权西觅亚翻译。版权所有 2技能牌 : 和 高级

2、数据采集 基本 G-代码 步骤 : 实验设置: 在前面第二章中我们介绍了应用角度传感器的挑战,现在我们想要你使用一个光电传感器和一块黑白相间的圆盘取代它。教师将会提供你所使用的校准重物。 机器人设计:为了完成这个关系,你需要设计和搭建一个机器人,该机器人能够缠绕一条绳并在末端携带重物。使用光电传感器和一块黑白相间的圆盘你可以记录光电传感器的数据, 然后根据数据运行FFT(快速傅立叶变换)决定乐高马达的RPM(每分钟转数) 通过改变绳上的重物或者/和轮毂的直径, 你可以改变乐高马达的转矩。你需要采集大约1520个数据点。 程序: 记录光电传感器的数值。你需要使用编程级别4或者级别5运行一个短暂的

3、采样率。使用计算工具4或者5根据数据运行FFT,确定电机的转速。 奖励(附加半分) : 大多数马达都不对称,通过测量,它们在向前和向后的方向上都具有不同的特性。要想获得附加半分,你需要在两个方向上测量转矩和转速。 评分:你的教师将评估你所得出的转矩转速曲线的精度。 基于乐高组件和 ROBOLAB 软件的工程教学 第五章 5.1.2 疯狂寻食(第二次) 挑战 :搭建一个机器人,机器人在随机寻找食物时可以发出“嗡嗡声”,当它发现食物时停止并播放一段音乐。如果超过15秒钟没有发现任何食物。 高级 任务 技能牌 : 步骤 : 实验设置: 需要的所有装备是一个供所有机器人自由行走的区域和放在区域内的一些

4、明暗分明的彩色带子。 机器人设计:你所搭建的机器人应当与某种动物类似。(在寻找食物时)你所搭建的机器人必须可以自由行走(用腿或轮子)并且安装有一个用来检测地板上是否存在食物的光电传感器。 程序: 你可能会使用多任务,在访问电机和蜂鸣器时可能会产生一些错误,为避免资源冲突你需要使用任务优先级。 评分 : 成绩中,机器人的性能占50%,创意和美观占 50%。 性能 创意和美观 A: 机器人能找到食物并发出求救 B: 机器人能找到食物 C: 机器人能行走并发出声响 D: 机器人能行走 F: 没有可以演示的东西 A+:最好 A: 卓越 B: 好 C: 不错 D: 无特点 F: 惨不忍睹! 本挑战是根据

5、Gage和Murphy在“Principles and experiences using LEGOs to te ach behavioral robotics“ proceedings of the 33rd ASEE/IEEE Frontiers in Education Conference, Session F4E, Boulder, CO, November 2003提出的内容描述的。 此书授权西觅亚翻译。版权所有 3基于乐高组件和 ROBOLAB 软件的工程教学 第五章 5.1.3 积木回收(第二次) 挑战 :使用摄像头设计和搭建一台及其,并为此机器编程,使其根据乐高积木的颜色进

6、行分类。 摄像头 技能牌 : 步骤 : 实验设置:本项挑战只需要一些 2X4 的积木块:4 块黑色的,4 块白色的和 2 块蓝色的。蓝色积木块是“挑战套装”的积木难分类。 机器人设计:指导老师将会随机把一些积木放入你所设计的机器中。你的机器把积木移动到摄像头前面,然后根据颜色把它们分类到三个桶中的一个桶内。更多的创意分是根据你不需要人来装载或者帮助定向积木。本挑战你会用到摄像头和一个或多个马达。你也可以考虑使用触动传感器。 编程:你需要使用视频中心,把摄像头用作传感器。 提示:对于环境光,摄像头是非常灵敏的。特别要注意背景。(例如:当摄像头查看时,在墙后面是什么?) 评分 : 成绩中,机器人的

7、性能占75%,创意和美观占 25%。 性能 创意和美观 A+:最快、最正确分捡出积木 A: 正确分拣出 9 块积木 B: 正确分拣出 6 块积木 C: 正确分拣出 4 块积木 D: 可以移动积木 F: 未搭建可以演示的东西 A+: 最好 A: 卓越 B: 好 C: 不错 D: 无特点 F: 惨不忍睹! 此书授权西觅亚翻译。版权所有 4基于乐高组件和 ROBOLAB 软件的工程教学 第五章 5.1.4 积木回收3 挑战 :使用摄像头设计和搭建一台机器,并为此机器编程,使其根据乐高积木的颜色进行分类。 摄像头 技能牌 : 步骤 : 实验设置:本项挑战只需要一些 2X4 的积木块(颜色随意) :4

8、块黑色的,4 块白色的和 2 块蓝色的。2X3 积木块是“挑战套装”的积木难分类。 机器人设计:指导老师将会随机把一些积木放入你所设计的机器中。你的机器把积木移动到摄像头前面,然后根据颜色把它们分类到三个桶中的一个桶内。更多的创意分是根据你不需要人来装载或者帮助定向积木。(例如:指导老师把积木块倒进计量器内) 本挑战你会用到摄像头和一个或多个马达。你也可以考虑使用触动传感器。 编程:你需要使用视频中心,把摄像头用作传感器。 提示:对于环境光,摄像头是非常灵敏的。特别要注意背景。(例如:当摄像头查看时,墙后面是什么?) 评分 : 成绩中,机器人的性能占75%,创意和美观占 25%。 性能 创意和

9、美观 A+:最快、最正确分捡出积木 A: 正确分拣出 9 块积木 B: 正确分拣出 6 块积木 C: 正确分拣出 4 块积木 D: 可以移动积木 F: 未搭建可以演示的东西 A+: 最好 A: 卓越 B: 好 C: 不错 D: 无特点 F: 惨不忍睹! 此书授权西觅亚翻译。版权所有 5基于乐高组件和 ROBOLAB 软件的工程教学 第五章 5.1.5 随机自动唱片点唱机 挑战 :设计,搭建一台机器并为其编程,使它能够投掷一枚标准的 6 面骰子,然后使用摄像头确定骰子的数字,机器根据此数字播放对应音乐。 此书授权西觅亚翻译。版权所有 6技能牌 : 和 摄像头 高级结构 步骤 : 实验设置:你需要

10、的是一个骰子,一个摄像头和一些音乐。 机器人设计:你的机器人需要能够以一种重复方式翻转(摇晃)骰子。由于摄像头用于检查骰子的点数,每次都必须控制骰子在摄像头的前面。 编程:你需要使用视频中心,把摄像头用作传感器。六首音乐必须存储在独立的子程序中,当骰子上的对应数字被确定后就开始播放。 提示:对于环境光,摄像头是非常灵敏的。特别要注意背景。(例如:当摄像头查看时,在骰子面是什么?) 评分 : 成绩中,机器人的性能占60%,创意和美观占 40%。 性能 创意和美观 A+:能够正确可靠的投掷骰子,鉴别数字并且播放音乐 B: 能够正确鉴别 5 个数且播放正确的音乐C:能够正确鉴别 3 个数且播放正确的

11、音乐D:机器人可以掷骰子,但不能鉴别数字 F:未搭建可以演示的东西 A+: 最好 A: 卓越 B: 好 C: 不错 D: 无特点 F: 惨不忍睹! 本挑战来源于塔辅茨大学搭建的机器人项目。如果你想观看本挑战的结果,可以在互联网上找到图片(也可能是录像)。 基于乐高组件和 ROBOLAB 软件的工程教学 第五章 高级结构5.2 高级结构技能牌 高级结构介绍了循环计数器及子程序VIs的概念。子程序VIs被用于组织和优化大的程序。我会先抓住循环计数,简单来说,那是最简单的。 5.2.1 循环计数器 到现在你已经对基本结构非常熟悉了(循环,跳转,分支等),这是因为你大量使用这些功能。你有没有想过NXT

12、怎么知道还有多少个循环需要执行呢?循环计数器是一个特殊的容器,用来记录还有多少循环未执行。(参考表5.1)。循环一次,循环计数器就减1。唯一的区别就是循环容器从N-1减到0,因此,当你指定5次循环时,循环计数容器从4开始减到0。 图5.1 .循环计数器记录循环次数 下面这个程序使用了一个灵活方式记录20个光电传感器的读取值。当触动传感器被触发时,把光电传感器的读数存储到一个容器中,每个读数都放在不同的容器中。我们使用循环读数器变量取代普通容器使用的tl参数(参考图3.37)。回忆#0容器是红色的,#1容器是蓝色, #2容器是黄色的等等。循环计数容器每次循环后都发生改变,我们就利用这个条件(例如

13、,它减少一个)。因此,在触动传感器被触发后,光电传感器的读数被填充到#19容器中。下次我们将填充#18容器,因为循环计数容器被减1。此过程一直进行, 直到填充完#0容器(红色容器),程序停止循环。 图5.2. 每次当触动传感器被触发时,使用光电传感器的读取值填充20个容器中的一个,这是非常精简的程序。0号容器是红色容器。我在侦测中使用了容器范围。 我们不仅可以使用循环容器值,而且也可以改变它。通常情况下,每循环一次后循环计数容器自动减1。在下面的图中,每次循环过程,我们都从循环计数容器中减去一此书授权西觅亚翻译。版权所有 7基于乐高组件和 ROBOLAB 软件的工程教学 第五章 个数值4,相当

14、于每次减小5个数值,程序执行后的结果是:从95依次减少5个数值(程序也包括描述大纲显示在LCD上)。 图5.3. 本程序从95开始,一次减小5,一直到0结束 增加循环容器的值也可以增加。尽管我们只指定了一次循环, 但程序不会停止执行,这是因为每次循环我们都给循环计数器增加1个数值。你为什么要来这么做?相当坦白说,我不能想象到任何理由,但是这个问题迟早派得上用场。我也任意命名NXT的文件“4ever”并且在LCD上显示怎样停止程序的介绍。 图 5.4 .这个程序在我计入1到循环计数器前将会一直运行 5.2.2 创建和使用子程序 一段子程序基本上就是一个特殊的功能集,它可以在一个程序中被反复使用。

15、创建一段子程序与使用任务分支非常相似,如图5.5所示。然而,与使用任务分支不同点在于,子程序中的功能不能立即运行,只有当“运行”或者“调用”子程序功能时才可以执行。 对于每个程序, 内存中至多可以有8个子程序,从0 - 7,即每个程序仅最多可以使用8个子程序。在图5.5中的两个程序正确地做同一件事,然而上面的程序因为它试用很少的代码所以更小(约0.25Kbytes)(比如子程序被重复的调用)。一个简单的例子,你也可以试用循环来代替子程序以节省储存空间。 此书授权西觅亚翻译。版权所有 8基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图 5.5. 子程序允许你反复使用代码,上面的两个程序

16、在做同一件事情。 当你有一段代码需要在同一程序中使用许多次时,就需要使用子程序。子程序在程序中可以重复使用。在程序中,一段子程序可以在任何任务中被运行或“调用”。子程序是依附于程序的,#1子程序(例如“rb1 ”)在一个程序中的含义与#1子程序(比如“square”)在另一个程序中的含义是不 同的。在5.2.4章中将详细讨论。如果你用同样的名称载入一个新的程序,子程序就将被覆盖(如果新的程序不适用子程序,子程序就将被删除)。 在图5.6中, 我们创建了一个子程序,用于后退和转弯(在此仅仅是介绍一下子程序)。 我们的基本设想是设计一个单独的子程序,它可以让机器人向前运动前,后退并且左转或是右转。

17、黄色容器的值用来控制机器人向前,后退和转弯的时间。子程序一开始就使用容器分支, 用来判断机器人向左还是向右转。 图5.6. 一段子程序允许你反复使用代码 此书授权西觅亚翻译。版权所有 9基于乐高组件和 ROBOLAB 软件的工程教学 第五章 在图5.7中,程序部份将调用图5.6中的子程序。这个程序使用红色容器指定是向左还是向右转,黄色容器指定后退和转弯的时间。所以如果触动传感器1被触发, 机器人后退2秒钟, 然后右转2秒钟。如果触动传感器3被触发,机器人后退4秒钟,然后左转4秒钟。 图5.7. 此部分程序将调用图5.6中的子程序 注意一个子程序不能调用另一个子程序(因为通常实现此种功能是通过使

18、其它基于文本的编程语言来实现的,就像C语言),但可以像图5.8所示那样,在一子程序中创建另一个新的子程序。学生经常会忘记子程序只有当运行时才会执行,因此,在下面的程序中,两个蜂鸣器的音乐永远也不会被播放,这是因为程序中没有调动过#0子程序,程序运行后,我们只能看到电机A运行1秒钟。 图5.8. 一个子程序内还可以创建其它子程序。注意,在本程序中声音永远也不会被播放。 5.2.3 创建和使用Sub VIs 程序 在ROBOLAB软件中被重新调用的程序称为虚拟仪器或VIs。一个subVIs是被其它程序调用的程序。实际上,到目前为止,你在ROBOLAB软件中使用的所有功能都是subVI s。 在第二

19、章(2.7.5节) 我们介绍了怎样获取每个函数的源代码?在第四章中(4.5.1节),也介绍了电机A向前运动功能实际上是由3个其它命令的组成的(位于高级输出子面板上)。在ROBOLAB软件中不仅获取源代码非常容易,自己创建subVIs也很简单。只需要两步就可以完成,如下: 此书授权西觅亚翻译。版权所有 10基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图5.9. 第一步: 把你想要生成的功能图标用选择框选中,本例中我们选择了两个函数图标和一个参数图标。在选择框外的导线会生成subVI的连线端点。在本例中,输出端口将形成一个端点,但能量级别不会形成。 图5.10. 第二步: 在编辑菜单中

20、选择“创建SubVI” 图5.11. 现在你就拥有了自己的subVI,它可以在 任何程序中反复使用(在你保存它后) 你可以察看自己生成的subVI的图表区程序,图5.12是我们例举的subVI程序的图表区程序。我们生成subVI时所选择的两个功能图标和能量级别参数量在图表区都可以找到。你也会注意到选择框外的连线也与它们各自的终端连接在一起。 图5.12. 新subVI的图表区 此书授权西觅亚翻译。版权所有 11基于乐高组件和 ROBOLAB 软件的工程教学 第五章 另外要注意的是subVI粉红色的“开始”和“结束”终端,与正常的ROBOLAB图标相反。(通过对图5.12与2.66对比后,你会发

21、现开始和结束的标签相反)。 当我们的选择框与任何连线交汇时(例如图5.9), ROBOLAB软件都会给相应的连接端点分配标签。在此例程中,绿色连线与端口A上“ports”终端相连,左边的粉红色连线与前一个命令的“end”终端相连,右边的粉红色连线与下个命令的“begin”终端相连。要修改这个差别,使用文本工具对它们重命名就可以了。图表区和前面板(参看5.7节可以更好的了解前面板)。你也可以右键单击粉红色“簇”并选择属性, 然后在属性标签选项内修改标签和标题。 想要生成自己的图标吗?那也是非常容易的事情。只需通过双击前面板图表区右上角的图标后,图标编辑器就会出现, 如图5.13所示。 它仅仅是一

22、个图标编辑器, 最终SubVI程序将来可以在任何程序中使用(在你使用文件菜单保存它以后)。 图5.13. 你可以通过双击窗口右上角那个图标创建自己的图标。 图5.14. 哇! 一个用自己图标定制的subVI完成了 注意:我们的subVI为输出端口提供了一个参数量终端。当我们使用该图标时,已经包含了能量级别,也就是说,只有两个粉红色的开始/结束连线和端口线与我们原先的选择框相交。 如果你感到疑惑,可以慢慢理解,其实在ROBOL AB软件中的每一个功能图标都是一个subVI。它们也是用上面的方法,通过非常精确的手段创建而成的。 5.2.4 子程序与sub VIs 程序对比 SubVIs使你的程序看

23、起来非常清晰,因为它减少了程序中所含的图标数量。另一方面,子程序,通常看起来觉得会使程序复杂一些。子程序和subVI的最大区别是:NXT对它们的处理方式不同。子程序被加载到NXT中的一个独立内存区域。一个灵巧的结果: 子程序可以被一段程序中的任何任务访问 小贴士 此书授权西觅亚翻译。版权所有 12基于乐高组件和 ROBOLAB 软件的工程教学 第五章 因为子程序一旦被加载到内存中,它们可以生成更多有效的代码。SubVIs使你的程序看起来非常简练(例如:较少图标),但它们并不能减少你的程序占用NXT内存的数量。例如:如果你在一个程序中使用相同的subVI十次,那么subVI就被相应加载到RCX的

24、内存中十次,与子程序相比,子程序只要加载一次就可以被许多次调用。因此,子程序对于RCX内存的使用数量更有效率。如果你写了许多大的程序,需要内存空间,子程序就可以帮助你。如果你仅仅是想要使程序简化或是在另一个程序中使用一个特殊的代码包,那么一个subVI是最好的选择。 回到图3.45,我创建了一个NXT屏幕保护程序。在下图5.15中有一个相同的程序也使用subVIs。比较图3.45和5.15,你可以看见怎样使用subVIs来整理程序的外观。图5.16中的subVIs “移动点”。两条程序都精确的使用NXT的内存。 图 5.15 . 使用subVI整理屏幕保护程序 图5.16 . 在图5.15中使

25、用移动点subVI的细节。 依靠使用子程序来代替subVI,我可以在NXT上节省大约0.25Kbytes的存储空间。我早先提到过的,子程序可以使程序看上去凌乱。 比较图5.15和5.18来看我提到的ROBOLAB子程序中的问题,你不可以修改任何运行子程序功能(除了子程序数)。你仍可以在子此书授权西觅亚翻译。版权所有 13基于乐高组件和 ROBOLAB 软件的工程教学 第五章 程序中修改,但是你不可以使用subVI在子程序图标上增加额外的终端。另外,像在文本输入程序中那样,你不可以直接通过子程序中的任何一个冲突。 图 5.17 . 子程序仅仅有一个修改点,subVIs有许多修改点。 我的屏幕保护

26、有四个修改(2个容器的名称和两个线的端点)。当使用子程序时,我会在调用的子程序增加一定的长度之后被强迫给容器赋值(并且降低了执行的速度)。像这种特殊的例子,子程序不是特别的有优势。这不是经常的情形并且会根据你的特殊的程序和你重复使用的代码类型有关。 此书授权西觅亚翻译。版权所有 14基于乐高组件和 ROBOLAB 软件的工程教学 第五章 此书授权西觅亚翻译。版权所有 15图 5.18 . 子程序条件下执行的屏幕保护程序。 基于乐高组件和 ROBOLAB 软件的工程教学 第五章 高级容器5.3高级容器技能牌 本节包括公式容器,局部变量和容器的容器。虽然事件容器也位于容器子面板中,但我们将会在高级

27、事件(第六章)中讨论,因为它确实属于事件。 5.3.1 方程和求值公式容器 方程容器和求值公示容器功能在做容器计算时是非常有用的。他们略微的不同,所以我将会先复习一个下方程容器。方程式容器仅仅使用基础容器进行整数型计算(红,蓝,黄等。相对于字符串容器)。方程式使用字符串常数输入(见图2.54,创建一个常量的例子)。上下文帮助描述怎样很好的写入方程式,不幸的是,在打印时拥有一些误差(当你读到这时,应当修复它)。当写入一个方程式,“c”代表容器,“s”代表传感器。帮助文件提示你也可以使用“m”,“t”和“r”,但是那些前缀在ROBOLAB2.9.2及之后的版本中并不支持。 表5.1.ROBOLAB

28、中方程式的理解 红色容器 c0 蓝色容器 c1 黄色容器 c2 容器3到32(全局基础容器) c3 to c32 全局字符串容器 c49-c95 传感器端口1 s1 传感器端口2 s2 传感器端口3 s3 传感器端口4 s4 正弦(x) (x为弧度) sin(x) 余弦(x) (x为弧度) cos(x) 一个使用传感器端口2(s2)的例子在下图中展现。在这个例子中,我给红色和蓝色的容器赋值,同样的值用不同的方式;一个使用传统的容器计算功能,在章节3.3中已经介绍过的,以及另一个使用方程式容器。注意,怎样使用方程式容器来省去一个操作(图标)。 图 5.19 .红色和蓝色的容器有相同的值。 公式容

29、器最大的缺点是不能使用圆括号,所以你不能写出像(c0+c1)/2这样简单的公式,此用意是(红容器+ 蓝容器)/2。我们可以使用c0/2+c1/2这个公式来代替上面的公式形式,由于整数算术作用会产生一个与理想公式形式(c1+c2)/2相同的结果。图5.20展示出了使用公式容器和标准数学容器的执行公式的过程。(提醒:如果你没有指定任何容器,系统默认使用红色容器)。很明显,公式容器可以节省许多空间。 此书授权西觅亚翻译。版权所有 16基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图5.20. 公式容器用于减少容器算术所需要的函数数量,这两个程序的功能相同。 我在触感计时器程序里已经使用了求

30、值公式(图3.36)并且回到第三章(图3.45)中的屏幕保护程序,以及在图5.16和5.18中也提到过的。求值公示功能与方程容器十分相似,它使用执行容器计算。然而,它在四个重要的方面有所不同:1)没有容器连接到函数,2)它可以用插入方式处理,3)它可以在基础容器(整数)和字符串容器(小数)上操作,4)它可以用来定义整数或者小数。在图5.21中的例子展现了几乎和图5.20中一样的程序。主要的不同在于它用正确的方式来处理 :(5+3)/2 = 4代替了3。从这来看,我们仍然在处理整数计算,但是使用插入语来预防过早的碰到误差。 图 5.21 . 求值公示功能在容器上使用,但其本身并不是容器。 我在先

31、前的章节3.3.3中提到的,第一次你使用字符串容器将会规定是否要保持一个整数或者小数。如果你在求值功能中第一次使用了字符串容器,你可以特指“浮整数”或者“int”分别来定义一个小数或者一个整数的值(见图3.36).如果你不特指“float”或者“int”,字符串容器会默认为一个整数。在下面的例子中,“圆周率”第一次在求值公示功能中被运用,这样,我明确的说它是一个小数。 图 5.22 . 求值公式可以使用小数或者整数用来定义新的字符串容器。 此书授权西觅亚翻译。版权所有 17基于乐高组件和 ROBOLAB 软件的工程教学 第五章 如果“float”或者“int”没有被特指,容器将定义求值公示功能

32、为整数。 注意 在下面的例子中,“rot”保持一个整数,因为我第一次使用,我使用译码器A来填值,是一个整数(用蓝色的线指示)。我就继续使用求值公式功能来定义三个新的容器:“dist”,“revs”和“deg”,代表了走过的路程,轮子转过的圈数和转过的角度。 图 5.23 . 求值公示可以处理整数和小数计算。 字符串容器仅仅精确到小数点后两位。注意 就像方程容器,求值公示功能也可以推定方程公式,在表5.1中列出。在下面的程序中,c0在方程中用红色的容器指示。就像图5.22,“dist”是一个整数,因为它在求职公式功能中被第一次使用,并且我没有特指它是“float”还是“int”。 图5.24 .

33、求值公示可以推出方程公式,在表5.1中列出。 方程容器和求值公示功能都可以用简单的三角法(正弦和余弦)。在下面的例子中,我创建了一个程序,可以计算用正弦算出角度传感器A。因为蓝色的容器可以仅仅保持整数,我用结果乘以100。试着运行下程序,你会发现两种方法都是十分精确的。 此书授权西觅亚翻译。版权所有 18基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图 5.25 .方程容器和求值公示功能都可以做简单的三角法。 5.3.2 局部和全局变量 在介绍局部变量之前,先说一下什么是全局变量,当你程序结束后,容器值就保存下来了,以后某个时间你也可以访问容器值。在计算机术语中, 这被称为稳固变量(

34、关闭NXT将会清零所有容器)。它使你可以访 问多数容器,并进行操作,在NXT中存储的程序也可以在任何程序存储位中的任何一个中运行。换句话说,多数容器是全局变量。(严格地讲它们是稳固全局变量,但由于ROBOLAB软件中的所有容器都是稳固的,我们不在赘述)。请注意,上面我们仅是说“多数”容器,你将会看到不足,某些变量在整个程序过程中不能被共享。 一个简单的例程将阐明一个全局变量的概念。设想你想要编写一段沿线行走的机器人,根据经验,必须要让机器人能正确识别“黑色”和“白色”。运行程序1把黑值存储到红色容器,然后运行程序2把白值存储到蓝色容器中,最后运行程序3。听上去和奇怪,但确实很简单。 在图5.2

35、6的程序中命名 “black” 。中间的程序命名为 “white” 。底下的程序称为 “line” 。现在你可以准备好炫耀你的技术了。简单的放置你的机器人,超过黑线,运行黑色的程序。移动你的机器人到白线,并且运行白色的程序。现在你的机器人已经把黑和白的值存入( 稳固) 全局变量。运行线程序可以在分支的开始处使光感读数取平均值。 中提琴!一个寻线机器人可以校准周围的环境光。注意,最后一个程序从来没有为红(c0)和蓝(c1)色容器分配任何值。程序只是使用了之前被其它程序所保存的容器值。 此书授权西觅亚翻译。版权所有 19基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图 5.26 . 每个

36、程序被下载到一个不同的存储空间,但容器在三个程序间是共同使用的。 全局变量(容器)可以在任何程序中的任何任务中使用。 注意 字符串容器也是全局变量并且可以简单的在一个简单的程序中被共享。然而,他们在一些程序中共享是存在一定困难的,因为他们在NXT上的存储方式。字符串容器实际上是存在数字容器中的(c49c95) 并且需要数字引用,如果你希望在几个程序中分享他们(用名称分享他们是不错的)。使用Detective Container Scope来定义每个不同名称的容器相应的数字。小数容器实际上是分三个部分存储在容器中的。 这看起来可能非常“cool”, 可能有时你不想在整个程序内共享容器。如果你正在

37、使用许多容器或者想要确保其他任务或程序不要覆盖你的容器值。容器在程序和任务中没有被共享时,容器被称为局部变量。在图5.27 #1任务中(上面的多数任务)用数值4填充#32容器,然后分成两个任务使用数值100填充它,一个任务结束。第二个任务2简单等待#32容器值等于100,然后播放声音。此声音永远也不会被播放,因为容器#32是一个局部容器,也就是说任务2与任务1的#32容器不是相同的。是不是有点乱?你可以认为32到47号容器是每个任务使用的私有容器。 此书授权西觅亚翻译。版权所有 20基于乐高组件和 ROBOLAB 软件的工程教学 第五章 图 5.27. 32号容器是局部变量,所以仅上面的 任务

38、(#1任务)可以访问它。在本例程中其它两个任务将一直等待下去。 比较容易混淆的(万一你感兴趣), ROBOLAB在1号任务中存储16个本地容器c96c111,在2号任务中16个本地容器从c112c127,等等。当你开始计入容器(变量)的总数时,可以在 ROBOLAB中得到的是令人惊讶的:(每个任务16个本地变量)X(9个任务)144个本地变量。加上32个基础容器,再加上47个字符串容器(如果使用整数的话),在ROBOLAB软件中你总共可以使用223个变量!在你过于兴奋之前,你需要了解几个特别的局部变量和全局变量是ROBOLAB软件内部使用的。例如,全局容器#23到#28被用于数据采集功能。如果

39、你没有使用任何数据采集,那么就不存在问题。然而,如果你正在进行数据采集操作,那么你使用这6个容器中的任何一个都会对数据采集结果产生破坏。局部变量#32到#47通常被用于其它功能 (参考表5.2)。例如 , 等待亮度增量功能使用#47容器计算等待光值功能的上限。 图5.28. #47容器被用于等待亮度功能。 此书授权西觅亚翻译。版权所有 21基于乐高组件和 ROBOLAB 软件的工程教学 第五章 表5.2: ROBOLAB容器的描述和位置 容器 # 参考位置 类型 描述 0 c0 全局 红色容器 1 c1 全局 蓝色容器 2 c2 全局 黄色容器 3-22 c3-c22 全局 通用容器 23-2

40、5 c23-c25 全局 数据值(红, 蓝, 黄)各自数据集最后的数据记录值 26-28 c26-c28 全局 数据计算 (红, 蓝, 黄)在各自数据集中需要的数据点数 29-31 c29-c31 全局 通用容器 32 c96 (task 1) c112 (task 2) c128 (task 3), etc局部 未使用过 33-47 c97-111 (task 1) c113-127 (task 2) etc 局部 用于循环反复(通过循环计数容器可以访问)46-47 c110-c111 (task 1)c126-c127 (task 2)etc 局部 用于等待角度 48 c48 局部 运行任

41、务的数字显示49 c33-c95 局部 字符串容器 我们建议你在没有绝对需要额外变量的情况下仅使用#0到#22容器。当你使用额外138个变量时,要特别小心。 5.3.3容器的容器 容器的容器是ROBOLAB软件中最易混淆的功能之一。但是在你需要使用它的特定情况也是非常有用的。下面这个例程演示了普通容器和容器的容器间基本的不同之处。程序首先把9填充到0容器,此处的数字0用来指定填充哪一个容器。接着,程序把99填充到#9容器。在这种情况下,数值0被用于指定哪个容器拥有我们想要填充的容器的地址(容器号)。由于0容器(红色容器)的为数字9,所以#9容器中被填充99。 我们告诉你它非常容易混淆! 图 5

42、.29 . 容器的容器指定使用哪一个容器值,不是使用哪一个容器。此处,#9容器将被写入99。 此书授权西觅亚翻译。版权所有 22基于乐高组件和 ROBOLAB 软件的工程教学 第五章 当在使用容器的容器时,你不能指定要使用哪一个容器,但你可以指定你 注意 下面是考虑容器的容器的另一种方式,较易理解。在下面的例程中,两个填充功能都不会填充红色容器。相反,两个填充功能使用存储在红色容器里的值来决定要给哪个容器填充值99。红色容器存储有被填充容器的地址(容器号)。 图 5.30 . 这两个功能完成相同的任务。红色容器没有被填充。相反,红色容器被用于指定哪一个容器填充数值99。 在图5.31中,我们编

43、写了一个记录20个光电传感器读取值的程序(类似于图5.2),然后确定哪个读取值是最大的。程序中部的循环把#19容器的值和#0容器的值作比较(因为#22容器在一开始就存有数值0)。如果#19容器的值大于#0容器的值,那么数值19被存储在#22容器。这个过程反复执行,一直到20个容器被比较完后停止。 在此处,我们使用#22容器存储拥有最大数 值容器的地址 (容器值)。最大数值从没有被个别存储。我们仅仅是保存最大数值是在哪一个容器内。 图 5.31 . 本程序采集了20个光电传感器的读取值,然后找出哪一个读取值是最大的。#22容器保存了最大数值的地址(容器号)。 此书授权西觅亚翻译。版权所有 23基

44、于乐高组件和 ROBOLAB 软件的工程教学 第五章 高级任务5.4 高级任务技能牌 该部分将介绍当多个任务试图控制相同的输出端口或声音时,如何准确控制发生资源冲突的问题。如果你是一位有经验的ROBOLAB使用者,那么请特别注意,因为任务的优先权在2.9.2中已经被彻底的更改了。 任务的优先权功能给了我们1)有能力来延迟一个较低优先等级的任务的开始。以及2)如果冲突发生在马达和喇叭上来控制它们哪个得到优先。十分坦诚的说,明确的开始和停止任务(比如图3.56)是最佳的避免冲突的方法。任务优先功能不会排除冲突。 如果你区分任务的次序,ROBOLAB会默认区分任务序号,任务1拥有最高的优先权,任务2

45、次之,以此类推。下面的例子中,所有的程序都要在同一时间控制一个马达。当没有特定任务的优先时,任务1默认为有最高优先权的,马达A向前运转。任务2播放声音,并且停止马达,只有马达A翻转功能能胜过任务1。 图 5.32 . 如果没有特别指定任务,任务1拥有最高的优先权。 任务优先功能允许你来特定任务的优先权,不管任务的序号,255有最高的优先权,0是最低的。最低优先权的任务(序号最低)将不会开始,直到所有的高序号的任务执行完或者等待完了再执行。从本质上来讲,任务优先功能可以延缓优先级低的任务的开始时间。在下面的程序中,低等级的任务(任务2)将会正常的有一个优先级低,但是当我定义它为高优先级的(7比6

46、大),马达A就向后运行了。任务1不确定的延时,因为任务2既没有结束,也没有等待。 图 5.33 . 任务优先功能指示了怎样处理冲突的马达A。下面的任务(任务2)在这里有较高的优先级。 在图5.34中,任务2有较高的优先级,就意味着任务1不会执行任何在分支之后的任务,直到任务2停止或者等待。当任务2既没有停止也没有等待时,任务1不会执行任何 。然而,在任务分支之前会播放声音(比如在任何冲突发生前)。马达A在开和关之间交替运行,大约每隔一秒钟(NXT可以在1秒里重复大约10,000次循环)。 此书授权西觅亚翻译。版权所有 24基于乐高组件和 ROBOLAB 软件的工程教学 第五章 此书授权西觅亚翻

47、译。版权所有 25图 5.34 . 在这个例子中任务1从来没有启动,当任务2既没有结束也没有等待。 上面的例子也证实了,你可以在任务的任何地方定义任务的优先级,它没有在任务的一开始就这么做。在这里,我在程序的末尾定义了任务2的优先级。它也可以增强任务1在开始的绿灯处的行为,不是在任务分支那(任务2的绿灯是任务分支,那里是它的开始)。 上面的两个例子覆盖了延时启动低等级的任务的观念。然而,任务优先功能也影响着怎样处理资源冲突。在下面的例子中,所有的任务以等待开始。转换两个任务的优先级将会对每个任务的开始没有影响,因为所有的任务都立刻开始(比如,没有延时)。然而,任务优先设定的影响来源于外观上的,

48、如果触动传感器1和2都被同时的按下。当任务2有较高的优先级,马达A将会反转。 图 5.35 .任务优先权也指示在冲突中任务应该控制哪个马达。 当然,在上面一个例子中,如果触动传感器1和2没有在同一时间被按下,那么没有资源冲突会发生,并且任务优先权的设定也没有影响。 【注意:在写这些的时候,ROBOLAB2.9.3有一个漏洞,会在冲突期间对任务的优先有反影响作用最低等级的任务赢得了控制马达的权利。这个漏洞已经被上报并且修复了。如果没有,请下载最新版本】。 高级数据采集5.5 高级数据采集技能牌 在前面第三章中我们介绍了NXT的一个最佳特性数据采集,研究者程序级别1, 2,和3都是初级导航者程序。

49、本节将介绍研究者级别5(级别4NXT是不支持的)。 当你每一次在级别5中打开程序时,你将会注意到有一个新的功能面板。其实,就是你使用的功能面板上有一些新的面板。 四个子面板从左到右依次是: 数据采集和电机,G代码, 多媒体,和选择一个 VI程序。 基于乐高组件和 ROBOLAB 软件的工程教学 第五章 此书授权西觅亚翻译。版权所有 26图 5.36. 新功能面板 数据采集和电机子面板与你之前所使用的研究者等级4的功能面板一样。G代码子面板能够让你进入所有的G-代码功能(见章节5.7)。多媒体子面板包含一个操作音频和视频的多余的功能,但是已经超越了本文的内容。 只不过它是研究者特定的子面板。在其它子面板中, 也有一些新的功能, 我们会在以后介绍。Select a VI子面板简单的允许你打开存在的VI(虚拟程序)。 图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报