豆子的英文譯語怎麼說典-雄安县
2023年4月3日发(作者:韩国童星金有贞)
―――――――――――――――――――――――――――――
修改记录
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
现在如果你需要改变速度,你只要修改一个地方即可。
增加注释
为了使你的程序更具可读性,最好是增加注释,只要你在行里输入//时,行剩下的地方就会
被怱略这样它就成为了注释。如果是长的注释,你可以把内容放在/*和*/之中,注释在Bricx
CommandCenter中是会被高亮显示的,整个程序看起来会像下面的样子:
/*Forwardandreverse
byRossCrawford
Thisprogrammakestherobotgoforwardandbackward
*/
#defineSPEED25
#defineMOVE_TIME4000
threadmain
OnFwd(OUT_BC,SPEED)//Driveforwa读书的名言名句 rd
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变量。注意,这也能
在声明变量时同时完成,只要把初始值放到变量类型的后面即可,例如:Speedbyte
SPEED.
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的第二个参数只能是一个常量,
这是有别于之前所讲的m道貌岸然是什么意思 ov语句。
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
这是基本不必细讲,但是这里还是有重要的部分需要解释。
Nu竹喧归浣女拼音 mOut(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
更多推荐
NBC是什么意思在线翻译读音例句
发布评论