Talk:Porting su Orocos di alcuni moduli software di Lurch
Dobbiamo sistemare la deadzone per l'esperto del joystick, poi dobbiamo decidere come passare a brian le coppie nome valore per il controllore fuzzy. Potremmo usare un dataflow per questo, invece un insieme di porte per ogni esperto con il quale deve dialogare brian
Contents
Cosa dobbiamo ancora fare
Ricapitolando le cose fatte fin'ora:
- Interfaccia con la porta seriale; - JoystickExpert - configurazione di Eclipse per usare orocos senza gestire manualmente makefile
Ora:
- dobbiamo fare Brian - bisogna mettere a posto il fatto delle dead zone
ci conviene dividere il lavoro.. per quanto riguarda il real time credo che un po' tutti i componente diventano real time con orocos
(Andrea, 26 luglio)
Agenti - BrianExpert
Secondo me, bisogna esplicitare il fatto che un thread debba essere svolto in modo real time.
Bisogna individuare gli agenti da rendere real time.
Sto ripassando il codice relativo a Brian e in particolare la lista di coppie nome-valore in input al controllore fuzzy e la lista con le variabili di uscita.
(Michele, 26 luglio)
Deadzone e comunicazione agenti
fatta la classe per la dead zone, ora bisogna solo applicarla;
per Brian ho pensato che lo scambio di messaggi tra i vari agenti si può fare con le porte, cioè
- uso readDataPort per ogni agente da cui arrivano messaggi - uso writeDataProt per ogni agente a cui mandare messaggi
quindi ho creato la classe commandManagerFake per usarla per sperimentare la modifica che riguarda la comunicazione tra command manager e brian. Infatti ora facciamo leggere a brian la velocità del robot solo tramite un metodo, per fare invece una cosa più generale conviene fare anche questo con le porte, magari fare così:
CommandManager task periodico che mette sulla porta (magari bufferizzata) il rho e teta che legge dalla seriale; Brian legge dalla porta quando ne ha bisogno (forse con la porta bufferizzata è più un casino perchè bisogna fare in modo che brian legga dati "recenti" quindi alcuni dati bufferizzati devono essere eliminati.
(Andrea, 2 agosto)
Brian Expert
Sto traducendo l'agente BrianExpert secondo lo schema su cui si basa Orocos: configureHook(), startHook(), updateHook() ecc. Ho visto che anche loro avevano fatto qualcosa di simile per ogni agente - funzioni Initialize(), Execute() e EndWork().
Nel loro BrianExpert.cpp ci sono anche molti rifermenti a tipi di messaggi che noi non useremo (ad esempio quelli dei sensori Hokuyo).
Sto cercando di capire il funzionamento della funzione di configurazione addOptions().
Ti mando per mail -una parte di codice relativa ad una prova su Orocos: Brian invia una stringa a MotorExpert come dicevi tu utilizzando le porte -una versione del loro BrianExpert.cpp cui ho aggiunto dei commenti su dove sono definite alcune funzioni e variabili e il loro significato.
(Michele, 3 agosto)
Porte ed eventi (comunicazione tra esperti)
Cosa facciamo? Una porta sola in brian e mandiamo i vari messaggi oppure una porta per ogni tipo di agente? Io propenderei per la seconda così si semplifica molto il lavoro di comprendere da chi arriva il messaggio
Ho visto un po gli eventi e stavo pensando che:
- gli agenti che devono inviare dati ad altri agenti possono usare le porte; - quando un agente deve invece reagire a qualcosa che è accaduto possiamo usare gli eventi.
Penso che la maggior parte degli agenti comunichi qualche dato.
(Andrea, 4 agosto)
Brian
Anche secondo me è bene fare in Brian una porta per ogni agente con cui comunicare. Ho visto che in "msg.h" sono definiti i vari tipi di messaggio. Nel nostro caso Brian si limita a comunicare con motorExpert e odoExpert; quindi dovremo mettere in Brian due porte di comuncazione.
Gli agenti si scambiano messaggi in formato XML.
Ti avevo scritto della funzione addOptions(), utilizzata nell'inizializzazione di BrianExpert: tale funzione utilizza la libreria boost c++.
Non è così semplice riuscire a separare la nostra parte da tradurre dal resto del codice. Ad esempio, in Brian.cpp ci sono queste due righe di codice relative alla famosa lista di coppie nome-valore:
mCL[SONAR_QUALITY_DATA]=SonarExpert::bad_quality; ... mCL[HOKUYO_DATA_QUALITY_HEADER+names[0]]=HokuyoConfig::getInstance()->getMaxQuality();
che richiederebbero di tradurre anche la classe HokuyoConfig e il sonarExpert!
(Michele, 4 agosto)
COmunicazione Espertio
secondo me dovremo fare:
- porta in lettura e scrittura per comunicare con command manager (che forse è meglio rinominare in joypadExpert o qualcosa di simile) - porta in scrittura per motorExpert (non vorrei dire una cavolata ma è Brian che manda messaggi a motor expert giusto?) - porta in lettura (e/o scrittura) verso odoExpert
forse noi non dobbiamo preoccuparci più di tanto di quello, forse possiamo usare la configurazione con l'XML delle proprietà per riuscire a gestire quelle cose.. oppure teniamo la configurazione come è nel codice
Ho un grosso problema.. non riesco a far funzionare le porte aggiunte con addEvent() come invece dovrebbero funzionare, ovvero appena arriva un dato dovrebbe essere eseguito l'updateHook().. tu hai per caso provato
(Andrea, 6 agosto)
Comunicazione Brian-MotorExpert
Brian può anche ricevere i messaggi da motorExpert:
//in BrianExpert.cpp ExecStatus BrianExpert::Execute(){
... if(ReceiveLastMessage(MSG_FROM_MOTION_BRIEF,buffer,false)>0){ InterfaceSetDatalex_memory((const char *)buffer,this); DBG("message from motion\n"); }
...
//in GestioneAgenti.cpp void GestioneAgenti::createMapMessageAgents(){
//aggiungere per ogni tipo di messaggio gli agenti che lo possono produrre ... messageAgents[MSG_FROM_MOTION_BRIEF]=vector<string>(); messageAgents[MSG_FROM_MOTION_BRIEF].push_back(motor_agent);
Guardo anch'io la addEvent e poi ti faccio sapere!
La parte del controllore fuzzy è più ampia del previsto: sempre in BrianExpert viene richiamato il costruttore MrBrian, che è definito in lurch-control/brian/src/brian.cpp. E quest'ultimo file a sua volta richiama tante altri file della stessa cartella.
(Michele, 6 agosto)
Pensando sempre a come potremmmo fare per le porte e gli eventi, forse potremmo dedicare le porte ad ogni esperto come dicevamo, poi dove vengono usati i messaggi noi usiamo gli eventi (che usano il publish subscribe).. sarebbe bello riuscire ad usare le addEventPort, ma non so come mai faccio fatica a farle andare. ho dato un occhi a odometry expert e sembra abbastanza simile a joypad expert perchè legge i dati da una porta seriale.
per MrBrian ho visto, è un programma che ha fatto restelli
(Andrea, 6 agosto)
Prova addEventPort di Orocos
Sembra proprio che una volta ricevuto il messaggio sulla porta, non venga richiamata la funzione updateHook(); oggi riprovo ancora! Sì come dicevi tu potremmo usare entrambi: messaggi attraverso le porte (quando è necessario comunicare dei dati) e gli eventi Quindi andre cosa dici copio il programma di Restelli? Tanto non ha a che fare con i thread, non manda messaggi e quindi in teoria va bene così com'è!
Ho utilizzato la addEventPort sul vecchio codice che ti avevo mandato l'ultima volta. In pratica ci sono due task: -Brian periodicamente scrive "sono Brian" e invia una stringa all'esperto motore - l'esperto motore appena riceve il dato sulla porta richiama l'updateHook(), scrivendo così "sono Motor Expert".
Quindi andre cosa dici copio il programma di Restelli? Tanto non ha a che fare con i thread, non manda messaggi e quindi in teoria va bene così com'è!
(Michele, 7 agosto)
Oggi ho finalmente capito (grazie al codice che mi hai mandato) come mai non funziona.. o meglio ho capito che funziona solo se usiamo una bufferPort e prima di fare la connectPorts bisogna chiamare la configure dei task (probabilmente dovuto ad un BUG di Orocos).
Si direi che dobbiamo includere nel nostro progetto il programma MrBrian di Restelli
Possiamo istanziare un Task attraverso una classe come launch nel main oppure all'interno del task dove serve, ad esempio command manager possiamo istanziarlo in brian oppure il Launch. Secondo te cosa conviene fare? Secondo me è meglio creare i task nel main in modo da dare una migliore visione di insieme.
Poi ho visto che alla fine odoExpert è simile al joypadExpert perchè deve comunicare con la scheda dell odometria
(Andrea, 8 agosto)
Sì anche secondo me è meglio far partire tutti gli agenti all'inizio nel main: tanto non ne abbiamo tanti!
(Michele, 9 agosto)
MotorExpert
ho guardato un po motorExpert e ho visto che fa riferimento molto a motorboard che è una wheelchirmotorboard1 e ho visto che sembra un doppione della nostra gestione comandi. Credo che la cosa funzioni così:
MotorExpert crea la catena di controllo, poi manda il comando ai vari controllori tramite doControl al quale passa il set point. la WheelChairBoard è secondo me inutile per noi e dovremmo solo mantenere la parte che si occupa di creare la catena di controllo con i vari controllore pid e fuzzy.
(Andrea, 8 agosto)
Odometria e organizzazione nomi
Ti mando quello che avevo fatto dove ho cominciato a tradurre la parte di odometria, ora manca solo la porta con cui comunicare, poi in quello che ti invio ho cercato di organizzare meglio i files, ho pensato di chiamare commandManager joypadMotorExpert, ho creato la classe vuota e l'ho messa nel nuovo namespace lurchExperts , se a te va bene copio i metofi di command manager in joypadMotorExpert
(Andrea, 16 agosto)