相關連結

leJOS是什麼?

  leJOS NXJ 是可執行於樂高NXT主機上的JVM (Java Virtual Machine)。在2000年,一些程式愛好者提出一個名為「TinyVM」的計畫並推出第一版的leJOS,因此可以在RCX上進行物件導向程式設計,並可以用標準的Java語法來發展機器人應用程式。leJOS的穩定成長可歸功於整合了許多特色和Java的功能,leJOS可以在各種作業系統上開發,例如Windows、Linux 和Mac OS,除此之外,您也可以在Android裝置上來開發機器人應用程式。

  時至今日 leJOS 已經是相當成熟的機器人開發環境,除了使用正規Java語法之外,也針對機器人開發出許多對應的套件,例如各種特殊感應器存取,定位與導航等等。

從leJOS可以學到什麼?

   1. 使用正規Java語法

   2. 網路通訊與 Android 行動裝置

   3. 藍牙通訊與I2C傳輸應用

   4. 定位與導航

  
 
如何安裝leJOS環境?

   leJOS NXJ是 Java的擴充套件,所以先安裝JDK。

   a. 進入leJOS官方網站,請點選左側欄leJOS NXJ下面的Downloads項目。目前最新的版本為leJOS 0.9,並可於

       Eclipse中進行開發。

   

   b. 選擇您的作業系統,請點選Win32 leJOS NXJ下面的下載連結。

   

   c. 點選「Download Now!」就可以開始下載了

   


   d. leJOS NXJ安裝完成之前,系統會顯示安裝NXJ韌體視窗,請將您的NXT開機並用USB 線來接上電腦,再點選Start Program按鈕,依序完成即可。
   
   

   e. 輸入環境變數 (可參考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 ",不同路徑請用分號"; "隔開

 

   f. 驗證leJOS

   請注意leJOS 不包含NXT驅動程式, 如您的電腦無NXT-G, LabVIEW Education Edition或相對應的模組,請至樂高 MindStorms官方網站下載NXT驅動程式

第一個leJOS範例程式

   1. BC馬達直走4秒鐘後停止
       
    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

   2. 將指南針感測器值顯示在NXT螢幕上, 代表機器人的指向

   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);
}
}
    } 

   3. 循線前進軌跡車   單光感應器 + navigator 

   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();
}
}  

相關資源