1、控制原理课程实验设计基于 LEGO Mindstorm NXT 套件2012 年 1 月助教:于文君本科控制理论原理授课教授:黄迅 研究员北京大学工学院航空航天工程系安静飞行器实验室http:/ LEGO 套件基础 .3一实验目的 .3二实验器材介绍 .3图 1 Lego 整体图 .3图 2 Lego 控制器、机电及传感器 .4三编程准备 .41. NXT Brick 系统处理 .42. IDE(Integrated Development Environment)配置 .53. LeJOS 的 HelloWorld 实现 .5附录:Java 基础 .61. 面向对象编程(OOP)基本概念 .
2、62. Java 开发准备 .73. Java 基本语法 .7实验二 Lego 电机驱动 .10一 实验目标 .10二 NXT Brick 和 Lego 电机介绍 .10三 电机驱动 .10四 实际操作 .11五 程序编译烧写执行 .11六 总结 .12实验三 传感器操作 .13一 实验目的 .13二 Lego 传感器简介 .13三 传感器编程 .13四 实验步骤 .15五总结 .15实验四 自主跟踪小车的搭建 .16一 实验目的 .16二 机械结构搭建 .16三 程序的编写 .16四 提高 .16实验五 自主实验 .17实验一 LEGO 套件基础一实验目的1. 了解 Lego NXT 套件的
3、架构和使用方法2. 掌握对 Lego NXT 套件的编程方法二实验器材介绍这套实验配套于黄迅老师的自动控制课程。目的:一方面验证自动控制的理论方法,初步学习控制的实际应用;另一方面锻炼同学们动手能力,了解工程实际中的控制实现方式。在本实验中,采用容易上手、简单易用的 LEGO NXT 套件。LEGO 是一个丹麦玩具公司,其产品风靡全世界。我们这里采取了其产品中性能较高的Mind-storm NXT 套件,这套套件机械结构齐全,电子设备较齐全,已经包含整个项目所需的设备。图 1 Lego 整体图图 2 Lego 控制器、机电及传感器想要在 Lego NXT 套件上进行一个项目设计,大致的流程是这
4、样的。首先需要利用 Lego 的机械积木设计并搭建一个机械结构,并合理的布置电机和控制器以及传感器,然后将算法编写成程序烧写在 Lego 的控制器中,如果设计得当,程序没有错误,则在 Lego 的控制器上运行此程序,即可以达到所要求的控制动作和目的。在完成这样一个项目之前,我们也需要做一些准备。主要分为两方面,一个是机械结构的设计,另一个是编程的准备。对于机械结构,不同的项目或实验需要不同的机械结构,需要仔细单独考虑。而对于编程有一些通用的环境设置需要我们在进入本学期的具体实验课程之前完成准备。三编程准备对于 NXT 的编程主要在计算机上完成,可以利用 Java 或者 Labview 来进行编
5、程。Labview 是一种图形编程的语言,有其一套对应的开发套件,但是其中处理复杂算法比较麻烦,所以我们采取的是 Java 语言,然后利用提供的 API和烧写工具进行编译解析成机器执行码,这是一个文件,然后利用工具将其烧写在 NXT 的控制器 NXT Brick 上面。对于这部分需要进行两方面的准备,一个是 NXT Brick 的系统处理,另一个是计算机上的集成开发环境(IDE)的配置。在具体配置之前,我们需要先安装 Lego 提供的驱动,在 windows 下需要运行一个安装程序,LabVIEW LEGO MINDSTORMS NXT Module 中的setup.exe。安装完成后将 NX
6、T Brick 与计算机用 USB 线进行连接既可以识别,在安装完成后可能需要重启计算机。然后需要安装 JDK(Java Development Kits) ,可以到官方网站去下载最新版本,Java 语言为完全开源的( Open-source) ,可以免费下载。没有 Java 开发经验的同学可以参考附录部分的 Java 简介。安装完 JDK 并进行环境变量配置后可以在控制台输入 java -version 或 javac -version 查看版本。然后安装 LeJOS_0.8.5.exe,查看环境变量。1. NXT Brick 系统处理直接购买回来的 NXT 套件中的 Brick 预装的是适
7、合 Labview 使用的界面系统(固件 Firmware) ,所以需要人工将系统修改为 LeJOS 的界面系统。LeJOS 是一套利用 Java 语言对 Lego 套件进行开发的操作系统,它提供一套相应的 API,使用户可以直接通过封装好的接口对于 NXT 套件进行操作。我们这里采用的是 LeJOS_0.8.5。如果已经在 NXT 上烧写过 LeJOS 固件,则这部分可以忽略。否则,我们需要将 NXT 的系统烧写为 LeJOS。烧写过程如下:首先把 NXT 切换到固件上载模式(firmware upload mode) ,只有在这个模式下才能升级 Firmware。切换方式是在开机状态下,用
8、牙签或者曲别针持续按下 NXT 主机背面的重启按钮 4 秒钟以上。进入 NXT 的固件上载模式。安装完 LeJOS 后会自动弹出对话框以供选择,进行各种操作。详细内容可以参考文档“Develop LeJOS Programs Step by step” 。在 LeJOS 运行的过程中,包括正在运行程序时,同时按下桔色和灰色的按钮(Enter+Space)就可以立即将 NXT 关闭。如果要重新启动只要按下桔黄色的按钮。如果 NXT 突然死机的话,将电池全部取出后重新安上启动即可。2. IDE(Integrated Development Environment)配置这里我们采用 Java 编程语
9、言,在 Windows 下的 Eclipse 中进行开发。Eclipse 也是一个开源的项目,可以在其官方网站上下载到最新版本。我们采用windows 下开发 Java 的版本。安装完 LeJOS 和 Eclipse 后,我们还需要自己设置几个按钮,设置这三个按钮的目的是方便调试和编译。步骤如下:1. 选择菜单中的“Run External Tools External Tools Configuations”,先点一下“Program”,然后单击左上角的“New Launch Configuration”创建新的外部工具2. 按照下面的设置填写三个工具,工具 1:编译工具(NXJ compi
10、le tool)location - D:lejos_nxjbinnxjc.bat (请换成自己的目录)Working Directory - $project_locArguments- $java_type_name.java工具 2:下载工具(Download To NXJ)location - D:lejos_nxjbinnxj.batWorking Directory - $project_locArguments- $java_type_name工具 3:查看工具(NXT Explorer)location - D:lejos_nxjbinnxjbrowse.batWorking
11、Directory - D:lejos_nxjbinArguments- 空的3. 点击工具栏中 External Tools 的向下的箭头,选择“Organize Favorites”。在打开的窗口中,把刚才添加的三个工具全部加进来。3. LeJOS 的 HelloWorld 实现1. 创建一个新的工程。选择 File New Project 打开新工程选项窗口,选择 Java 下的 Java Project。2. 输入工程名称,下一步。3. 设置 ClassPath。单击菜单中的 Project Properties。在左侧选择“Java Build Path”,然后在右侧选择“Libra
12、ries”。这时候点击“Add External JARs”,打开之前安装 Lejos 的目录,选中 classes.jar 文件,然后可以选择 Finish。4. 输入以下代码import lejos.nxt.*;public class MyFirstNxtProject %此处需要按照自定义的工程名修改public static void main(String args) throws InterruptedExceptiondoString s =“Hello World!“LCD.clear();LCD.drawInt(int)(Runtime.getRuntime().freeM
13、emory(),0,0);LCD.refresh();Thread.sleep(10);while(true);完成后单击工具中的 NXJ Compile 进行编译,正常情况下不会出现任何错误,表示编译成功。这时候打开 NXT 的电源,用 USB 线连接到电脑,听到“嘟”的一声,表示 USB 设备已经就绪。这时候单击工具中的 NXJ Download,把编译好的代码下载到 NXT 内部。现在在 NXT 上操作,用按钮选中MyFirstNxtProject 并执行,该程序会显示目前 NXT 可用的内存数。附录:Java 基础1. 面向对象编程(OOP)基本概念由于大部分同学仅仅接触过 C 语言,
14、而 C 语言是面向过程的。所以在这里以 Java 为例简要的介绍一下面向对象的编程语言。不同于控制过程的面向过程的语言,在面向对象的编程语言中,事物对象(Object)是最基本的单位。在 Java 编程中,最基本的单位是类( class) ,所有的语句均属于某个类。一个一般的类有两个部分组成,一个是成员变量(variable) ,一个是方法(method ) 。 “方法”类似于 C 语言中的函数概念。类与类之间会有一定的层次结构关系。所有的类均从 Object 类继承而来。子类可以继承父类的一些属性,即成员变量和方法,并且子类可以修改其中一些的变量和方法,也可以增加新方法。java 中不允许多
15、继承,只能单继承。面向对象的编程思路,一般是这样的。我们利用已有的类,或者自己创建的类,将其实例化,产生一个或多个对象,通过对象调用类中的方法和成员变量,从而对问题进行处理,得到所需要的结果或效果。2. Java 开发准备利用 Java 语言开发首先要搭建编程的平台,这里以 Windows 为例,网络上有很多入门的教程大家可以参考一下。首先我们要准备一台 Windows 操作平台的计算机,然后下载JDK。 JDK( Java Development Kits)是 Java 编程必备的工具集,我们可以在Oracle 公司的官方网站上免费下载到最新的 JDK,目前最新的版本是 1.7,我们需要 1
16、.5 版本以上来开发 LeJOS。下载安装后需要设置环境变量,具体的设置方法如下:右键“我的电脑” (计算机,括号内为 win7,下同) ,选择“属性” (选择属性后需要选择高级系统设置) ,然后选择“高级”标签页,可以找到“环境变量”按钮。点击弹出当前用户和系统的环境变量,在用户变量中新建以下几个变量:JAVA_HOME=安装点Path=%JAVA_HOME%bin;%Path%classpath=.;%JAVA_HOME%libtools.jar;%JAVA_HOME%jrelibrt.jar注意 classpath 右端开始处有个点。新建完成后点击确定即可。然后我们需要安装开发工具 Ec
17、lipse,这是一个 IBM 牵头的开源项目,我们可以在 Eclipse 官方网站上下载到最新的 Eclipse 版本。JDK 安装成功后,可以顺利打开 Eclipse,弹出 Eclipse 的欢迎界面,其中有一些有用的入门信息。只要安装了 JDK,不使用 Eclipse 也可以编写 Java 程序,但是 Eclipse 较为方便,也提供较全面的功能。3. Java 基本语法对于熟悉 C 语法的同学来说,java 的语法基本一致,不同之处在于面向对象的思想。Java 的关键字如下(1.5):abstract continue for new switchassert default if pa
18、ckage synchronizedboolean do goto private thisbreak double implements protected throwbyte else import public throwscase enum instanceof return transientcatch extends int short trychar final interface static void class finally long strictfp volatileconst float native super whileJava 的句法基本和 C 相同,对于条件语
19、句,循环语句的结构,C 和 Java 基本通用,语句结束也由分号标示。程序块由标示分界。注释由 /或/*/标示。Java 的数据类型分为两种,一种是原生数据类型,另一种是派生数据类型。Java 的原生数据类型有八种,boolean,byte ,short,int ,long,float,double,char。除此以外均不是原生数据类型。原生数据类型不属于任何类,但是对应的有一些类表示它们代表的内容,如对应 int 原生类型有 Integer 这样一个类。我们可以先分析一下 Java 的 Helloworld 作为入门基础。/ / Sample HelloWorld application /
20、 public class HelloWorldApp public static void main (String args) System.out.println (“Hello World!“); 在这个程序中有一个类 HelloWorldApp,它是一个 public 类型的类,意思是访问的权限是公共的。这个类中有一个方法,这个方法名为 main,并且它的前面有 public static void 三个关键词修饰,参数为一个 String 数组,一般均采用这种标准写法,改换写法可能报错。这个方法是程序的入口。不同于 C 语言,一个Java 项目中可能有多个 main 方法,位于不同
21、的类中,一般是用来测试用的。在运行时我们需要指定某个类为入口,其必须具有一个 main()方法,用作程序的入口。程序运行进入这个类的 main 方法后,运行 System 中的 out 中的 println()方法,这个方法在控制台上打印出引号内的字符串内容,即 Hello World!,并换行。再看一个更复杂一点的例子。在文件 MyPoint.java 中键入以下代码:public class MyPoint public int x;public int y;public String toString() return (“ + x + “,“ + y + “);在文件 TestMyPo
22、int.java 中键入以下代码:public class TestMyPoint public static void main(String args) / Step 1: declare variablesMyPoint start = new MyPoint();MyPoint end = new MyPoint();/ Step 2: assign data attributes of start and endstart.x = 10;start.y = 10;end.x = 20;end.y = 30;/ Step 3: print out start and endSystem
23、.out.println(“Start point is “ + start);System.out.println(“End point is “ + end);System.out.println();/ Step 5: declare and assign stray to endMyPoint stray = end;/ Step 6: declare and assign stray to endSystem.out.println(“Stray point is “ + stray);System.out.println(“End point is “ + end);System.
24、out.println();/ Step 7: assign new values to straystray.x = 47;System.out.println(“Stray point is “ + stray);System.out.println(“End point is “ + end);System.out.println(“Start point is “ + start);这个程序的第一个文件是类 MyPoint 的定义,其中包括成员变量 x,y 和一个方法 toString(),第二个文件是类 TestMyPoint 的定义,同时是程序的入口。这两个文件需要放在同一个目录下
25、,在 main()中的 step1 中的语句是生命并创造一个MyPoint 的实例,等号右边 MyPoint()方法叫做 MyPoint 类的构造方法,每个类都有一个默认的构造方法,供创建这个类的实例时使用,如果用户对于构造方法有要求(比如说本例中想要创造出来的点的初始坐标为(0,0) ) ,则可以重写这个方法。在创建一个对象时,必须要调用构造方法。New 为关键字,意义和用法类似于 C 中用法。创造出来的两个实例 start 和 end 经过赋值,然后在屏幕上打印出来。这里需要说明的一点是,start 和 end 并不是直接代表这两个点,而是叫做引用(reference) ,类似于 C 中的
26、指针。真正的创造出来的两个点的实例存在于内存的某个地点,而这个引用指向内存中的地址。有兴趣的同学可以运行上面的程序,观察和思考程序的输出更深入的理解这个问题。另外值得提到的一点事,面向对象的程序开发,很多时候需要查阅开发文档,各个类中的成员变量和方法的使用,程序员不可能完全的记忆清楚,所以需要经常查阅文档,对于 Java 和 LeJOS 的开发更是需要仔细的查阅文档的叙述,才能有效的利用现有工具,提高编程效率。实验二 Lego 电机驱动1 实验目标1. 了解 NXT Brick 和 Lego 电机的基本性能2. 学习程序的编写和烧写过程3. 学习控制电机的转动2 NXT Brick 和 Leg
27、o 电机介绍NXT Brick 是 Lego Mindstorm NXT 系列的封装好的控制器,使用容易方便。这个控制器是 2006 年 9 月发布的新一代套件核心,采用了 32 位 ARM7 (48MHz)微处理器,具有蓝牙无线模块,及 USB 接口。NXT 的显示屏幕是一个分辨率为 100x64 的 LCD 屏幕,LCD 屏幕一共可以显示 8 行 16 列 ASCII字符,可以用内置的 LCD 对象来控制显示内容。拥有四个传感器接口和三个精确的伺服马达接口。主要的电机和传感器有下面几种: 触摸传感器,通过按下、释放触动传感器前端的按钮,可以进行记数。前端按钮带有十字孔,既方便安装固定传感器
28、,也方便制作缓冲器装置。 光电传感器,读取环境光的强度及反射光线,灵敏度更高,可以识别多种颜色。 超声波传感器, 感觉距离,识别物体,识别运动。检测距离 0255cm, 检测误差/-3cm,检测物体范围 150 度。 声音传感器,可以测量噪音(dB 或 dBa)。 伺服马达,内置角度传感器,可以测量速度及行进距离,并传回给 NXT 控制核心。可以精确控制机器人先进方向,误差仅为 1 度,更易控制机器人走直线。值得注意的一点是,由于主频不高并且内存较低,NXT 上面不能进行较为复杂的计算,进行比较复杂的计算时,可以用 USB 或者蓝牙与计算机连接进行辅助计算。三 电机驱动电机的驱动主要通过一系列方法实现,通过电机驱动的学习,我们学习使用LeJOS API 的一般方法。我们首先要查阅 API doc 中的电机相关的叙述。打开文档lejos_NXJ_win32_0_8_5betalejos_nxjprojects 目录下寻找 index.html,这个是文档的目录,通过它可以访问相关的文档。doc 文件夹内均有 index,Lego NXT的电机的信息我们通过打开的网页的左边 All Class 中寻找,电机的类名为