Closed rsantos88 closed 7 years ago
Pese a ser más complicado, sería más conceptualmente correcto tenerlo dentro de la máquina de estados, y mejor de cara a un futuro con una máquina de estados más sofisticado.
En ese caso, se llamaría a ttSay desde una hipotética función llamada saySites en la máquina de estados. Para ello, tendríamos que recibir la información de haarDetection a través de un puerto que conectaríamos con followMeDialogManager. ¿ Cómo lo ves @jgvictores ?
Una conexión así tendría sentido (sin nombre)!
Estuve pensando esto... ¿No sería más bien una conexión con launchManipulation la necesaria? Para saber hacia dónde está apuntando el pan del cuello.
Esto es, dialogue manager envia comando peroodicamente (si el estado lo permite), y execution core comanda el movimiento en función del encoder de la cabeza.
Entiendo que dialogue manager enviará un comando a través del puerto "outCmdPort" de la siguiente forma:
yarp::os::Bottle cmd;
cmd.addVocab(VOCAB_GET_POSITION);
outCmdPort->write(cmd);
Posteriormente, followMeExecutionCore deberá tener un OutGpPort.cpp y un OutGpPort.hpp (output get position port) el cual enviará por un puerto yarp el valor del encoder del cuello.
Conformame @jgvictores si esto sería correcto.
No, dialogue manager podría enviar un:
yarp::os::Bottle cmd;
cmd.addVocab(VOCAB_WAVE_APPROPRIATE_HAND);
outCmdPort->write(cmd);
Y en realidad la clase FollowMeExecutionCore hay que ampliarla para que además de yarp::dev::IPositionControl *iPositionControl;
un yarp::dev::IEncoders *iEncoders;
Ok, el código resultante quedaría de esta forma. Faltaría programar la parte que permita el movimiento de cada brazo. Me gustaría saber como podría continuar con la parte del habla y cómo obtener los valores de los encoders de la cabeza desde el state machine para llamar a la función ttSay.
Un saludo y gracias @jgvictores
Ok, hice fork de tu fork. Aquí corregí algo que me parecía peligroso en cuanto al uso de punteros sin inicializar, y aquí implementé asrListenWithPeriodicWave()
. Si puedes probar el branch non-blocking-read
de mi fork te lo agradezco. Si funciona, de ahí hago PR a tu fork, y de ahí hacemos PR de tu fork a la original (roboticslab-uc3m).
Funciona todo correctamente :thumbsup:
Realizados los respectivos pull request (#23) Acepta si lo ves correcto @jgvictores
PR #23 aceptado.
Ok, so, in sight of the latest follow-me-app.png... there's some work to do on the execution side. We must choose between:
I'd go for (2) -> less elegant, more ports, but probably easier and more maintainable.
Ok. Then, we'll go for (2) method. It would be like this: I think, we've to extend followMeArmExecution to include new movements with two arms.
Ok, seems good enough. I'd recommend:
Ok, I renamed followMeArmSwing->followMeArmExecution and followMeExecutionCore->followMeHeadExecution in the code ( #24) and I updated the image. Do you see it right @jgvictores ?
Looking very very good. Thanks a lot for all this work.
I've updated my comment above regarding moving from yarp::os::Port to yarp::os::RpcClient.
Second point done! Please @jgvictores , make sure that all looks good (#25) :smile:
In point (3), I've changed command port to RpcServer port (826ae571d03187f16a8141e7a71adc69eff77a54) & (1d38ce6f175d564b05dac8da144c159a408e49c4) in followMeArmExecution, but in followMeHeadExecution, I don't know what ports do you want to change @jgvictores
I'm guessing you mean the arm execution, where we set up callbacks. So the code of "getting a callback" from: http://www.yarp.it/port_expert.html Has to start looking more like "getting replies" section of the same tutorial (when it starts speaking about callbacks).
Those are just some pointers; check out the tutorial, try to see how it corresponds to the code, and I'll get back to you.
Vale, si no me equivoco lo que pretendes sería comunicar por un puerto RPC followMeDialogueManager con followMeHeadExecution de forma bidireccional. Esta comunicación se podría emplear para que followMeDialogueManager haga una petición para conocer la posición del encoder de la cabeza y followMeHeadExecution responda de forma instantánea utilizando el método descrito en "Getting replies". ¿Es correcto?
Correcto!
Se ha añadido un nuevo VOCAB, implementando el código de la siguiente forma ¿Estaría correcto así @jgvictores ?
Bien, creo que de momento vale!
Oh, I just remembered. I think it's best not to return false
on the InDialoguePortProcessor::read(ConnectionReader& connection) method.
Best is to add a VOCAB_FAILED, send it, and return true
.
Update the port names and app xml connections.(93ec46456184381c99572c8dac718f8d1350ddad) Something wrong @jgvictores ??
Everything looks very good. To strictly follow the current connection diagram, this and this would have to run on /manipulation
, but this is actually a more practical setup, so it's good enough for me!
Por el momento ya está implementado y funcionando. Cada 10 segundos, indica a través de una frase si estás a la derecha, a la izquierda o en el centro según si el encoder se posiciona en enc>10, enc<-10 o -10<enc<10 respectivamente (link) El siguiente paso sería implementar los movimientos en los brazos y ampliar más el dialogo si se quisiera con frases alternativas.
Tal y como se encuentra programado ahora mismo, el robot indicaría si te encuentras a la derecha, a la izquierda o en el centro, dependiendo de la posición del encoder del cuello. Cada 10 segundos estaría repitiendo tu posición, desde el momento en que le ordenes que te siga y le digas tu nombre. El problema es que si el robot deja de detectar una cara, seguiría repitiendo "ahora estas a la derecha"... a la izquierda... etc cada 10 segundos, dependiendo de la última posición en la que haya quedado su cuello. Sería ideal que robot pudiera dejar de pronunciar estas frases en el momento en que haarDetection dejase de detectar una cara o volver a pronunciarlas en caso de que vuelva a detectar una cara. Lo dejo como sugerencia para una posible mejora futura ;)
Añadido pull request #26
Actualizado el gráfico a los nuevos cambios: commit (40dba08d752720700104c443b2e2a6e90c4559ff) Con todo esto, se pueden dar por concluidas las mejoras del follow-me propuestas. Cierro issue :)
@rsantos88 Thank you so much!! Muchas gracias por todo el curro y esfuerzo. 🥇 😄 🥇
:blush:
Adjunto el fichero con el diálogo que propuso Carlos en la reunión para las Demos. La demo de follow-me actualmente se encuentra adaptada en inglés, con algunas diferencias (00cdb30ce2865b88e7f07b0a012564a043884cca) Falta incluir la parte en la cual TEO indica "estás a la derecha", estás a la izquierda", "estás en el centro". ¿Sería correcto llamar a la función ttsSay desde InCvPort::onRead(Bottle& b)?