NBC中文翻译4.docx

上传人:b****1 文档编号:28645473 上传时间:2023-07-19 格式:DOCX 页数:18 大小:24.14KB
下载 相关 举报
NBC中文翻译4.docx_第1页
第1页 / 共18页
NBC中文翻译4.docx_第2页
第2页 / 共18页
NBC中文翻译4.docx_第3页
第3页 / 共18页
NBC中文翻译4.docx_第4页
第4页 / 共18页
NBC中文翻译4.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

NBC中文翻译4.docx

《NBC中文翻译4.docx》由会员分享,可在线阅读,更多相关《NBC中文翻译4.docx(18页珍藏版)》请在冰豆网上搜索。

NBC中文翻译4.docx

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/16flexitime创建本文档

完成原文5到7页的最初翻译。

―――――――――――――――――――――――――――

ProgrammingLegoRobots

usingNBC

(Version1.0,June11,2007)

RequiresNBC1.0.1.b30orgreater

I.写你的第一个程序

在这一章里面,我将会向你展示如何写出一个最简单程序,我们打算安排机器人向前移动4秒,然后向后移动4秒,最后停下来,没有其它令人瞩目的地方,但它会向你介绍编程的基本概念,同时它会向你展示这是多么的简单。

在我们写程序之前,我们首先需要一个机器人。

搭建机器人

我们将使用“Tribot”机器人来贯穿整个教程,它的搭建指南在你的NXT套件当中。

如果你不熟悉LEGO的机器人。

我建议你按照Lego的教程来制作它。

同时使你开始知道NxT能干些什么。

你的机器人应该像这个样子

[P5图片]

(注意:

你可能已经将感兴器及收集杆安装上去了,如果是你应该暂时先将它们移除掉。

因为当连接它们时会有一些的例子是不能正常工作的)

启动BricxCommandCenter

我们将使用BricxCommandCenter来写程序,通过双击就可以启动它。

(我假设你已经安装了BricxCommandCenter,如果没有,请从网页上下载并安装)程序会询问你,机器人在那里,打开你的机器人,并点击OK,程序会自动的找到机器人,现在你就会看到用户介面出现在你的面前。

[P6图片]

用户介面看起来像一个标准的文本编辑器,有普通的菜单,有打开,保存,打印等等的按钮。

这里也有一些特殊的菜单,如编译、下载程序到机器人和从机器人中收集信息。

你现在可以怱略这些。

我们打算写一个新的程序,因此点击NewFile按钮来创建一个新的空窗口。

写程序

现在输入下面的程序:

threadmain

OnFwd(OUT_B,100)

OnFwd(OUT_C,100)

wait4000

OnRev(OUT_BC,100)

wait4000

Off(OUT_BC)

exit

endt

这些东西开始看起来有点复杂。

因此让我们一起来分析它。

NBC的程序都是由线程(threads)来组成,我们的程序就含一个线程,名字叫做main,每个一程序都必须含有一个叫main的线程,它是由机器人来调用的,你会在第五章中学到更多有关线程的知识。

一个线程是由一堆的命令所组成的,通常也叫做语句(?

),每个语句占用一行,因此一个线程(原文用task,估计是从NXC中抄过来的)看起来通常会像这样:

threadmain

statement1

statement2

endt

让我们逐行来看程序

OnFwd(OUT_B,100)

这个语句是告诉机器人启动B输出口,连接在标记为B输出口的电机会向前移动(转动?

),100是指速度的百分比值,在这里它会以最大的速度移动。

OnFwd(OUT_C,100)

同样的语句,不过现在我们启动的是电机C,经过这两条语句后,两个电机都将运行。

而机器人也会向前移动。

wait4000

现在是时候让它停下来一会儿。

这个语句告诉我们会停4秒,给出的参数是以毫秒为单位的。

(1/1000秒),因此你能非常精确的告诉程序要等待的时间长度。

在这4秒中,程序什么都不干,而机器人将继续向前移动。

OnRev(OUT_BC,100)

机器人现在已经走得够远的了,因此我们告诉它往相反的方向走,这就是向后走。

注意,我们能够使用OUT_BC作为参数来同时设置两个电机。

我们当然也能将前面两个语句通过这种方式合并。

我们也能使用OnFwd(OUT_BC,-100).来实现。

wait4000

再次等待4秒。

Off(OUT_BC)

最后,我们关闭两个电机。

exit

这个语句告诉NXT这个线程结束了,不过这个不是必须出现在线程结尾的,只是推荐这样做。

注意,它经常出现在线程的别的地方。

这就是整个程序,它会驱动两个电机向前4秒,然后向后4秒,最后关闭它。

你可能会注意到输入程序时的颜色,它们自动出现,编辑器通常会用颜色及样式高亮显示特定的语法。

运行程序

一旦你写好了程序,程序就需要编译(这是将它改变成机器人能认识和执行的代码),和使用USB或蓝牙发送到设备上(叫“downloading”程序)。

在做这些之前,你需要命名你的程序,你保存它到你的硬盘上就行了。

当你保存时,一定要保证文件的扩展名是“nbc”,告诉BricxCommandCenter这是一个NBC的程序。

[P8图片上]

保存完文件后,你可以编译和简单的点击下载按钮下载它。

假设你在录入程序时没有犯任何的错误,它就会正确地被编译和下载(如果你的程序中有错误,你会得到一些通知,看下面的图)现在你能够运行程序,按这样做:

在NXT中选择“SoftwareFiles”,查找“1-simple”,再使用橙色的键来运行它。

另一种方法是,你可以通过BricxCommandCenter来运行它,在你的窗口中点击绿色的运行按钮(看上面的图片)。

机器人能按你预期工作吗?

如果没有,电缆可能连接得不正确。

程序中的错误

当你录入程序时,会有一些合理的情况使你犯下错误,编译器会注意到这些错语,并会在窗体的下方报告这些错误,就是以下的图片所示。

[P8图片下]

它会自动选择第一个错误(我们打错了电机的名字),当有不止一个错误的时候,你可以点击这些错误的信息去找到错误的地方,注意,第一个错误经常会引起其它地方的错误,因此你最好只改正最前面的一些错误然后再编译一次。

****通常也要注意的是语法高亮在很多情况下会帮助避免错语,例如在我们输入的最后一句。

Of应该是Off才对,因为编辑器不认识这个命令,所以它没有高亮,因此你们可以在你编译程序之前发现到它们,这里还有一些错误是编译器不能找到的,如果我们输入OUT_B的话,它是不会被发现的,因为那个电机是存在的(尽管我们没有在机器人中使用它),如果你的机器个展现出非预期的动作时,这大概可能大概是你的程序中那个地方错了

改变速度:

可能你会发现,机器人的移动速度相当快,默认的情况下,机器人是以它最快的速度来移动的,如果要改变速度,只要在OnFwd中使用不同的参数值就行了。

动力是一个介于0到100的数值,是一个最大动力的百分比值,这里是我们新版本中的程序,这个机器人移动速度会较慢。

threadmain

OnFwd(OUT_BC,25)

wait4000

OnRev(OUT_BC,25)

wait4000

Off(OUT_BC)

exit

endt

在这个例子中,你可以看到速度的值以及等待时间的值都是重复的,如果你要修改它们,你必须在好几处地方去修改它,而你很可能会漏掉一个。

因此在NBC中(原文中有错),你可以定义一个常量值,就像下面所示的程序:

#defineSPEED25

#defineMOVE_TIME4000

threadmain

OnFwd(OUT_BC,SPEED)

waitMOVE_TIME

OnRev(OUT_BC,SPEED)

waitMOVE_TIME

Off(OUT_BC)

exit

endt

现在如果你需要改变速度,你只要修改一个地方即可。

增加注释

为了使你的程序更具可读性,最好是增加注释,只要你在行里输入//时,行剩下的地方就会被怱略这样它就成为了注释。

如果是长的注释,你可以把内容放在/*和*/之中,注释在BricxCommandCenter中是会被高亮显示的,整个程序看起来会像下面的样子:

/*Forwardandreverse

byRossCrawford

Thisprogrammakestherobotgoforwardandbackward

*/

#defineSPEED25

#defineMOVE_TIME4000

threadmain

OnFwd(OUT_BC,SPEED)//Driveforward

waitMOVE_TIME//Waitfor4seconds

OnRev(OUT_BC,SPEED)//Drivebackward

waitMOVE_TIME//Waitfor4seconds

Off(OUT_BC)//Stopmoving

exit//Exit

endt

总结

在这章中你写了第一个NBC程序,使用BricxCommandCenter。

你现在应该必得如何输入一个程序中,如何下载它到机器人并让机器人执行程序。

Bricx

CommandCenter还能做更多事情。

要得得更详细的说明,你可以查阅相关的文档。

这个教程主要讨论语言NBC,也包括一些必要的BricxCommandCenter的功能,以便于你的使用。

你也学习了一些NBC重要方面的知识。

首先,你学习每一程序都有名为main的线程,它总是被机器人所调用。

你同时学习四个最重要的电机相关命令:

OnFwd,OnRev和Off,和关于wait和exit的语句。

最后,你学习关于如何使用常最来使得程序范围内的变化更容易,也学习了使用注释也解析你的代码。

II.使用变量

变量是所有编程语言的重要组成部份。

变量是存储器某一位置,能存储值在其中。

我们能在不同的地方使用这些值,同时我们也能改变它。

让我通过一个例子来说明如何使用变量。

在不同的路线上移动

假定我们想要调整上面的程序成这样子:

机器人不再以向前的速度返回。

通过在返回的路程中变小速度值就达到这样的效果。

但是我们如何去做呢?

SPEED是一个常量,而常量是不能被改变的。

我们需要一个变量来代替它。

变量能容易地在NBC程序中定义。

这里就是新的程序

#defineMOVE_TIME4000

#defineSPEED100

#defineDECREMENT25

dsegsegment

Speedbyte

dsegends

threadmain

setSpeedSPEED

OnFwd(OUT_BC,Speed)

waitMOVE_TIME

subSpeed,Speed,DECREMENT

OnRev(OUT_BC,Speed)

waitMOVE_TIME

Off(OUT_BC)

exit

endt

我们已经引入变量Speed到程序中。

在你的程序中的所有的变量都必须在数据段里声明。

你可以按你所想设置多个的数据段,而且它们能在程序中的任何地方。

所有在NBC中的变量有全局的作用范围-它们能任何线程中的任何代码访问到。

数据段以segment语句开始,而ends结束。

每一片段都必须被命名,在segment和ends中的语句的名字都必须一致。

那么,现在让我们来解释程序中的新的语句。

dsegsegment

这语句指定一个名为“dseg”数据段的开头。

在我们的程序中,它是唯一的数据段同时也仅仅包含一个变量。

Speedbyte

这个语句声明Speed为byte类型。

变量名称必须以字母开头,但可以包含数字和下划线。

其它的字符将不能使用。

(同样适用于常量,线程名等等)

dsegends

这个语句指定了“dseg”数据段的结尾

setSpeed,SPEED

这语句把SPEED(早前被定义的常量)值赋给Speed变量。

注意,这也能

在声明变量时同时完成,只要把初始值放到变量类型的后面即可,例如:

SpeedbyteSPEED.

subSpeed,Speed,DECREMENT

从Speed变量所含的值中减去DECREMENT,然后再将结果保存回Speed中。

当你运行这程序时,你的机器人应在指定的时间内以全速向前走,然后同样的时间以较缓慢的速度的反向行走

我们除了可以在变量中减去一个值,同样我们能乘上,减去或除以(注意,除法的结果是一个截断后最接近实际结果的整数)一个数值。

当然你也能把一个变量与另外的变量相加,同时,也可以写出更加复杂的表达式。

这里是一些例子:

dsegsegment

aaabyte

bbbbyte

cccbyte

dsegends

threadmain

setaaa,10//aaaisnowequalto10

mulbbb,20,5//bbbisnowequalto100

movccc,bbb//cccisnowequalto100

divccc,ccc,aaa//cccisnowequalto10

addccc,ccc,5//cccisnowequalto15

exit

endt

现在让我们更细致地了解新的代码。

Setaaa,10

我们之前已经看过这样的语句,但我只是想指出,set的第二个参数只能是一个常量,这是有别于之前所讲的mov语句。

mulbbb,20,5

这个语句将20乘上5,然后将结果赋值到bbb变量中去,第二,第三个变量可以是常量或者其它的变量。

movccc,bbb

这个语句将bbb的值赋给变量ccc,与set不同,mov的第二个参数可以是常量或者变量

divccc,ccc,aaa

这个语句将ccc除以aaa,并将结果赋回给变量ccc中,注意这里只返回整数值。

所有的余数都被截断。

addccc,ccc,5

这个语句是在ccc中增加5

//--beginp13,byflexitime

在屏幕上显示结果

就如所见的一样,如果执行这些命令,ccc最后的值应为15。

但我们该如何检查它呢?

最容易的方式是在NXT屏幕上显示结果。

这是相当简单的–这里刚好有一个系统调用可以做到。

如下程序将演示它:

dsegsegment

aaabyte

bbbbyte

cccbyte

dsegends

threadmain

setaaa,10//aaaisnowequalto10

mulbbb,20,5//bbbisnowequalto100

movccc,bbb//cccisnowequalto100

divccc,ccc,aaa//cccisnowequalto10

addccc,ccc,5//cccisnowequalto15

NumOut(10,LCD_LINE7,ccc)

wait2000//waitsoyougettoseeit!

exit

endt

这是基本不必细讲,但是这里还是有重要的部分需要解释。

NumOut(10,LCD_LINE7,ccc)

这语句把ccc值转变成为一个字符串,然后调用系统函数DrawText在屏幕上显示出来。

ccc的值应该显示在屏幕的左下角位置。

wait2000

我们之前也看过这个语句-这里只是简单的暂停使得你能看到结果。

如果它不在这儿,程序将立即退出,NXT菜单将快速重写你刚才显示数值的屏幕而你将看不到!

随机数

以上所有的程序中我们确切地定义了机器人预期的动作。

但是,当机器人将做一些我们不知道的事情时,事情将变得十分有趣。

我们在运动中会有一些随机性。

在NBC中你能创建随机数。

下面的程序在机器人回退时使用一个随机的速度值。

//--beginp14,byflexitime

#defineMOVE_TIME4000

#defineSPEED100

#defineDECREMENT25

dsegsegment

Speedbyte

wRandombyte

dsegends

threadmain

setSpeedSPEED

OnFwd(OUT_BC,Speed)

waitMOVE_TIME

Random(wRandom,30)

addwRandom,wRandom,10

subSpeed,Speed,wRandom

OnRev(OUT_BC,Speed)

waitMOVE_TIME

Off(OUT_BC)

exit

endt

基本上与上面的程序一样,但我们不再速度值减去25,取而代之的是使用一个从10和40之间的一个随机数。

让我们看看它是如何做到的:

Random(wRandom,30)

这语句将产生0和29(含29)之间的一个随机整数,并把结果返回到wRandom中。

注意,结果将总是比第二个参数的值要小。

addwRandom,wRandom,10

这语句将增加10到结果中,因此现在它的值介于10和39之间。

subSpeed,Speed,wRandom

这语句将从速度值中减去刚才的结果,为接下来的OnRev语句做准备。

总结

在这章中你学习如何使用变量。

变量是十分有用的,但是他们被限制只能使用整数值。

但是,对于许多机器人的任务来说,这已经足够了。

你也学习了在NXT屏幕上显示一个值。

这技术对调试更复杂的程序时十分有用。

最后,你学习如何创建随机数,这样你就能为机器人设定一些无法预知的行为。

//--beginp15,byflexitime

III.流程控制

在之前的章节中我们看到许多操纵变量的方式。

但所有我们迄今为止所看到的语句都是按顺序执行的,这对一些事情是十分合适的,但是我们经常需要根据不同的条件来作出判断。

这些要求有一种比较变量的方式,同时能根据比较的结果来做不同的事情。

cmp和tst语句

你有时只是想要记录下比较的结果,以便你在稍后的程序中能使用。

使用cmp和tst语句就能容易地完成这一工作。

让我们看一下如何在程序中使用它们。

dsegsegment

aaabyte

bbbbyte

cccbyte

wRandombyte

dsegends

threadmain

setaaa,10

Random(wRandom,20)

movbbb,wRandom

cmpGT,ccc,bbb,aaa

NumOut(10,8,bbb)

NumOut(50,8,ccc)

wait2000

exit

endt

这程序应该是相当熟悉的–它是基于之前章节中的一个程序。

然而,这里有一个新的语句,让我们来看一下它:

cmpGT,ccc,bbb,aaa

这语句使用GT的比较方式进行bbb与aaa的比较,这是“大于”的意思。

然后,结果会储存在ccc。

因此,如果bbb大于aaa,那么ccc中存的值为1(在NXT固件中表示“真”),否则ccc将存入0。

这正是我们想要做的效果一样,为了稍后的程序操作,它将比较后的结果存放在一个变量中。

在比较语句接下来程序中将把bbb和ccc的值显示出来,这样你能看到比较操作是如何工作的。

接着,运行几次程序,检查ccc的值是否能正确地依赖于bbb的随机值。

那么tst语句又是怎样呢?

它与cmp刚好是一对难兄难弟,它的工作方式几乎一样,只是它只有3个参数,(即cmp)第四个参数被假定是零。

如下语句的效果是一样的:

cmpGT,ccc,bbb,0

tstGT,ccc,bbb

还有一些其它的比较类型,它们都能在cmp和tst中使用,这是它们的列表:

EQ等于

LT小于

LTEQ小于或等于

GT大于

GTEQ大于或等于

NEQ不等于

//--beginp16,byflexitime

brcmp和brtst语句

我们能使用cmp或者tst存储比较结果并可为后续程序使用。

同时,我们能在屏幕上显示它。

但是,我们如何才能实际使用它来做事呢?

一般地,机器人如果想依赖于测试结果来做不同的事情,那么可使用brcmp和brtst来完成这项工作。

在NBC中,所有程序分支语句都要求一个标签。

标签只是一串后面跟着冒号的字符。

标签能自己单独一行或者在一个NBC语句的开头。

让我们看一下一个例子:

dsegsegment

aaabyte

bbbbyte

wRandombyte

dsegends

threadmain

setaaa,10

Random(wRandom,20)

movbbb,wRandom

NumOut(10,8,bbb)

brcmpGT,Bigger,bbb,aaa

TextOut(50,8,'small')

brcmpLTEQ,Delay,bbb,aaa

Bigger:

TextOut(50,8,'BIG')

Delay:

wait2000

exit

endt

接下来,这相当类似于刚才的程序,与使用cmp存储比较结果不同,我们用brcmp来执行“条件”代码。

让我们一起分析丙个新的语句:

brcmpGT,Bigger,bbb,aaa

这是不是看上去十分类似于刚才程序中的cmp语句?

事实上,同样的比较操作将会被执行,但与存储比较结果不同,它用于决定是否跳过程序直接到达下面定义的“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”代码结束时无条件跳转到这一标号上。

让我们看一个例子:

//--beginp17,byflexitime

#def

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

当前位置:首页 > 外语学习 > 日语学习

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

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