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]


相關資源