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.
|
import lejos.nxt.comm.RConsole;
public class Debuggee { /* TAI: // … varsinainen koodi … /* KOODIA */ // sulje yhteys |
Viestien lukeminen
Laita RConsolea käyttävä ohjelma käyntiin NXT:llä
- NXT:n ruudulle ilmestyy teksti
USB Console...
taiBT 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:
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:
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; motor.setSpeed(100); |
Käynnistä ohjelma NXT:llä ja sitten aja nxjmonitor, jolloin seuraavankaltaisen ruudun pitäisi ilmestyä ja mittarien päivittyä valosensorin ja moottorin lukemilla:
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.
Mikään ei toki estä kirjoittamasta vastaavaa, omiin tarkoituksiin paremmin sopivaa ohjelmaa itse.