Estoy trabajando en un servicio similar al tutorial 3 de robótica, cambiando las partes de traslación y rotación para utilizar DriveDistance y RotateDegrees desarrollados por Trevor Taylor en SimulatedDifferentialDriveTT. Y no se si estoy incluyendo bien el servicio, si es un problema a la hora de haberlo instalado o qué es lo que está pasando, porque cuando pongo en funcionamiento el servicio me aparece el siguiente error en pantalla:
En el archivo SimulatedDifferentialDrive.cs aparece marcada la línea "_entity=(simengine.TTDifferentialDriveEntity)ins.Body;" que se encuentra dentro de "void InsertNotificationHandler(simengine.InsertSimulationEntity ins)" junto a la misma se despliega una ventana de diálogo con el mensaje "InvalidCastException was unhandled by user code No se puede convertir un objeto de tipo 'Microsoft.Robotics.Simulation.Engine.Pioneer3DX' al tipo 'Microsoft.Robotics.Simulation.Engine.TTDifferentialDriveEntity'
Cuáles serían los pasos correctos para que el servicio trabaje sobre el SimulatedDifferentialDrive de Trevor en vez del que viene por defecto en MSRS?
Muchas gracias y enhorabuena por el foro
Post edited by: Raúl, at: 2008/06/04 15:38
The administrator has disabled public write access. Please, register to participate in the
forum.
Supongo que estás usando la versión 1.5 de Robotics Studio, ¿verdad?
He estado mirando el tutorial 3 de robótica, que si no me equivoco es simplemente un comportamiento de navegación aleatorio que puede usar cualquier hardware.
Según lo que dices, entiendo que lo que quieres es modificar el servicio para usar las operaciones DriveDistance y RotateDegrees en el simulador. Para ello tienes que usar el servicio SimulatedDifferentialDriveTT (que escribió Trevor Taylor). Lo que no entiendo es que hagas referencia a un error que te da en el archivo SimulatedDifferentialDrive.cs. En principio no tienes por qué cambiar nada de código de ese servicio. ¿Has cambiado algo de código del servicio de Trevor??
Te explico cómo hago yo para usar el SimulatedDifferentialDrive de Trevor:
- Primero tienes que compilar el servicio SimulatedDifferentialDriveTT (de esta forma se crean los ensamblados, dlls, necesarios en el directorio bin de Robotics Studio).
- En tu proyecto de Visual Studio (supongo que tu versión modificada del tutorial 3 de robótica) tienes que añadir una referencia al servicio genérico de drive:
Code:
using pxdrive = Microsoft.Robotics.Services.Drive.Proxy;
De esta forma, tu servicio de control será independiente del drive concreto que uses en tiempo de ejecución.
- Sin embargo, en el servicio que uses para lanzar la simulación, debes incluir la referencia al servicio SimulatedDiferentialDriveTT (esto se hace en Solution Explorer -> Refenrences -> Add Reference). Y crearás la instancia de este servicio usando algo así:
Code:
using drive = Microsoft.Robotics.Services.Simulation.Drive.Proxy;
// Este ya es el servicio de tracción diferencial simulada de Trevor
// Crear el servicio asociado a la entidad del robot simulado:
drive.Contract.CreateService(ConstructorPort, Microsoft.Robotics.Simulation.Partners.CreateEntityPartner(
"http://localhost/" + robotBaseEntity.State.Name)
);
No entiendo cómo lo estás haciendo tú realmente porque el tutorial 3 de robótica está pensado para hardware real y no para simulado (como es el caso del SimulatedDifferentialDriveTT).
Puedes fijarte en mi servicio de laberinto para ver cómo uso el Drifferential Drive simulado de Trevor:
Vaya, muchas gracias por contestar tan rápido. Creo que en mi anterior mensaje no me explique muy bien y voy a intentar que se me entienda un poco mejor. El archivo donde me aparece el fallo es en el "SimulatedDifferentialDrive.cs" del servicio de Trevor (es que resulta que se llaman igual los .cs tanto del servicio de Trevor como el que viene por defecto, y lo mismo sucede con los types.cs). He seguido al pie de la letra los pasos que me has indicado pero sigue apareciendo el error que te comenté en el anterior mensaje... así que me he puesto a revisar la programación otra vez comparando con tu servicio Maze Simulator y he descubierto un fallo: estaba utilizando el tipo "Pioneer3DX" en vez de "TTPioneer3DX"!! Cambiando esto por fin dejó de aparecer el error. Lo que me pasa ahora, es que cuando lo pongo a trabajar con el servicio que le marca el movimiento ni gira ni se desplaza una cierta distancia. Te dejo las parte del programa involucradas a ver si tu localizas el fallo:
Lo que quiero conseguir con todo esto es aprender a trabajar con el SimulatedDifferentialDriveTT antes de empezar con algo más complicado. Respecto al servicio sobre el que estoy trabajando no es directamente el del tutorial 3 de robótica, sino uno creado por mi a partir del mismo.
Un saludo,
Gracias.
The administrator has disabled public write access. Please, register to participate in the
forum.
Sobre el problema que cuentas ahora, ¿de las llamadas que haces a _drivePort, el choice te devuelve fallo? ¿O Simplemente parece ir todo bien, no te dan errores, pero el robot no se mueve?
Ahora que ya usas la entidad correspondiente a TTPioneer3DX, deberías ver el robot (el P3DX) en el simulador y ser capaz de controlarlo con el Dashboard. ¿Has probado eso?
Echa un vistazo al console/output, por si estuviera fallando la inicialización del algún servicio (http://localhost:50000/console/output).
Por lo que me dices, puede que te falte activar el motor:
The administrator has disabled public write access. Please, register to participate in the
forum.
alberrrto
User Fresh Boarder
Posts: 3
Karma: 1
Re:Consulta sobre Simulated Differential Drive TT - 2008/06/09 23:49Buenas! He estado intentando averiguar que es lo que esta pasando y quería comentarte lo siguiente respondiendo a tu mensaje: -Desde que corregí lo de Pioneer3DX por TTPioneer3DX el robot aparece en la simulación y lo puedo manejar utilizando el SimpleDashboard. -Los Choice's no devuelven ningún error. En "http://localhost:50000/console/output" los mensajes que aparecen son todos correctos. Por estas razones he comenzado a pensar que igual tengo mal indicadas las unidades y me he puesto a probar valores. Sólo para asegurarme, las distancias se indican en mm y los ángulos en grados, no? Es que sólo con valores grandes en el desplazamiento consigo que se perciban en la simulación, además con los ángulos me pasa algo curioso. Mi simulación consiste en un robot que se encuentra en un pasillo, lo giro con el dashboard y lo muevo para que se choque con una de las paredes. El robot retrocede gira el ángulo que le he indicado y avanza hacia el lado contrario. Como es un pasillo encuentra rápidamente la otra pared, cuando se choca con ésta retrocede pero no gira, avanza en sentido contrario con la misma orientación de tal forma que vuelve a chocar en el punto del principio y así se lleva durante toda la simulación. No se si lo he explicado muy bien, una vez que se produce el primer giro el robot se mueve de un lado a otro del pasillo chocando con una y otra pared siempre sobre una misma trayectoria. Podrías explicarme cómo se produce exactamente el giro, es de suponer que el robot tendrá unos ejes de coordenadas asociados de forma que siempre se produzca el giro sobre el mismo origen, no? Es que por los resultados de mi simulación parece que el fallo podría estar ahí, porque otra opción sería que la siguiente orden de moverse tras el giro se pusiese en funcionamiento antes de que el giro se completase pero entonces estaría dando errores el "yield return"... No lo tengo muy claro...
Espero no causarte muchos problemas con mis dudas. Muchas gracias y un saludo
The administrator has disabled public write access. Please, register to participate in the
forum.
Raúl
Moderator Moderator
Posts: 444
Karma: 6
Re:Consulta sobre Simulated Differential Drive TT - 2008/06/18 22:53Hola, por desgracia los servicios que vienen con Robotics Studio (o Microsoft Developer Studio 2008, como se llama ahora) no están muy bien documentados. Por ejemplo, lo que comentas de la operación DriveDistance (la llamada con DriveDistanceRequest) toma como valor de entrada una distancia en metros. MRDS usa en general el sistema métrico internacional. Así que si quieres mover el robot medio metro tienes que pasarle como parámetro 0.5f. Para los giros, efectivamente, la operación RotateDegrees espera grados, así para girar el robot completamente de norte a sur tienes que pasarle 180 grados para la rotación.
Lo que comentas sobre que después de un giro se mueve hacia atrás, suena a que termina el giro y luego ejecuta un operación DriveDistance.. Para moverse hacia atrás hay que pasarle un valor negativo de distancia (en metros). ¿Tienes algo de esto en tu código). En general, las llamadas a DriveDistance y RotateDegrees no deberían devolver el control al yield return hasta que no han terminado.. Pero creo que hay algún bug en implementaciones del DifferentialDrive que hacen que se devuelva el control antes de tiempo.. Para evitar eso, podrías usar una función que se llama Arbiter.ExecuteToCompletion().
¿Cómo haces la secuencia de llamadas a las operaciones de movimiento? Parece que el problema podría venir de ahí...Raúl Arrabales Moreno. conscious-robots.com/raul
The administrator has disabled public write access. Please, register to participate in the
forum.