laso_d
User
 Expert Boarder
| Posts: 39 |   | Karma: 4
|
problemas actualización servicios - 2008/11/10 23:55
Buenas,
Siguo con problemas en mi aplicación. Para empezar diré que solo funciona el primer movimiento.
En cuanto se inicia la simulación la cámara a veces aparece y a veces no y el laser no se visualiza. Lo curioso es que cuando se elige la cámara en la simulación (eligiendola en el menú camera) se actualiza su estado en el dashboard y el botón de comienzo está activo y se puede clicar sobre el mismo. La simulación realiza el primer movimiento y el dashboard va acutalizando los angulos de los grados de libertad y el TCP y la cadena de caracteres de estado, pero sigue sin visualizarse el laser en el dashboard (en la simulación sí) y la cámara web deja de actualizarse en el momento que el dashboard no es la ventana activa.
A parte de todo esto me aparece el siguiente error:
| Code: | DsspForwarder:DsspReqRspForwarder.TryPostOperation. Queue limit exceeded, discarding inbound operation. Operation type: Microsoft.Robotics.Services.Sensors.SickLRF.Proxy.Replace. Service:dssp.tcp://david1:50001/aplicacion
|
Siento ser tan pesado pero no doy con ello. Gracias de antemano.
Saludos a todos.
|
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
Raúl
Moderator
 Moderator
| Posts: 592 |  | Karma: 10
|
Re:problemas actualización servicios - 2008/11/13 12:52
Hola, pues por el mensaje de error que te sale, que creo que está relacionado con el resto de problemas que cuentas, lo que puede pasar es lo siguiente:
Te has suscrito al láser, y estás recibiendo notificaciones de tipo replace, pero por algún motivo no las estás manejando. En otras palabras, se llena la cola de un puerto de notificación esperando que las notificaciones se atiendan y por algún motivo la cola se llena. Puedes mirar dos cosas para solucionarlo: una, que esté bien definido el manejador para ese mensaje, de forma que la cola no se llene y las notificaciones se manejen y se haga con los datos recibidos lo que haya que hacer. Otra opción es descartar mensajes cuando la cola supere un determinado tamaño, pero eso es sólo aconsejable cuando tienes una frecuencia muy alta de notificaciones y quieres descartar las que no te da tiempo a procesar. Para esto último puedes usar el parámetro DsspOperatingQueuingPolicy del atributo ServicePort, por ejemplo:
| Code: | [ServicePort("/infratest",
AllowMultipleInstances = true,
QueuingPolicy=DsspOperationQueuingPolicy.ConstrainDepth,
QueueDepthLimit=50)]
TestOperationsPort _main = new TestOperationsPort();
|
Esto hace que el tamaño de la cola de mensajes nunca pase de 50, descartándose los demás... En cualquier caso, creo que la solución a tu problema pasa por la primera alternativa, ya que supongo que lo que pasa es que no está bien definido un manejador para todos los mensaje a los que te suscribes, y por eso no se refrescan algunos datos.
Raúl Arrabales Moreno. conscious-robots.com/raul |
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
laso_d
User
 Expert Boarder
| Posts: 39 |   | Karma: 4
|
Re:problemas actualización servicios - 2008/11/20 00:40
Buenas,
Lo que tengo relacionado con replace es en mi servicio aplicación:
| Code: | void LaserBrazoHandler(lrf.Replace replace)
{
_laserDataBrazo.Post(replace.Body.DistanceMeasurements);
}
/// <summary>
///
/// </summary>
private void RegistroManipuladorSensor()
{
eliminarViejasNotificaciones();
Activate(Arbiter.Receive<lrf.Replace>(false, _laserNotBrazo, LaserBrazoHandler));
Activate(Arbiter.Receive<int[]>(false, _laserDataBrazo, hacerTransiciones));
}
| donde el método hacerTransiciones es el que contiene los movimientos del brazo y eliminarViejasNotificaciones se define:
| Code: | private void eliminarViejasNotificaciones()
{
int itemsBrazo = _laserNotBrazo.P3.ItemCount;
for (int i = 0; i < itemsBrazo - 1; i++)
_laserNotBrazo.Test<lrf.Replace>();
}
|
y en mi servicio dashboard:
| Code: | void ReemplazaDatosLaserManipulador(lrf.Replace reemplaza)
{
if (_gui != null)
{
WinFormsServicePort.FormInvoke(
delegate()
{
_gui.ReemplazarDatosBrazo(reemplaza.Body);
}
);
}
}
|
Solo tengo dudas en el Receive que maneja los datos del laser y que atiende hacerTransiciones¿es así como debo de hacerlo, con Receive?
Muchas gracias de antemano.
|
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
Raúl
Moderator
 Moderator
| Posts: 592 |  | Karma: 10
|
Re:problemas actualización servicios - 2008/11/20 13:57
Hola, sí veo un problema con el Arbiter.Receive y es que has puesto el primer parámetro (persist) a false. Eso quiere decir que el manejador que contesta a los mensajes de ese puerto sólo se va a ejecutar una vez. Si no he entendido mal la lógica de tu aplicación deberías poner true en vez de false, para que el manejador asociado a los mensajes que quieres controlar persista y siga atendiendo mensajes.
Se suele poner false cuando en tu código controlas cuando quieres volver a hacer el siguiente Arbiter.Receive(false, ...). Pero por lo general, si lo que quieres definir es una rutina que se quede indefinidamente atendiendo a los mensajes tienes que poner Arbiter.Receive(true, ...).
Espero que esto te solucione el problema.. Ya me contarás..
Saludos, Raúl.
Raúl Arrabales Moreno. conscious-robots.com/raul |
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
laso_d
User
 Expert Boarder
| Posts: 39 |   | Karma: 4
|
Re:problemas actualización servicios - 2008/11/20 17:30
Buenas Raul,
Siento decir que he probado a cambiar a true y sigue dando exactamente el mismo error . Algo sigue estando mal porque solo comienza a ejecutarse el programa cuando la cámara web está seleccionada en la simulación sino, por mucho que uno pinche en el boton de On, aquello no va.
Y si ya has pinchado en On, comienza a ejecutarse en cuanto la cambias la cámara en la simulación.
Gracias de todas maneras.
|
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
Raúl
Moderator
 Moderator
| Posts: 592 |  | Karma: 10
|
Re:problemas actualización servicios - 2008/11/21 13:07
Vaya.. Es raro.. Puede ser cualquier historia de interacción entre las suscripciones de la cámara, etc. Habría que mirar el código en detalle.
Puedes mirar si te sirve el modo de depuración de DSS para encontrar el problema. Echa un vistazo a esto:
Debugging DSS using Visual Studio
De todas formas, a ver si le echamos un vistazo al código...
Raúl Arrabales Moreno. conscious-robots.com/raul |
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
laso_d
User
 Expert Boarder
| Posts: 39 |   | Karma: 4
|
Re:problemas actualización servicios - 2008/11/26 22:46
Buenas Raul,
Pequeños descubrimientos. Me he dado cuenta que hay una diferencia temporal entre el "Subscrito a SickLRF" y "Manipulador de comienzo" esa diferencia es la que existe entre el momento en que se ha ejecutado la simulación y el momento en que yo hago el cambio de cámara y se pone en funcionamiento el brazo. Más concretamente en el momento en que se pulsa el boton de comienzo.

Ese LogInfo "Manipulador de comienzo" se encuentra en el manipulador que ves en el código, y tengo constancia de que el otro manipulador OnLoadHandler se ejecuta bien puesto que el LogInfo que hay dentro es el anterior (el que muestra "Subscrito a SickLRF" . Pero claro se encuentra dentro del Interleave ExclusiveReceiverGroup con lo cual, entiendo, se ejecutan de manera no concurrente y que acabado uno se ejecuta el siguiente. Te mando el código para que veas como estan las cosas.
| Code: | new ExclusiveReceiverGroup(
Arbiter.ReceiveWithIterator<DateTime>(true, _camaraRefrescoPuerto, GetFrame),
Arbiter.Receive<pgm.NotificacionFinalMovimiento>(true, _movimientoNot, NotificacionFinMovimientoManipulador),
Arbiter.Receive<apl.NotificacionEstado>(true, _aplNot, NotificacionEstadoManipulador),
Arbiter.ReceiveWithIterator<EnCargar>(true, _puertoEventos, OnLoadHandler),
Arbiter.ReceiveWithIterator<EnComienzoAplicacion>(true, _puertoEventos, EnComienzoAplicacionManipulador),
Arbiter.ReceiveWithIterator<EnResetSimulacion>(true, _puertoEventos, EnResetSimulationManipulador)
|
Saludos y gracias.
Post edited by: Raúl, at: 2008/11/28 13:51
|
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
Raúl
Moderator
 Moderator
| Posts: 592 |  | Karma: 10
|
Re:problemas actualización servicios - 2008/11/28 13:57
Ya veo, el tema es que no te llega el mensaje EnComienzoAplicacion al Arbiter.Interleave hasta que no cambias la vista de la cámara, lo cual sigue siendo un verdadero misterio. No se me ocurre por qué puede pasar eso..
¿Has repasado el código de tu dashboard? A ver si va a haber algo raro en la gestión de los eventos de los botones o algo así...
Por lo que me parece entender, el interleave está funcionando como se esperaba, el problema es que no le llega el mensaje EnComienzoAplicacion hasta que haces lo del cambio de cámara en el simulador. ¿Dónde está el código que lanza ese mensaje? ¿Se susvribe bien el dashboard a tu servicio aplicación? Puede que los tiros vayan por ahí... (vamos que no se me ocurre otra cosa que pueda ser! )
Raúl Arrabales Moreno. conscious-robots.com/raul |
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
laso_d
User
 Expert Boarder
| Posts: 39 |   | Karma: 4
|
Re:problemas actualización servicios - 2008/12/03 19:35
Buenas Raul,
Dos cosas.
La primera, ¿cual puede ser la principal causa por la que un activate.arbiter no funcione correctamente?, porque uno de los fallos que tengo en mi programa es que no ejecuta la parte del delegate. Esta es la parte que cierra el bucle, llamando de nuevo al método RegistroManipuladorSensor, pero como no se ejecuta, el brazo solo ejecuta el primer movimiento. En principio solventé el problema, sacando fuera la llamada al método, pero no es lo correcto. ¿Es posible que se deba a que se llene antes el puerto con los datos no manipulados del laser? Porque sigo con el problema del desbordamiento, (probé el método que me posteaste para ponerle límite de cola al puerto y también otro método que hay posteado en el foro de Microsoft, y los dos juntos y nada). He intentado llamar más a menudo al método que va borrando los ultimos, pero lo único que hago es retrasar el momento en el cual se llena.
| Code: | private void MovimientoBrazoPTP(Punto puntoDestino, States siguienteEstado)
{
LogInfo("antes de hacer el movimiento");
MovimientoPTPSinNotificacion(TipoDeMovimiento.SincronoTotal, puntoDestino);
LogInfo("Antes de activate");
Activate(Arbiter.Receive<pgm.NotificacionFinalMovimiento>(false, _movimientoNot,
delegate(pgm.NotificacionFinalMovimiento not)
{
LogInfo("dentro del activate");
if (siguienteEstado != States.EstadoDesconocido)
_state.ProgramState = siguienteEstado;
_state.BrazoEnMovimiento = false;
_state.UltimosAngulos = not.Body.AngulosDestino.Angulos;
LogInfo("Vamos a llamar a la rutina RegistroManipulador Sensor");
RegistroManipuladorSensor();
}
));
|
Por otro lado tengo un error en un Itask del tipo
| Code: | 'Robotics.Tarea.TareaService.ComienzoProgramaHandler(Robotics.Tarea.ComienzoPrograma)': no todas las rutas de código devuelven un valor C:Microsoft Robotics Studio (1.5)samplesabbproyectoparte2tareaTarea.cs
|
que no sé muy bien qué hacer con él. En principio no he tocado nada de esa parte del código y no sé porqué me empieza a salir ahora.
Muchas gracias de antemano.
|
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
Raúl
Moderator
 Moderator
| Posts: 592 |  | Karma: 10
|
Re:problemas actualización servicios - 2008/12/03 21:30
Hola, en principio la primitiva Arbiter.Activate del CCR se supone que funciona bien siempre. Otra cosa es que al final el flujo de ejecución no sea el esperado bien porque no el manejador que se activa no llega a recibir nunca el mensaje esperado o bien porque el manejador no está bien definido. También podría ser que el propio activate no llega a llamarse cuando es necesario.
Con las trazas que veo que has puesto en el código, entiendo que lo que dices es que nunca llegas a ver el mensaje de "dentro del activate"? Si es así, yo diría que la causa es que no se recive el mensaje pgm.NotificacionFinalMovimiento. No creo que sea nada del propio arbiter.
El error que te da en ComienzoProgramaHandler es raro que te salga ahora sin más... No sé como es el código, pero supongo que hay un posible flujo de código que no tiene return y por eso se queja el compilador.. ¿Es un error de compilación, no? Por lo menos, yo nunca he visto algo así en tiempo de ejecución...
Raúl Arrabales Moreno. conscious-robots.com/raul |
|
|
The administrator has disabled public write access. Please, register to participate in the
forum. |
|