logo logo
Home arrow Forums...
Monday, 21 May 2012
 
 
 
Conscious-Robots.com Forum  


<< Start < Prev 1 2 Next > End >>
sutaro
User

Gold Boarder
Posts: 47
graphgraph
Karma: 3  
Problemas con un servicio de un láser - 2008/10/15 02:06 Hola, Raúl, estoy intentando hacer un servicio que recoga los datos de un láser y los postee en un puerto de modo que otro servicio como por ejemplo un dashboard los muestree. Lo he intentado todo pero solo me muestra por pantalla una medida, pero no se actualiza, yo diría que es problema del servicio mío que gestiona el láser, pero no sé cómo solucionarlo y viendo el servicio sicklrf no llego a comprenderlo del todo,¿sabrías por dónde pueden ir los tiros?
Muchas gracias
File Attachment:
File name: SenaLaser.zip
File size:116172 bytes


Post edited by: sutaro, at: 2008/10/15 02:08
  The administrator has disabled public write access. Please, register to participate in the forum.
Raúl
Moderator

Moderator
Posts: 591
graph
Karma: 10  
Re:Problemas con un servicio de un láser - 2008/10/16 11:25 Hola, ¿por qué creas otro servicio para que simplemente haga un reenvío? Si es sólo para mostrar los datos en el dashboard no lo necesitas. De hecho el simple Dashboard que viene con MSRS ya muestra los datos del laser. Puedes fijarte del código del simple dashboard para ver cómo te puedes suscribir al servicio LRF y obtener su estado cada vez que cambia.

En definitiva, no necesitas otro servicio, sólo tienes que suscribirte al servicio LRF (que acepta suscripciones) desde el dashboard, y de esta forma recibiras las actualizaciones de estado.

Si miras el código del simple dashboard verás que se suscribe al Laser Range Finder (SickLRF) cuando de las a un botón, el código está en el método OnConnectSickLRFHandler.
Raúl Arrabales Moreno. conscious-robots.com/raul
  The administrator has disabled public write access. Please, register to participate in the forum.
sutaro
User

Gold Boarder
Posts: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/16 13:59 Pero el servicio sicklrf funciona directamente con un pc, mi láser está conectado a un microcontrolador y desde él me comunico. Lo hice casi totalmente compatible con sicklrf quitando la parte de la comunicación con el microcontrolador. Pero al iniciarlo como tú dices solo me muestra la primera medida del láser, y ya no se refresca más en el dashboard, este es mi gran problema. El servicio dashboard no lo modifiqué practicamente nada, salvo la sustitución de los nombres del servicio sicklrf por el mío.
  The administrator has disabled public write access. Please, register to participate in the forum.
Raúl
Moderator

Moderator
Posts: 591
graph
Karma: 10  
Re:Problemas con un servicio de un láser - 2008/10/16 16:10 Ah! Ya entiendo.. He echado un vistazo rápido al código y me parece que te falta mandar el estado actualizado a los servicios suscritos cada vez que haces una lectura del láser. Sería algo como esto:

Code:

 // Inform subscribed services that the state has changed. _subMgrPort.Post(       new submgr.Submit(_stateDsspActions.ReplaceRequest) );



Veo que lo haces una vez, cuando aceptas la suscripción, en el método SubscribeHandler, por eso te sale la medida inicial en el dashboard, pero luego deberías hacerlo otra vez después de cada medida. He visto que haces:

Code:

 base.SendNotification(_submgrportestado);



Pero las medidas las guardas en _state, no en la variable estado..
¿Puede ser que tu problema venga de alguna confusión entre estado y _state?
Raúl Arrabales Moreno. conscious-robots.com/raul
  The administrator has disabled public write access. Please, register to participate in the forum.
sutaro
User

Gold Boarder
Posts: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/16 20:00 Creo que tengo unas dudillas, ¿qué diferencia hay entre hacer ésto:
_subMgrPort.Post(

new submgr.Submit(_state, DsspActions.ReplaceRequest)

); y ésto otro:
base.SendNotification(_submgrport, estado);

¿Cuándo tengo qué usar cada uno de ellos?

Al final la operación:
base.SendNotification(_submgrport, _state);
me da un error de compilación, así que probe a rellenar el cuerpo de la variable estado y mandarla con base.sendNotification.
  The administrator has disabled public write access. Please, register to participate in the forum.
Raúl
Moderator

Moderator
Posts: 591
graph
Karma: 10  
Re:Problemas con un servicio de un láser - 2008/10/19 13:43 Hola, según tengo entendido los dos métodos hacen básicamente lo mismo (aunque tendría que mirarlo en detalle para asegurarme). Pero lo importante aquí es que tienes que mandar en la notificación tu estado actualizado, por lo tanto la variable que tienes que usar en la llamada de notificación es _state, puesto que es donde está realmente almacenada la información de estado actualizada. Cuando usas la variable estado no sé que estás mandando en realidad...

Lo otro no te debería dar ningún error de compilación.. ¿Qué error concreto te daba? A lo mejor ahí está la clave del problema...
Raúl Arrabales Moreno. conscious-robots.com/raul
  The administrator has disabled public write access. Please, register to participate in the forum.
sutaro
User

Gold Boarder
Posts: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/19 18:04 Al utilizar el método base.SendNotification(_submgrport, _state); me da el fallo:
El tipo 'Robotics.SenaLaser.SenaLaserState' se debe convertir en 'Microsoft.Dss.ServiceModel.Dssp.DsspOperation' para utilizarlo como parámetro 'T' en el tipo o método genéricos 'Microsoft.Dss.ServiceModel.DsspServiceBase.DsspServiceBase.SendNotification<T> (Microsoft.Dss.Service.SubscriptionManager.SubscriptionManagerPort,T)'
Para evitar ese error se me ocurrieron dos opciones que no me dan en principio errores pero no sé si erán correctas y son las siguientes en el manejador de Replace:
_submgrport.Post(new submgr.Submit(_state, DsspActions.ReplaceRequest));

o
estado.body=estado;
base.SendNotification(_submgrport, estado);

¿Cuál es incorrecta para utilizar de las dos?
  The administrator has disabled public write access. Please, register to participate in the forum.
Raúl
Moderator

Moderator
Posts: 591
graph
Karma: 10  
Re:Problemas con un servicio de un láser - 2008/10/22 16:41 Hola, el método SendNotification es simplemente una función auxiliar que lo que hace es mandar un Submit internamente al gestor de suscripciones (SubscriptionManager). Este submit contiene dos cosas:

- El cuerpo del mensaje que hay que mandar a los suscriptores.
- El verbo correspondiente a la acción que hay que realizar, por ejemplo, ReplaceRequest.

Creo que antes te expliqué mal lo del estado, por que lo que la función SendNotification tiene que recibir como parámetro no es el estado en si mismo (_state), por eso te da el error de compilación. Lo que tiene que recibir, en el caso de las lecturas del laser, es un mensaje replace (también podría ser por ejemplo un update), que a su vez, en el cuerpo del mensaje contendrá el estado actualizado del servicio.

En el tutorial 4 de servicios se ve bien:

Cuando hace esto:

Code:

 base.SendNotification(_submgrPortincrementTick);



Significa que hace un submit al gestor de suscripciones con el mensaje que hay que mandar a los suscriptores, que es incrementTick.

Ahora si ves la definición de incrementTick, verás que es en definitiva un mensaje de tipo Update:

Code:

 public class IncrementTick Update<IncrementTickRequest,                PortSet<DefaultUpdateResponseTypeFault>> {    public IncrementTick()        : base(new IncrementTickRequest())    {    } }



Y lo que lleva en el cuerpo del mensaje (body) es un objeto de la clase IncrementTickRequest.

Si te fijas en el caso de un Replace (en vez de un update), lo que va en el cuerpo del mensaje es el estado completo del servicio:

Code:

 public class Replace Replace<ServiceTutorial4State,               PortSet<DefaultReplaceResponseTypeFault>> { }



Resumiendo, necesitas definir un replace (análogamente a como aparece arriba) para poder hacer esta llamada y que se mande a los suscriptores el estado actual del laser:

Code:

 base.SendNotification(_submgrPortreplace);



Es un replace y no un update porque con cada lectura del laser se supone que cambia todo el estado.
Raúl Arrabales Moreno. conscious-robots.com/raul
  The administrator has disabled public write access. Please, register to participate in the forum.
Raúl
Moderator

Moderator
Posts: 591
graph
Karma: 10  
Re:Problemas con un servicio de un láser - 2008/10/22 16:50 Hola otra vez, he mirado tu código y he visto que en SenaLaserTypes.cs tienes el replace definido:

Code:

 public class Replace Replace<SenaLaserState,                DsspResponsePort<DefaultReplaceResponseType>> { }



Y en SenaLaser.cs haces:

Code:

 base.SendNotification(_submgrportestado);



Correctamente, así que debería funcionar.. ¿Has comprobado que cuando haces la medición el estado efectivamente cambia?
Raúl Arrabales Moreno. conscious-robots.com/raul
  The administrator has disabled public write access. Please, register to participate in the forum.
sutaro
User

Gold Boarder
Posts: 47
graphgraph
Karma: 3  
Re:Problemas con un servicio de un láser - 2008/10/23 19:07 Creo que ya lo solucioné, creo que era un fallo debido a una librería que usaba de mi microcontrolador. Para refrescar las medidas del láser, hice que cada 500 milisegundos se hiciese una lectura, y se envíase como me dijiste al manejador de subscripciones. ¿Hay una forma más efectiva que ésta de hacer la lectura que hacerlo desde el servicio SenaLaser cada 500 milisegundos?
Gracias
  The administrator has disabled public write access. Please, register to participate in the forum.
<< Start < Prev 1 2 Next > End >>





Lost Password?
No account yet? Register
 Conscious Robots RSS FeedConscious Robots RSS Feed

Find us on Facebook

Follow us on TwitterFollow us on twitter
Spotlight

Machine Consciousness Bibliography Database

 

ConsScale
The Cognitive Machine Consciousness Scale

 
Last Posts in Forum
 
CR
miel continental