UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE



Documenti analoghi
Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Grafico della parabola

LA SCHEDA DEL MODULO BLUETOOTH

Corso sul linguaggio Java

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

GESTIONE DEI PROCESSI

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Introduzione alla programmazione in C

Algoritmi di Ricerca. Esempi di programmi Java

FrerEnergy: PROGRAMMA PER LA SUPERVISIONE DEI CONSUMI DI ENERGIA ELETTRICA

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

Registratori di Cassa

Manuale di programmazione BerMar_Drive_Software

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Eclipse - Nozioni Base

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

Tutorial 3DRoom. 3DRoom

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

L interfaccia grafica in Java

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

WINDOWS: Istruzioni per l uso

Utilizzo del plugin ApSIC Xbench per SDL Trados Studio 2014

Leggere un messaggio. Copyright 2009 Apogeo

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Università di L Aquila Facoltà di Biotecnologie Agro-alimentari

Invio SMS. DM Board ICS Invio SMS

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

RIPETITORE DI SEGNALE WIRELESS PER SISTEMA VIA RADIO ART. 45RPT000

Manuale. Interreg. Workflow di Ripianificazione. Manuale workflow di ripianificazione 1/22

Matematica in laboratorio

BMSO1001. Virtual Configurator. Istruzioni d uso 02/10-01 PC

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Eliminare il messaggio "Rete non identificata" da Windows 7

SmartGPS Satellite Information System Guida all utilizzo del programma Sviluppato da Fabio e Marco Adriani Versione 1.0.0

LA SCHEDA DEL MODULO ARMS

Java threads (2) Programmazione Concorrente

NOTE OPERATIVE. Prodotto Inaz Download Manager. Release 1.3.0

Il calendario di Windows Vista

Esercitazione n 4. Obiettivi

Il software ideale per la gestione delle prenotazioni GUIDA UTENTE

IL MOTORE PER IL BACINO

Gestire immagini e grafica con Word 2010

Architettura MVC-2: i JavaBeans

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

I CONDENSATORI E I RESISTORI DEL KIT

BIBLIO. Fabio Cannone Consulente Software. Settembre fabcanno@gmail.com -

Versione 7.0 Taglie e Colori. Negozio Facile

Struttura di un programma Java

Mac Application Manager 1.3 (SOLO PER TIGER)

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Java Virtual Machine

Programmazione a Oggetti Modulo B

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

HP Advanced Profiling Solution Guide introduttiva

RILEVA LIGHT Manuale dell Utente

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Guida all uso della piattaforma. portale Weblog & Podcast del MIUR COME UTILIZZARE AL MEGLIO L AMMINISTRAZIONE DEL BLOG

Java: Compilatore e Interprete

appunti delle lezioni Architetture client/server: applicazioni client

Guida alla gestione delle domande di Dote Scuola per l A.S Scuole Paritarie

Guida alla registrazione on-line di un DataLogger

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

Mon Ami 3000 Multimagazzino Gestione di più magazzini fisici e/o logici

Programmazione Orientata agli Oggetti in Linguaggio Java

Per utilizzare il sistema VCP il programmatore deve inserire una porzione di codice di VCP nella sua applicazione.

Fatturazione elettronica con WebCare

MANUALE SOFTWARE F24 ISTRUZIONI PER L UTENTE

Guida rapida Vodafone Internet Box

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

19. Introduzione al multi-threading

Con accesso remoto s'intende la possibilità di accedere ad uno o più Personal Computer con un modem ed una linea telefonica.

Multithreading in Java. Fondamenti di Sistemi Informativi

VRbot e ROBONOVA-I (rev. 1.2)

Creazione Account PEC puntozeri su Outlook Express

Appunti di Informatica 1

istruzioni per l uso

La struttura dati ad albero binario

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11

Introduzione all uso di Eclipse

INTERFACCE GRAFICHE IN JAVA CON SWING DISPENSE

QG Gestione Assenze. Inserimento per Classe. Per la gestione delle assenze accedere dal Menu Giornaliere->Assenze e Giustificazioni

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Guida all uso di Java Diagrammi ER

Un esercizio d esame. Flavio De Paoli

MOBILE WEB DESIGN TUTORIAL ANDROID METAIO AUGMENTED REALITY

Mon Ami 3000 Produzione interna/esterna Gestione della produzione interna/esterna

Corso Eclipse. Prerequisiti. 1 Introduzione

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

ISCRIZIONE GARE NUOTO ON LINE ISTRUZIONI OPERATIVE PER LE SOCIETA

Concetto di Funzione e Procedura METODI in Java

Codifica: dal diagramma a blocchi al linguaggio C++

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Transcript:

IDROID 86 LAB pagg 12-13 23-04-2007 14:57 Pagina 12 I-D01 LAB UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE PROGRAMMAZIONE Alcuni comportamenti predefiniti attivabili su I-Droid01 sono facilmente riproducibili utilizzando il linguaggio di programmazione C-like. Nel codice presentato in questo esempio realizzeremo un semplice clone del comportamento SeguiVisione, introducendo un interessante variante. Nel seguente esempio in C-like vediamo come implementare un programma clone del comportamento predefinito di I-Droid01 SeguiVisione. Ricordiamo che quest ultimo fa sì che il robot segua con la propria testa i movimenti di un oggetto opportunamente colorato, rilevato per mezzo della CMOS camera. Il riconoscimento degli oggetti avviene elaborando le immagini acquisite dal sensore: i pixel aventi un colore simile a quello indicato come target vengono raggruppati al fine di localizzare aree contigue che corrispondano agli oggetti identificati. Nel comportamento predefinito tale colore è impostato su tonalità simili a quelle delle pelle umana e non è modificabile. In questo esempio, tuttavia, abbiamo aggiunto la possibilità di personalizzare a proprio piacimento il colore degli oggetti seguiti da I-Droid01. Più precisamente è possibile settare, nel codice C-like del programma, due differenti colori. Per passare da un colore all altro è sufficiente impartire i comandi vocali uno e due. Con il comando zero, invece, l applicazione viene fatta terminare. IMPOSTAZIONE DEI COLORI Per far sì che I-Droid01 riconosca in modo adeguato i colori che intendiamo settare come target, è necessario impostare questi ultimi con una certa precisione. La CMOS camera, infatti, non percepisce i colori esattamente come l occhio umano. Così, quello che alla nostra vista si presenta come un giallo intenso, ad esempio, potrebbe essere percepito come un giallo meno saturo. Effettuare la calibrazione dei colori è un operazione molto semplice. Per prima cosa dovrai procurarti una coppia di cartoncini colorati (con due colori diversi) di dimensioni pari a circa 15x15 centimetri. Ognuno dei due cartoncini sarà l oggetto che I-Droid01 seguirà quando saranno impartiti, rispettivamente, Sopra, l immagine di un cartoncino colorato scattata da I-Droid01 viene analizzata con un programma di grafica per rilevare le tre componenti di colore rosso, verde e blu. i comandi vocali uno e due. Dopo aver fatto ciò, fai scattare al robot una foto a ciascuno dei due cartoncini. Per ottenere il colore percepito dalla CMOS camera, è necessario aprire le immagini con un programma di grafica (come Gimp, scaricabile gratuitamente dal sito www.gimp.org) e utilizzare lo strumento contagocce per avere le informazioni sui colori nelle immagini stesse, in scala RGB (rosso, verde e blu). Per ognuno dei tre canali di colore sarà restituito un valore compreso tra 0 e 255. Annota la terna ottenuta per i due cartoncini: tali valori ti serviranno per settare in maniera opportuna i colori target nel codice C-like del programma. IL CODICE DEL PROGRAMMA Analizziamo ora il codice del programma. Dopo l importazione dei file di libreria robot.h e c-like.h, necessari per il funzionamento dell applicazione, sono presenti due variabili X e Y, adibite alla memorizzazione del baricentro dell oggetto identificato da I-Droid01. Oltre al comportamento Main sono presenti altri due comportamenti, 12

IDROID 86 LAB pagg 12-13 23-04-2007 14:57 Pagina 13 UN CLONE IN C-LIKE DI SEGUIVISIONE ESEMPI DI PROGRAMMAZIONE Codice C-like del programma clone di SeguiVisione, descritto in queste pagine. Il codice dovrà essere memorizzato in un file denominato visione.clike, caricato sul robot e compilato utilizzando il software Visual C-like Editor. Oltre al comportamento principale (Main) sono presenti altri due comportamenti, SeguiColore e ComandiVocali. Ricorda di personalizzare il codice del programma inserendo le opportune terne nelle istruzioni set_tracking_color. CODICE C-LIKE DEL PROGRAMMA #include "c-like.h" #include "robot.h" int X = 0; int Y = 0; declare( behavior(comandivocali) ); declare( behavior(seguicolore) ); void ComandoZero(); void ComandoUno(); void ComandoDue(); define( behavior(main)) // Main set_tracking_color(-,-,-,40); //Sostituire ai trattini i valori RGB led_on(led_red); start(comandivocali); start(seguicolore); define( behavior(comandivocali) ) local(voice_cmd) = wait_for (voice_cmd, update); switch (local(voice_cmd)) case CMD_ZERO: ComandoZero(); break; case CMD_ONE: ComandoUno(); break; case CMD_TWO: ComandoDue(); break; // ComandiVocali define( behavior(seguicolore) ) local(vision) = wait_for (vision, update); X = local(vision).x; Y = local(vision).y; lcd_clear(); lcd_write_int(1,1,x); lcd_write_int(2,1,y); if (X > 35) head_pan_r(1); else if (X < -35) head_pan_r(-1); if (Y > 20) head_tilt_r(1); else if (Y < -20) head_tilt_r(-1); // SeguiColore void ComandoZero() end(); void ComandoUno() set_tracking_color(-,-,-,40); //Sostituire ai trattini i valori RGB led_on(led_red); void ComandoDue() set_tracking_color(-,-,-,40); //Sostituire ai trattini i valori RGB led_on(led_yellow); ComandiVocali e SeguiColore. Il primo si occupa di cambiare il colore target, in base al comando impostato vocalmente ( uno o due ), oppure terminare il programma (comando zero ). Vengono inoltre impostati due diversi colori per i LED degli occhi, in base al comando ricevuto. Il secondo comportamento rappresenta invece il cuore del programma. In base al baricentro dell oggetto identificato dal robot, la testa viene spostata in modo da mantenere l inquadratura centrata. Nel tuo codice, che dovrai memorizzare in un file denominato visione.clike, ricordati di sostituire i primi tre parametri (relativi al colore) nelle istruzioni set_tracking_color, in base alle tue rilevazioni. L ultimo parametro (la soglia) dovrà invece restare impostato su un valore pari a 40. Le coordinate del baricentro sono mostrate sul display di I-Droid01, tramite le istruzioni lcd_write. Passiamo ora ad analizzare brevemente il comportamento Main: esso inizializza il colore target di default (scegliendo un colore tra quelli rilevati sperimentalmente) e avvia gli altri comportamenti del programma. 13

IDROID 86 LAB pagg 14-16 23-04-2007 14:59 Pagina 14 I-D01 LAB UN MONITOR PER LA TEMPERATURA PROGRAMMAZIONE Abbiamo visto negli esempi in Java dei fascicoli precedenti come sia possibile e relativamente semplice accedere ai registri di I-D01 per leggere il valore rilevato da alcuni dei suoi sensori. Nel nuovo programma proposto in questo fascicolo realizzeremo una semplice interfaccia per monitorare la temperatura ambientale. Nel programma Java di esempio proposto nelle prossime pagine, vedremo come sia semplice realizzare un interfaccia grafica per il monitoraggio della temperatura rilevata da I-Droid01. Quest ultima viene misurata dallo specifico sensore posto nello zaino del robot e gestito, come già detto, dalla scheda elettronica Arms. L interfaccia è molto semplice: sulla parte sinistra è presente una casella testuale che visualizza la temperatura rilevata; su quella destra, invece, compare un pulsante per mezzo del quale è possibile far pronunciare al robot la temperatura corrente. La casella di testo mostra due diversi colori in base al valore misurato: verde se inferiore ai 30 gradi centigradi, rosso, invece, se uguale o superiore. TEMPERATUREMONITOR L unica classe da cui è costituita l applicazione è TemperatureMonitor. Essa implementa sia i metodi per la realizzazione e per la gestione dell interfaccia grafica sia quelli per l accesso ai registri del robot. Essendo il programma costituito da una sola classe, è sufficiente inserire l intero codice in un unico Sopra, la schermata del prompt corrispondente al lancio del programma TemperatureMonitor; viene indicata come parametro di avvio la stringa COM3, indicante la porta seriale virtuale utilizzata in questo caso per stabilire la connessione via Bluetooth tra il robot e il PC. Qui sopra, il pannello per monitorare la temperatura, mentre viene rilevato un valore superiore a 30 gradi centigradi. Più in alto, invece, lo stesso display mentre il sensore del robot rileva una temperatura ambientale pari a 27 gradi. file denominato TemperatureMonitor.java. Per la compilazione e l esecuzione dell applicazione valgono le solite note viste nei fascicoli precedenti. Nella prima parte del codice Java sono presenti le dichiarazioni di pacchetto e di importazione delle classi ausiliarie necessarie per il funzionamento del programma. Oltre alle classi per la gestione degli elementi grafici, sono presenti quelle per la comunicazione con il robot e per l accesso ai suoi registri: notiamo come siano coinvolti i pacchetti relativi alle due schede elettroniche Arms e Voice. Il sensore di temperatura, in effetti, è gestito proprio dal primo di questi due moduli. Il secondo, invece, è necessario per far annunciare al robot la temperatura misurata. La classe TemperatureMonitor estende JFrame, adibita alla realizzazione della finestra grafica dell applicazione. L interfaccia del programma è minimale : come detto è presente una casella di testo per la visualizzazione della temperatura e un pulsante per attivare la pronuncia 14

IDROID 86 LAB pagg 14-16 23-04-2007 14:59 Pagina 15 UN MONITOR PER LA TEMPERATURA ESEMPI DI PROGRAMMAZIONE Esempio di codice Java per l implementazione di una classe per la realizzazione di un interfaccia grafica adibita al monitoraggio della temperatura ambientale, rilevata dall apposito sensore elettronico montato nello zaino di I-Droid01. public static void main [...] public TemperatureMonitor() [...] private class RefreshDisplay implements Runnable CLASSE TEMPERATUREMONITOR package communication.examples; import communication.handler.protocolhandler; import communication.handler.internal.internalhandler; import communication.transport.connectionprovider; import communication.handler.internal.internalmodule; import communication.handler.internal.voiceregister; import communication.handler.internal.armsregister; import java.io.ioexception; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TemperatureMonitor extends JFrame private static String portname; private ProtocolHandler protocol; private InternalHandler internal; private JPanel panel; private JLabel temp; private JButton speak; Thread t; boolean active = false; int x = 0; public void run() while(active) x = checktemperature(); if (x < 30) temp.setbackground(color.green); temp.settext(" Temperatura: " + Integer.toString(x) + " C"); else temp.setbackground(color.red); temp.settext(" Temperatura: " + Integer.toString(x) + " C"); try Thread.sleep(2000); catch (Exception e) // class RefreshDisplay private void saytemperature() [...] private boolean connetti() [...] private void disconnetti() [...] // class TemperatureMonitor di quest ultima da parte di I-Droid01. Il metodo main crea un istanza di TemperatureMonitor, invocandone il costruttore. Prima di fare questo, però, main controlla che sia stata indicata dall utente all avvio del programma la porta seriale virtuale per comunicare con il robot. Vediamo ora come è strutturato il codice del costruttore. Per prima cosa viene associata all evento chiusura della finestra la terminazione del programma. Sono poi istanziati e posizionati sul pannello dell applicazione i diversi elementi grafici. Per la disposizione di questi ultimi viene utilizzato un layout assoluto che stabilisce la precisa posizione di ciascun oggetto grafico, mediante le chiamate ai metodi setbounds. I primi due parametri indicano le coordinate (X e Y) in cui posizionare l elemento, mentre la terza e la quarta denotano la sua dimensione (larghezza e altezza). Tutti i parametri sono espressi in pixel. Alla pressione del pulsante speak viene associata l invocazione del metodo saytemperature. Infine viene attivata la connessione con il robot e avviato il thread t di tipo RefreshDisplay. Analizzando quest ultimo, il metodo run è composto da un ciclo while, eseguito ripetutamente finché il valore della variabile booleana active rimane true. Con una cadenza pari a due secondi, impostata tramite l istruzione Thread.sleep(2000), viene rilevata la temperatura ambientale misurata dal sensore. Per fare questo viene chiamato un altro metodo, checktemperature, di cui parleremo tra breve. Una volta memorizzato il valore della temperatura in un apposita variabile X, viene impostato il colore di sfondo della casella di visualizzazione: verde se X è minore di 30, rosso altrimenti. Occupiamoci adesso del metodo checktemperature. Come già accennato in precedenza, quest ultimo effettua una lettura nel registro di I-Droid01 relativo alla gestione del sensore di temperatura. Qualora si verificassero errori durante l accesso ai registri del robot, viene restituito il valore 1 per segnalare l anomalia. Il terz ultimo 15

IDROID 86 LAB pagg 14-16 23-04-2007 14:59 Pagina 16 I-D01 LAB ESEMPI DI PROGRAMMAZIONE Codice Java dei metodi della classe TemperatureMonitor. Sono mostrati per primi il metodo principale e il costruttore. Quest ultimo si occupa anche della visualizzazione dell interfaccia grafica sul monitor del PC e di lanciare la connessione con il robot, invocando il metodo connetti. A seguire sono indicati altri due metodi, il primo apposito per la lettura della temperatura rilevata dal sensore (checktemperature) e il secondo per l annuncio di tale temperatura da parte di I-Droid01 tramite il modulo Voice (saytemperature). I metodi connetti e disconnetti permettono come al solito di attivare e disattivare la connessione tra il robot e il PC tramite comunicazione Bluetooth. Per il codice di questi ultimi si può fare riferimento al fascicolo 77, pagine 13 e 14. METODI DELLA CLASSE TEMPERATUREMONITOR public static void main(string[] args) if (args.length < 1) System.err.println("Specifica la porta da usare per la connessione (es. COM5)"); return; portname = args[0]; TemperatureMonitor gui = new TemperatureMonitor(); // main public TemperatureMonitor() super("temperaturemonitor"); addwindowlistener( new WindowAdapter() public void windowclosing(windowevent e) active = false; disconnetti(); System.exit(0); ); setbounds(0,0,240,95); panel = new JPanel(); panel.setlayout(null); temp = new JLabel(" Temperatura: " + " C"); temp.setbounds(10,10,120,40); temp.setopaque(true); speak = new JButton("Voce"); speak.setbounds(140,10,80,40); speak.setfocusable(false); speak.addactionlistener( new ActionListener() public void actionperformed(actionevent e) saytemperature(); ); panel.add(temp); panel.add(speak); getcontentpane().add(panel); if (!connetti()) System.exit(0); t = new Thread(new RefreshDisplay()); active = true; t.start(); setvisible(true); // class constructor private int checktemperature() int[] buf = new int[1]; try internal.readregister(internalmodule.arms, ArmsRegister.TEMPERATURE, buf); return buf[0]; catch (Exception e) e.printstacktrace(); return -1; // checktemperature private void saytemperature() int[] buf = new int[1]; try internal.readregister(internalmodule.arms, ArmsRegister.TEMPERATURE, buf); internal.writeregister(internalmodule.voice, VoiceRegister.TEMPERATURE, buf); System.out.println("Speak!"); catch (Exception e) e.printstacktrace(); // saytemperature metodo, saytemperature, legge il registro associato al sensore di temperatura e attiva l annuncio da parte di I-Droid01 della quantità rilevata. Per fare questo è sufficiente scrivere tale quantità in un apposito registro del modulo Voice, più precisamente VoiceRegister.TEMPERATURE. Gli ultimi due metodi presenti nella classe TemperatureMonitor sono i consueti connetti e disconnetti, che rispettivamente attivano e disattivano la connessione Bluetooth tra il robot e il PC. Il codice di questi ultimi metodi è del tutto identico a quello già mostrato nel fascicolo 77, pagine 13 e 14, e utilizzato in vari programmi Java presentati nei precedenti fascicoli. Nel testare il programma qui descritto, fai molta attenzione a non sottoporre il sensore a temperature troppo elevate: oltre a danneggiare questo delicato componente, vi è il rischio di provocare danni ai circuiti adiacenti e alla stessa struttura di I-Droid01. 16