Robottiohjelmoinnin harjoitustyö : Debuggaus

 

Ohjelmien seuraaminen ja debuggaus

Koska NXT:n oma näyttö on varsin rajallinen ja etenkin liikkuvalla robotilla käytännössä mahdoton seurata toiminnan aikana, hyödyllisten debug-viestien tulostus laitteelle voi olla hankalaa. Tämän vuoksi on kätevää lukea viestit tietokoneen näytölle, minkä lejos.nxt.comm.RConsole mahdollistaa.

NXT kuuntelee yhteyttä koneelta joko USB-kaapelia tai Bluetooth-yhteyttä pitkin, ja yhteyden muodostuttua on mahdollista lähettää viestejä NXT:ltä näytölle. Tyypillisimmillään nämä voisivat olla esimerkiksi moottorien ja sensorien lukemia tai tilanvaihtoilmoituksia.


Etäkonsolikoodi

 
  • Käyttämällä RConsole-luokkaa voidaan käytännöllisesti seurata debug-viestejä tai muita tilatietoja tietokoneen ruudulta.
  • Viestejä voi lukea leJOSin työkaluilla, esimerkiksi nxjconsoleviewer ja nxjcontrol.


import lejos.nxt.comm.RConsole;

public class Debuggee {
    public static void main (String[] args) {
        // aloita USB-yhteyden kuuntelu
        RConsole.open();

        /* TAI:
           aloita Bluetooth-yhteyden kuuntelu
           (loputon timeout = 0) */
        // RConsole.openBluetooth(0);

        // … varsinainen koodi …
        RConsole.print("Tämä viesti näkyy jo etäkonsolissa.");

        /* KOODIA */

        // sulje yhteys
        RConsole.close();
    }
}

 

Viestien lukeminen

Laita RConsolea käyttävä ohjelma käyntiin NXT:llä 

  • NXT:n ruudulle ilmestyy teksti USB Console... tai BT Console..., jonka aikana yhteyden muodostusta odotetaan

Käynnistä nxjconsole tietokoneella

  • NXT:n ruudulle ilmestyy Console open, kun yhteys on muodostunut
  • RConsolen tulostamien viestien pitäisi näkyä koneen ruudulla

 

Poikkeukset

Kun ohjelma heittää kaappaamattoman poikkeuksen, esimerkiksi seuraavanlaisella koodilla:

 

Virheellinen koodi

import lejos.nxt.*;
public class Atsiih {
    public static void main(String[] args) {
        SensorPort p = SensorPort.PORTS[5];
    }
}

...ruudulle ilmestyy jotain seuraavankaltaista:

Java Exception:
Class: 28
Method: 2
PC: 921

Tämän merkitys saadaan selville, kun annetaan nxj-komennolle parametri -v, jolloin luokkatietoja tulostuu näkyviin:

... snip ...
Class 23: [I
Class 24: [J
Class 25: [V
Class 26: java.lang.ClassCastException
Class 27: java.lang.ArithmeticException
Class 28: java.lang.ArrayIndexOutOfBoundsException
Class 29: java.lang.IllegalArgumentException
Class 30: java.lang.InterruptedException
... snip ...
Class 49: java.io.IOException
Method 0: Class: java.lang.Object Signature: ()V PC 896 Signature id 2
Method 1: Class: java.lang.Thread Signature: run()V PC 897 Signature id 1
Method 2: Class: robokurssi.Atsiih Signature: main([Ljava/lang/String;)V PC 917 Signature id 0
Method 3: Class: lejos.nxt.SensorPort Signature: (I)V PC 924 Signature id 120
Method 4: Class: lejos.nxt.SensorPort Signature: reset()V PC 980 Signature id 219
... snip ...


Tästä nähdään, että main-metodissa (2) heitettiin ArrayIndexOutOfBoundsException (28). Poikkeuksen heittänyt koodin rivi nähdään jos linkkeriä komennetaan lisäämään ohjelmatiedostoon debuggaustietoja. Tästä enemmän leJOSin omissa ohjeissa.

 

Sensorien ja moottorien tarkkailu (Bluetooth)

LeJOSin mukana tuleva nxjmonitor on GUI-ohjelma, jolla saa näppärän yleiskuvan sensorien ja takometrien arvoista. Palikalle ei tarvita erityistä ohjelmaa jos halutaan vain lukea arvoja koska nxjmonitor kommunikoi LCP:llä, mutta jos halutaan monitoroida jotain omaa ohjelmaa, NXT:n ohjelma voisi olla seuraavanlainen:


Monitorointiohjelma (Bluetooth)

import lejos.nxt.Button;
public class Monitori {
    public static void main(String[] args) {
        // käynnistä säie kuuntelemaan monitorointiyhteyttä
        // ja ilmoittamaan arvoja
        LCPBTResponder lcpThread = new LCPBTResponder();
        lcpThread.setDaemon(true);
        lcpThread.start();

        Motor motor = Motor.A;
        LightSensor light = new LightSensor(SensorPort.S1);

        motor.setSpeed(100);
        motor.forward();
        Button.ENTER.waitForPressAndRelease();
    }
}

Käynnistä ohjelma NXT:llä ja sitten aja nxjmonitor, jolloin seuraavankaltaisen ruudun pitäisi ilmestyä ja mittarien päivittyä valosensorin ja moottorin lukemilla:

nxjmonitor

 

nxjcontrol

Vieläkin kätevämpi työkalu on ohjelma nxjcontrol, joka mahdollistaa kaukosäätimen tavoin moottorien ohjaamisen, sensorien lukemisen ja säätämisen lennosta, äänien soittamisen ynnä muuta. Rakenteen suunnittelemisessa tästä on paljon iloa.

nxjcontrol

Mikään ei toki estä kirjoittamasta vastaavaa, omiin tarkoituksiin paremmin sopivaa ohjelmaa itse.

 

Lisätietoa