本帖最后由 iRobot 于 2013-5-14 16:30 编辑
一觉醒来,LeJOS版块有了漂亮的Logo,鼓掌!课程继续。同学们都坐好了。
在正式讲课之前,首先要说一件事情,是关于如何学好LeJOS/Java。有些同学可能会想,“教程写的这么慢,这怎么学啊?我都等不及了”。孔子曾说过,学习不能靠看帖子。如果看帖子就能掌握一门技术,那还要书店和学校干什么,是吧。我的教程只是起到一个辅助作用,一个推动你学习的外因,真正的主动权掌握在你自己手中。
1. 创建你的HelloWorld
先科普一下。Hello World一词最早出现在由贝尔实验室成员Brian Kernighan撰写的内部技术文件《Introduction to the Language B》(1972)之中。此后渐渐成为一种编程习惯,在各个语言中广为流传。我们第一个程序也叫Hello World,除了表达对前人的敬意,更多的是一种图吉利,辟邪的含义在面。希望前辈的光环能照耀我们的编程之路。
首先确保NXT电源开启,并且用USB线连接在电脑上。
打开你的记事本,复制下面的内容在里面。 - import lejos.nxt.*;
- public class HelloWorld {
- public static void main(String[] args) {
- LCD.drawString("Hello World", 0, 0);
- Button.waitForAnyPress();
- }
- }
复制代码
这里要注意一下,我在上一课就讲过,只保证在0.9.1版本运行通过。因为不同版本之间的API也在不断变化。大家如果看过Programus和动力男孩之前翻译的开发文档,会发现最后一句话是Button.waitForPress();。这就是版本间的差异。这种事情是常有的。并不会造成学习的障碍。大家要认真学习,多思考,我们将掌握的是最根源的思想和方法。
点击“文件”,“另存为”,打开保存界面。注意三点 - 保存类型改为“所有文件”
- 文件名改为“HelloWorld.java”
- 路径尽可能短,例如D盘根目录下
这里面的知识点是: 1. Java严格区分大小写,所以HelloWorld!=(不等于)helloworld。当然想怎么命名是你的事儿,建议使用我的命名方式(大驼峰法)。 2. Java不支持空格,所以HelloWorld不要写成Hello(空)World。(严格来讲也可以有空格,不过最好不要多生枝节) 3. Java类名必须和文件名一致。类名就是我们代码里写的public class HelloWorld这句话。class说明这是一个类,HelloWorld说明这个类的名称叫HelloWorld。所以我们刚刚另存为操作时保存的文件名称就应该是HelloWorld.java。
文件保存好之后就可以开始我们下面的工作了。
2. 运行你的程序
java程序要运行,需要经过编译,链接过程。学过编译原理的同学知道,这是个复杂的过程。还好我们只要会用两个指令就足够了。 1. nxjc(编译) 2. nxj(链接,上传)
打开你的cmd窗口,输入“nxjc D:\HelloWorld.java”回车。如果没有任何报错信息出现,那就说明你成功了。这时打开你的D盘,会看到多出了一个HelloWorld.class文件。在这里说一下,class这个词会不断不断的出现,牢记他的意思是类,不是班级。看到这里要马上想到,现在你有一个叫做HelloWorld的类文件了。
继续在cmd窗口输入:nxj –r D:\HelloWorld。你可能会出现如图的错误。
从字面上讲,是找不到classes.jar文件。我在这个问题上卡了1个小时,这也是这篇教程迟迟不能发布的原因之一。直到后来我打开了官方的开发文档,它是你的安装目录下的README.htm文件,然后发现了这样一行字:
“Change workingdirectory to the folder containing HelloWorld.java”
这行英文的意思不难理解。
为什么我要把这个错误单独拿出来讲?因为我想告诉大家,当出现问题时,首先要想到官方提供的开发文档。开发文档是我们解决问题的最好帮手。我建议要看一遍中文的,也要看一遍英文的。网友翻译的中文版虽然是为了方便我们学习,但是却并不能保证总是最新的,最正确的。在中文文档和旧版本的英文文档中,均没有上述的那句话。这时我们从此处再往上数3行看过去,发现文档中已经是Button.waitForAnyPress();而不是中文版的Button.waitForPress()了。;
顺便向辛苦翻译的前辈表示最高的敬意。
下面我们按照文档提示更改路径。
在cmd输入:cd\ 回车,输入d: 回车。
因为我的HelloWorld放在d盘,所以我要把目录定位在d盘。请根据实际情况更改。
确保你的NXT电源还开启着。(我写到这里时早就自动关闭了。。。),在cmd输入:nxj HelloWorld 回车。注意没有路径和文件名,会自动添加。成功后cmd窗口显示成功信息,NXT屏幕上将出现你的第一个LeJOS程序:HelloWorld。成功了!
3. 运行其他程序 任何编程语言,提供给我们最重要的东西都会包括至少4大块内容:编译内核,开发文档,API文档,例子。编译内核就是nxj指令,开发文档的用处刚才也提到了,下面看看例子。默认位置是在我的文档下的LeJOS NXJ Samples文件夹。双击打开之后,有四个子目录。
从名字可以分析出,samples目录下放置的是nxt端的例子,pcsamples目录放置的是pc端的例子。打开samples目录。从文件名可以看出,.settings目录肯定是和设置有关,nbproject目录我也不知道是什么,打开之后发现是一个没用的文件。Src是source的简称,打开发现正是我们要找的目录。你可能会发现这个目录一层套一层很深,留意一下。学会分析目录结构,无论学习什么都用得上。
一直点击进去,可以看到有几十个例子。不急着动手,继续分析。看看都认识那些。
(下面的这个Acceltest例子我犯了个惊人的低级错误,实在是汗颜。Acc在LeJOS里的意思是Accelerometer,加速度传感器,而不是我原先以为的距离传感器。距离传感器应该是Ultrasonic,“雷达”。但是里就不做修改了,因为我想到可以用这个例子教给大家如何找到自己想要的传感器。请关注后期课程。但是下面这个例子本身还是可供参考的。)
Acceltest 接近是Access,翻译一下就是接近测试,那就是距离传感器的测试。
就从这个入手吧。打开目录,把里面的java文件拷贝到d盘根目录,然后运行nxjc和nxj指令。(首先打开java文件,删除第一行package org.lejos.sample. Acceltest ;,大家可能看着眼熟,这正是我们一层层进入的目录,所以为什么要删除,应该也能猜个差不多)。默认 的端口是1,该如何修改?我们打开代码看一下: - public class AccelTest {
-
- public static void main(String[] args) throws Exception {
- Accelerometer accelerometer = SensorSelector.createAccelerometer(SensorPort.S1);
-
- while(!Button.ESCAPE.isDown()) {
- LCD.clear();
- LCD.drawString("Accel", 0, 0);
- LCD.drawInt(accelerometer.getXAccel(), 6, 0, 1);
- LCD.drawInt(accelerometer.getYAccel(), 6, 0, 2);
- LCD.drawInt(accelerometer.getZAccel(), 6, 0, 3);
- Thread.sleep(500);
- }
- }
- }
复制代码 第三行,最后部分,SensorPort.S1 , 显然S1就是1号端口,依次类推。
继续看其他目录,有一个View,猜测就是检查所有功能,运行一下。果然,测试马达,传感器,系统状态都在里面。 再看看其他的。
- Btgps 蓝牙GPS
- Colorsensortest颜色传感器测试
- Speedtest速度测试
- Dswitchtest开关测试
- Nxtcamtest相机测试
我就不一一列举了。有认识的,有不认识的。先从认识的试起。LeJOS还是很厚道的,几乎每一个功能都有相应的测试项目,这是我们最大的帮手。如果你的程序需要获取颜色,就可以打开Colorsensortest文件,看看究竟是如何实现的。
4. 后记
下一课我讲解java的语法和API文档的用法,学会之后就可以初步读懂别人的代码涵义,并且可以尝试着自己写一些小程序了。
|