ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:24.14KB ,
资源ID:28645473      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28645473.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NBC中文翻译4.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NBC中文翻译4.docx

1、NBC中文翻译4修改记录2009/4/22 由flexitime增加翻译内容完成原文 16、17页的最初翻译。2009/4/19 由flexitime增加翻译内容完成原文 12到15页的最初翻译。2009/4/18 由flexitime增加翻译内容完成原文 10到12页的最初翻译。2009/4/17 由flexitime增加翻译内容完成原文 8到9页的最初翻译。2009/4/16 flexitime创建本文档完成原文 5到7页的最初翻译。Programming Lego Robots using NBC(Version 1.0, June 11, 2007)Requires NBC 1.0.1

2、.b30 or greaterI 写你的第一个程序在这一章里面,我将会向你展示如何写出一个最简单程序,我们打算安排机器人向前移动4秒,然后向后移动4秒,最后停下来,没有其它令人瞩目的地方,但它会向你介绍编程的基本概念,同时它会向你展示这是多么的简单。在我们写程序之前,我们首先需要一个机器人。搭建机器人我们将使用“Tribot”机器人来贯穿整个教程,它的搭建指南在你的NXT套件当中。如果你不熟悉LEGO的机器人。我建议你按照Lego的教程来制作它。同时使你开始知道NxT能干些什么。你的机器人应该像这个样子P5图片(注意:你可能已经将感兴器及收集杆安装上去了,如果是你应该暂时先将它们移除掉。因为当

3、连接它们时会有一些的例子是不能正常工作的)启动 Bricx Command Center我们将使用Bricx Command Center来写程序,通过双击就可以启动它。(我假设你已经安装了Bricx Command Center,如果没有,请从网页上下载并安装)程序会询问你,机器人在那里,打开你的机器人,并点击OK,程序会自动的找到机器人,现在你就会看到用户介面出现在你的面前。P6图片用户介面看起来像一个标准的文本编辑器,有普通的菜单,有打开,保存,打印等等的按钮。这里也有一些特殊的菜单,如编译、下载程序到机器人和从机器人中收集信息。你现在可以怱略这些。我们打算写一个新的程序,因此点击New

4、 File按钮来创建一个新的空窗口。写程序现在输入下面的程序:thread main OnFwd(OUT_B,100) OnFwd(OUT_C,100) wait 4000 OnRev(OUT_BC,100) wait 4000 Off(OUT_BC) exitendt这些东西开始看起来有点复杂。因此让我们一起来分析它。NBC的程序都是由线程(threads)来组成,我们的程序就含一个线程,名字叫做main,每个一程序都必须含有一个叫main的线程,它是由机器人来调用的,你会在第五章中学到更多有关线程的知识。一个线程是由一堆的命令所组成的,通常也叫做语句(?),每个语句占用一行,因此一个线程(

5、原文用task,估计是从NXC中抄过来的)看起来通常会像这样:thread main statement1 statement2endt让我们逐行来看程序OnFwd(OUT_B,100)这个语句是告诉机器人启动 B输出口,连接在标记为B输出口的电机会向前移动(转动?),100是指速度的百分比值,在这里它会以最大的速度移动。OnFwd(OUT_C,100)同样的语句,不过现在我们启动的是电机C,经过这两条语句后,两个电机都将运行。而机器人也会向前移动。wait 4000现在是时候让它停下来一会儿。这个语句告诉我们会停4秒,给出的参数是以毫秒为单位的。(1/1000 秒),因此你能非常精确的告诉程

6、序要等待的时间长度。在这4秒中,程序什么都不干,而机器人将继续向前移动。OnRev(OUT_BC,100)机器人现在已经走得够远的了,因此我们告诉它往相反的方向走,这就是向后走。注意,我们能够使用OUT_BC作为参数来同时设置两个电机。我们当然也能将前面两个语句通过这种方式合并。我们也能使用 OnFwd(OUT_BC,-100).来实现。wait 4000再次等待4秒。Off(OUT_BC)最后,我们关闭两个电机。exit这个语句告诉NXT这个线程结束了,不过这个不是必须出现在线程结尾的,只是推荐这样做。注意,它经常出现在线程的别的地方。这就是整个程序,它会驱动两个电机向前4秒,然后向后4秒,

7、最后关闭它。你可能会注意到输入程序时的颜色,它们自动出现,编辑器通常会用颜色及样式高亮显示特定的语法。运行程序一旦你写好了程序,程序就需要编译(这是将它改变成机器人能认识和执行的代码),和使用USB或蓝牙发送到设备上(叫“downloading”程序)。在做这些之前,你需要命名你的程序,你保存它到你的硬盘上就行了。当你保存时,一定要保证文件的扩展名是“nbc”,告诉Bricx Command Center这是一个NBC的程序。P8图片 上保存完文件后,你可以编译和简单的点击下载按钮下载它。假设你在录入程序时没有犯任何的错误,它就会正确地被编译和下载(如果你的程序中有错误,你会得到一些通知,看下

8、面的图)现在你能够运行程序,按这样做:在NXT中选择“Software Files”,查找“1-simple”,再使用橙色的键来运行它。另一种方法是,你可以通过Bricx Command Center来运行它,在你的窗口中点击绿色的运行按钮(看上面的图片)。机器人能按你预期工作吗?如果没有,电缆可能连接得不正确。程序中的错误当你录入程序时,会有一些合理的情况使你犯下错误,编译器会注意到这些错语,并会在窗体的下方报告这些错误,就是以下的图片所示。P8图片 下它会自动选择第一个错误(我们打错了电机的名字),当有不止一个错误的时候,你可以点击这些错误的信息去找到错误的地方,注意,第一个错误经常会引起

9、其它地方的错误,因此你最好只改正最前面的一些错误然后再编译一次。*通常也要注意的是语法高亮在很多情况下会帮助避免错语,例如在我们输入的最后一句。Of应该是Off才对,因为编辑器不认识这个命令,所以它没有高亮,因此你们可以在你编译程序之前发现到它们,这里还有一些错误是编译器不能找到的,如果我们输入OUT_B的话,它是不会被发现的,因为那个电机是存在的(尽管我们没有在机器人中使用它),如果你的机器个展现出非预期的动作时,这大概可能大概是你的程序中那个地方错了改变速度:可能你会发现,机器人的移动速度相当快,默认的情况下,机器人是以它最快的速度来移动的,如果要改变速度,只要在OnFwd中使用不同的参数

10、值就行了。动力是一个介于0到100的数值,是一个最大动力的百分比值,这里是我们新版本中的程序,这个机器人移动速度会较慢。thread main OnFwd(OUT_BC,25) wait 4000 OnRev(OUT_BC,25) wait 4000 Off(OUT_BC) exitendt在这个例子中,你可以看到速度的值以及等待时间的值都是重复的,如果你要修改它们,你必须在好几处地方去修改它,而你很可能会漏掉一个。因此在NBC中(原文中有错),你可以定义一个常量值,就像下面所示的程序:#define SPEED 25#define MOVE_TIME 4000thread main OnFw

11、d(OUT_BC, SPEED) wait MOVE_TIME OnRev(OUT_BC, SPEED) wait MOVE_TIME Off(OUT_BC) exitendt现在如果你需要改变速度,你只要修改一个地方即可。增加注释为了使你的程序更具可读性,最好是增加注释,只要你在行里输入/时,行剩下的地方就会被怱略这样它就成为了注释。如果是长的注释,你可以把内容放在 /*和 */之中,注释在Bricx Command Center中是会被高亮显示的,整个程序看起来会像下面的样子:/* Forward and reverse by Ross CrawfordThis program makes

12、 the robot go forward and backward*/#define SPEED 25#define MOVE_TIME 4000thread main OnFwd(OUT_BC, SPEED) / Drive forward wait MOVE_TIME / Wait for 4 seconds OnRev(OUT_BC, SPEED) / Drive backward wait MOVE_TIME / Wait for 4 seconds Off(OUT_BC) / Stop moving exit / Exitendt总结在这章中你写了第一个NBC程序,使用Bricx

13、Command Center。你现在应该必得如何输入一个程序中,如何下载它到机器人并让机器人执行程序。 Bricx Command Center 还能做更多事情。要得得更详细的说明,你可以查阅相关的文档。这个教程主要讨论语言NBC,也包括一些必要的Bricx Command Center的功能,以便于你的使用。你也学习了一些NBC重要方面的知识。 首先,你学习每一程序都有名为 main 的线程,它总是被机器人所调用。你同时学习四个最重要的电机相关命令: OnFwd,OnRev 和 Off,和关于 wait 和 exit 的语句。最后,你学习关于如何使用常最来使得程序范围内的变化更容易,也学习了

14、使用注释也解析你的代码。II. 使用变量变量是所有编程语言的重要组成部份。 变量是存储器某一位置,能存储值在其中。我们能在不同的地方使用这些值,同时我们也能改变它。 让我通过一个例子来说明如何使用变量。在不同的路线上移动假定我们想要调整上面的程序成这样子:机器人不再以向前的速度返回。通过在返回的路程中变小速度值就达到这样的效果。 但是我们如何去做呢?SPEED是一个常量,而常量是不能被改变的。我们需要一个变量来代替它。变量能容易地在 NBC 程序中定义。这里就是新的程序#define MOVE_TIME 4000#define SPEED 100#define DECREMENT 25dseg

15、 segment Speed bytedseg endsthread main set Speed SPEED OnFwd(OUT_BC, Speed) wait MOVE_TIME sub Speed, Speed, DECREMENT OnRev(OUT_BC, Speed) wait MOVE_TIME Off(OUT_BC) exitendt我们已经引入变量 Speed 到程序中。在你的程序中的所有的变量都必须在数据段里声明。你可以按你所想设置多个的数据段,而且它们能在程序中的任何地方。所有在 NBC 中的变量有全局的作用范围它们能任何线程中的任何代码访问到。数据段以 segment

16、语句开始,而 ends 结束。 每一片段都必须被命名,在 segment和ends中的语句的名字都必须一致。那么,现在让我们来解释程序中的新的语句。dseg segment这语句指定一个名为“dseg”数据段的开头。 在我们的程序中,它是唯一的数据段同时也仅仅包含一个变量。Speed byte这个语句声明 Speed 为 byte 类型。变量名称必须以字母开头,但可以包含数字和下划线。 其它的字符将不能使用。 (同样适用于 常量,线程名等等)dseg ends这个语句指定了“dseg”数据段的结尾set Speed, SPEED这语句把 SPEED (早前被定义的常量) 值赋给 Speed 变

17、量。 注意,这也能在声明变量时同时完成,只要把初始值放到变量类型的后面即可,例如:Speed byte SPEED.sub Speed, Speed, DECREMENT从 Speed 变量所含的值中减去 DECREMENT,然后再将结果保存回 Speed 中。当你运行这程序时,你的机器人应在指定的时间内以全速向前走,然后同样的时间以较缓慢的速度的反向行走我们除了可以在变量中减去一个值,同样我们能乘上,减去或除以(注意,除法的结果是一个截断后最接近实际结果的整数)一个数值。 当然你也能把一个变量与另外的变量相加,同时,也可以写出更加复杂的表达式。这里是一些例子:dseg segment aaa

18、 byte bbb byte ccc bytedseg endsthread main set aaa, 10 / aaa is now equal to 10 mul bbb, 20, 5 / bbb is now equal to 100 mov ccc, bbb / ccc is now equal to 100 div ccc, ccc, aaa / ccc is now equal to 10 add ccc, ccc, 5 / ccc is now equal to 15 exitendt现在让我们更细致地了解新的代码。Set aaa, 10我们之前已经看过这样的语句,但我只是想指

19、出,set 的第二个参数只能是一个常量,这是有别于之前所讲的 mov 语句。mul bbb, 20, 5这个语句将 20乘上 5,然后将结果赋值到 bbb 变量中去,第二,第三个变量可以是常量或者其它的变量。mov ccc, bbb这个语句将 bbb的值赋给变量 ccc,与 set 不同,mov的第二个参数可以是常量或者变量div ccc,ccc,aaa这个语句将 ccc除以aaa,并将结果赋回给变量 ccc中,注意这里只返回整数值。所有的余数都被截断。add ccc, ccc, 5这个语句是在 ccc 中增加 5/-begin p13, by flexitime在屏幕上显示结果就如所见的一样

20、,如果执行这些命令,ccc 最后的值应为15。但我们该如何检查它呢?最容易的方式是在NXT屏幕上显示结果。这是相当简单的这里刚好有一个系统调用可以做到。如下程序将演示它:dseg segment aaa byte bbb byte ccc bytedseg endsthread main set aaa, 10 / aaa is now equal to 10 mul bbb, 20, 5 / bbb is now equal to 100 mov ccc, bbb / ccc is now equal to 100 div ccc, ccc, aaa / ccc is now equal t

21、o 10 add ccc, ccc, 5 / ccc is now equal to 15 NumOut(10, LCD_LINE7, ccc) wait 2000 / wait so you get to see it! exitendt这是基本不必细讲,但是这里还是有重要的部分需要解释。NumOut(10, LCD_LINE7, ccc)这语句把 ccc 值转变成为一个字符串,然后调用系统函数 DrawText 在屏幕上显示出来。 ccc 的值应该显示在屏幕的左下角位置。wait 2000我们之前也看过这个语句-这里只是简单的暂停使得你能看到结果。如果它不在这儿,程序将立即退出,NXT菜单

22、将快速重写你刚才显示数值的屏幕而你将看不到!随机数以上所有的程序中我们确切地定义了机器人预期的动作。但是,当机器人将做一些我们不知道的事情时,事情将变得十分有趣。我们在运动中会有一些随机性。 在NBC中你能创建随机数。 下面的程序在机器人回退时使用一个随机的速度值。/-begin p14, by flexitime#define MOVE_TIME 4000#define SPEED 100#define DECREMENT 25dseg segment Speed byte wRandom bytedseg endsthread main set Speed SPEED OnFwd(OUT_

23、BC, Speed) wait MOVE_TIME Random(wRandom,30) add wRandom, wRandom, 10 sub Speed, Speed, wRandom OnRev(OUT_BC, Speed) wait MOVE_TIME Off(OUT_BC) exitendt基本上与上面的程序一样,但我们不再速度值减去25,取而代之的是使用一个从10和40之间的一个随机数。 让我们看看它是如何做到的:Random(wRandom,30)这语句将产生 0 和 29 (含29) 之间的一个随机整数,并把结果返回到wRandom 中。注意,结果将总是比第二个参数的值要小。

24、add wRandom, wRandom, 10这语句将增加 10 到结果中,因此现在它的值介于 10 和 39 之间。sub Speed, Speed, wRandom这语句将从速度值中减去刚才的结果,为接下来的OnRev语句做准备。总结在这章中你学习如何使用变量。变量是十分有用的,但是他们被限制只能使用整数值。但是,对于许多机器人的任务来说,这已经足够了。 你也学习了在 NXT 屏幕上显示一个值。这技术对调试更复杂的程序时十分有用。最后,你学习如何创建随机数,这样你就能为机器人设定一些无法预知的行为。 /-begin p15, by flexitimeIII. 流程控制在之前的章节中我们看

25、到许多操纵变量的方式。但所有我们迄今为止所看到的语句都是按顺序执行的,这对一些事情是十分合适的,但是我们经常需要根据不同的条件来作出判断。这些要求有一种比较变量的方式,同时能根据比较的结果来做不同的事情。cmp 和 tst 语句你有时只是想要记录下比较的结果,以便你在稍后的程序中能使用。使用cmp 和tst 语句就能容易地完成这一工作。 让我们看一下如何在程序中使用它们。dseg segment aaa byte bbb byte ccc byte wRandom bytedseg endsthread main set aaa, 10 Random(wRandom,20) mov bbb,

26、wRandom cmp GT, ccc, bbb, aaa NumOut(10, 8, bbb) NumOut(50, 8, ccc) wait 2000 exitendt这程序应该是相当熟悉的它是基于之前章节中的一个程序。然而,这里有一个新的语句,让我们来看一下它:cmp GT,ccc,bbb,aaa这语句使用GT的比较方式进行bbb与aaa的比较,这是“大于”的意思。 然后,结果会储存在 ccc。 因此,如果bbb大于aaa,那么ccc中存的值为1 (在 NXT 固件中表示“真”),否则 ccc 将存入 0。这正是我们想要做的效果一样,为了稍后的程序操作,它将比较后的结果存放在一个变量中。

27、在比较语句接下来程序中将把 bbb 和 ccc 的值显示出来,这样你能看到比较操作是如何工作的。 接着,运行几次程序,检查 ccc 的值是否能正确地依赖于bbb的随机值。那么tst语句又是怎样呢? 它与cmp刚好是一对难兄难弟,它的工作方式几乎一样,只是它只有3个参数,(即cmp)第四个参数被假定是零。如下语句的效果是一样的: cmp GT, ccc, bbb, 0 tst GT, ccc, bbb还有一些其它的比较类型,它们都能在cmp和tst中使用,这是它们的列表:EQ 等于LT 小于LTEQ 小于或等于GT 大于GTEQ 大于或等于NEQ 不等于/-begin p16, by flexi

28、timebrcmp和brtst语句我们能使用 cmp 或者 tst 存储比较结果并可为后续程序使用。同时,我们能在屏幕上显示它。但是,我们如何才能实际使用它来做事呢?一般地,机器人如果想依赖于测试结果来做不同的事情,那么可使用 brcmp和brtst来完成这项工作。 在NBC中,所有程序分支语句都要求一个标签。标签只是一串后面跟着冒号的字符。标签能自己单独一行或者在一个NBC语句的开头。让我们看一下一个例子:dseg segment aaa byte bbb byte wRandom bytedseg endsthread main set aaa, 10 Random(wRandom,20)

29、 mov bbb, wRandom NumOut(10, 8, bbb) brcmp GT, Bigger, bbb, aaa TextOut(50, 8, small) brcmp LTEQ, Delay, bbb, aaaBigger: TextOut(50, 8, BIG)Delay: wait 2000 exitendt接下来,这相当类似于刚才的程序,与使用 cmp 存储比较结果不同,我们用 brcmp 来执行“条件”代码。 让我们一起分析丙个新的语句:brcmp GT, Bigger, bbb, aaa这是不是看上去十分类似于刚才程序中的 cmp 语句? 事实上,同样的比较操作将会被

30、执行,但与存储比较结果不同,它用于决定是否跳过程序直接到达下面定义的“Bigger”标号。如果比较的结果为真,程序将跳过,否则它将继续执行下一个语句,这样就会显示字符串“small”。Bigger:这是一个标号(行标号),同时这也是 brcmp 语句的目标位置。 如果比较结果为真,程序会直接跳到紧跟在这一标号的第一个语句,这样就会显示字符串“BIG”。那么这时程序将显示 bbb 的值,同时根据与aaa的比较结果显示“BIG”或者“small”。brtst 语句,类似于刚才的 brcmp,但它第4个参数被假定是零。jmp 语句有时候你会需要一个无条件的程序分支,即无论如何都会跳过一些代码。jmp语句能完成这一任务。 它是十分简单的;你只需指定你想跳到的标号即可。一个最普通的无条件分支就是if-then-else的这种形式的应用。你可使用 brcmp 或者 brtst 作为“if”,跳到一个标号来执行“then”中的代码。 如果比较的结果是假的,你执行“else”中的代码,就是紧接在条件判断之后的代码。 但是在这些代码的最后(else),你会想要跳过“then”中的代码,因为当条件为假时,你不想执行它们。这样,你必须在“then”代码的最后添加一个标号,而在“else”代码结束时无条件跳转到这一标号上。 让我们看一个例子:/-begin p17, by flexitime#def

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1