leJOS是什麼?
leJOS NXJ 是可執行於樂高NXT主機上的JVM (Java Virtual Machine)。在2000年,一些程式愛好者提出一個名為「TinyVM」的計畫並推出第一版的leJOS,因此可以在RCX上進行物件導向程式設計,並可以用標準的Java語法來發展機器人應用程式。leJOS的穩定成長可歸功於整合了許多特色和Java的功能,leJOS可以在各種作業系統上開發,例如Windows、Linux 和Mac OS,除此之外,您也可以在Android裝置上來開發機器人應用程式。
時至今日 leJOS 已經是相當成熟的機器人開發環境,除了使用正規Java語法之外,也針對機器人開發出許多對應的套件,例如各種特殊感應器存取,定位與導航等等。另外 leJOS 也用於樂高 EV3 與 NXT 機器人平臺,敬請期待,並請參考本團隊出版的 [機器人程式設計與實作 使用JAVA]第二版。
leJOS與 LEGO EV3機器人
leJOS與 LEGO NXT機器人
從leJOS可以學到什麼?
1. 使用正規Java語法
2. 網路通訊與 Android 行動裝置
3. 藍牙通訊與I2C傳輸應用
4. 定位與導航
如何開始寫第一隻程式並下載?(請點我閱讀)
如何安裝leJOS環境?
A. in Eclipse
1. leJOS NXJ是 Java 的擴充套件,所以需要先安裝JDK,請安裝 32 bit 的 JDK。目前最新的版本為leJOS 0.9.1 beta,並可於Eclipse中進行開發。請注意leJOS 不包含NXT驅動程式, 如您的電腦無NXT-G, LabVIEW Education Edition或相對應的模組,請至樂高 MindStorms官方網站下載NXT驅動程式,否則將無法下載程式到 NXT機器人上。
2. 請下載 Eclipse IDE (目前最新版本為4.3,但各版本皆可),但請選擇 32 bit。下載完成後解壓縮即可開啓 Eclipse 環境。開啓之後,請在 Eclispe 的 Help 選單下找到 Install New Software… 選項。
3. 請點選 Add… 來新增外掛軟體套件。Name欄位請輸入 leJOS 或其它名稱 (這無所謂),Location欄位請輸入:http://lejos.sourceforge.net/tools/eclipse/plugin/nxj/ ,接著就會透過網路來安裝 leJOS plugin 套件。安裝完成之後會在工具列上看到一個橘色 J 符號。

B. in cmd
1. 安裝 JDK,以及最新的 leJOS 0.9.1 beta
2. 檢查環境變數 (可參考Android setup)
變數名稱 |
變數設定 |
JAVA_HOME |
JDK安裝路徑,例如“C:\Program Files\Java\jdk1.6.0_23″ |
NXJ_HOME |
leJOS NXJ的安裝路徑,例如“C:\Program Files\leJOS NXJ” |
CLASSPATH |
建立CLASSPATH,值設為” . “ |
Path |
請新增“%JAVA_HOME%\bin “與“%NXJ_HOME%\bin “,不同路徑請用分號“; “隔開 |
3. 驗證leJOS. 請依序在cmd 下輸入: nxjc, nxj等指令, 若無出現 ‘nxjc’ 不是內部或外部命令、可執行的程式或批次檔 之訊息, 代表已成功建立leJOS開發環境。
如何更新 leJOS 韌體?
請點選工具列上的 leJOS 符號或是在 cmd 下輸入 nxjflashg 來啓動 NXJ韌體視窗,請將您的NXT開機並用USB 線來接上電腦,再點選Start Program按鈕,依序完成即可。
如何在 cmd 下使用 leJOS?
1. 新增檔案:在任一資料夾下新增一個文字檔,再把副檔名改為 .java,例如 Sample3_1.java。隨後編輯內容完成。
2. 編譯:在 cmd 下輸入 nxjc Sample3_1.java,請注意大小寫需要完全一樣,這時會在一個資料夾中產生 nxjc sample_1.class 檔,這才是要傳到機器人中的檔案。
3. 執行:在 cmd 下輸入 nxj Sample3_1 ,請注意沒有副檔名。如果希望下載之後馬上執行,請輸入 nxj -r Sample3_1
第一個leJOS範例程式
1. BC馬達直走4秒鐘後停止
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
import lejos.nxt.*;
import lejos.util.Delay;
class Sample3_1
{
public static void main(String arg[])
{
Button.ESCAPE.addButtonListener(new ButtonListener()
{
public void buttonPressed(Button b){System.exit(1);}
public void buttonReleased(Button b) {}
});
Motor.B.setSpeed(720);
Motor.C.setSpeed(720);
Motor.B.forward();
Motor.C.forward();
Delay.msDelay(4000);
}//main
}//class
[/pastacode]
2. 將指南針感測器值顯示在NXT螢幕上, 代表機器人的指向
[pastacode lang=”java” message=”show compass sensor value on NXT Screen” highlight=”” provider=”manual”]
import lejos.nxt.*;
import lejos.nxt.addon.*;
public class CompassTest {
public static void main(String[] args) throws Exception {
CompassSensor compass = new CompassSensor(SensorPort.S1);
while(!Button.ESCAPE.isPressed()) {
LCD.clear();
LCD.drawString("Bearing:", 0, 0);
LCD.drawInt((int) compass.getDegrees(), 0, 1);
Thread.sleep(500);
}
}
}
[/pastacode]
3. 循線前進軌跡車 單光感應器 + navigator
[pastacode lang=”java” message=”Line follower – single light sensor with leJOS navigator method ” highlight=”” provider=”manual”]
import lejos.nxt.*;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.subsumption.*;
import lejos.robotics.navigation.DifferentialPilot;
import lejos.robotics.navigation.RotateMoveController;
import lejos.util.PilotProps;
public class LineFollower {
public static void main (String[] aArg)
throws Exception
{
PilotProps pp = new PilotProps();
pp.loadPersistentValues();
float wheelDiameter = Float.parseFloat(pp.getProperty(PilotProps.KEY_WHEELDIAMETER, "4.96"));
float trackWidth = Float.parseFloat(pp.getProperty(PilotProps.KEY_TRACKWIDTH, "13.0"));
RegulatedMotor leftMotor = PilotProps.getMotor(pp.getProperty(PilotProps.KEY_LEFTMOTOR, "B"));
RegulatedMotor rightMotor = PilotProps.getMotor(pp.getProperty(PilotProps.KEY_RIGHTMOTOR, "C"));
boolean reverse = Boolean.parseBoolean(pp.getProperty(PilotProps.KEY_REVERSE,"false"));
Behavior DriveForward = new Behavior()
{
public boolean takeControl() {return light.readValue() <= 40;}
public void suppress() {
pilot.stop();
}
public void action() {
pilot.forward();
while(light.readValue() <= 40) Thread.yield(); //action complete when not on line
}
};
Behavior OffLine = new Behavior()
{
private boolean suppress = false;
public boolean takeControl() {return light.readValue() > 40;}
public void suppress() {
suppress = true;
}
public void action() {
int sweep = 10;
while (!suppress) {
pilot.rotate(sweep,true);
while (!suppress && pilot.isMoving()) Thread.yield();
sweep *= -2;
}
pilot.stop();
suppress = false;
}
};
Behavior[] bArray = {OffLine, DriveForward};
LCD.drawString("Line ", 0, 1);
Button.waitForPress();
(new Arbitrator(bArray)).start();
}
}
[/pastacode]
相關資源
1. leJOS官方網站
3. 淡江Java機器人教學網