silvereye icon indicating copy to clipboard operation
silvereye copied to clipboard

Versión para 4 IMUs

Open ivanjimenez opened this issue 2 years ago • 2 comments

Hola, Juan Manuel.

Me parece un proyecto muy interesante. Yo estaba haciendo algo parecido pero con Python for QT y quería hacer el modelo en 3d con Quick3d. No obstante, aún estoy en desarrollo con eso.

Mi problema es que me gustaría probar tu código para una aplicación pero sólo tengo 4 IMUs. Con lo que podría realizar los ángulos para la pierna izquierda o derecha. Con lo que si no está mal la traducción a 4 sensores sería:

TOTAL_SENSORS = 4; TOTAL_JOINTS = 3;

Pero claro, el código de almacenamiento de las articulaciones hay una condición en la que si la articulación es la 3, (left hip) , entonces: Q_proximal = mQ_segments[0]; Estimo que esto para asegurar que el proximal sea la espalda baja para la cadera izquierda.

Pero si tengo 4 imus, realmente esto no sería necesario.

Con lo que el código se quedaría en:

// mainWindow.cpp

// Store joints (ISB)

	Eigen::Quaterniond Q_proximal, Q_distal;

	for(int iJoint = 0 ; iJoint <= (MainWindow::TOTAL_JOINTS-1) ; ++iJoint )
	{

		Q_proximal = mQ_segments[iJoint  ];
		Q_distal   = mQ_segments[iJoint+1];

		// 0 and 1 : right hip   [0]
		// 1 and 2 : right knee  [1]
		// 2 and 3 : right ankle [2]



		mQ_joints[iJoint] = Q_proximal.conjugate() * Q_distal;
		mQ_joints.at(iJoint).normalize();

	}

No sé si has trabajado en el sector de la biomecánica. Pero considero que es un gran trabajo. Felicidades.

ivanjimenez avatar Jan 16 '23 17:01 ivanjimenez

Hola Iván, muchas gracias por tus amables comentarios.

Efectivamente, la condición está ahí para que se seleccione de nuevo el sensor de la espalda al llegar a la iteración de la pierna izquierda.

Estoy de acuerdo en que la cadena cinemática que propones (4 sensores, 3 articulaciones) tiene sentido :) Ten en cuenta que en el planteamiento original cada sensor tiene un ID fijo. Asegurate de que hacer el montaje como has propuesto acá: el de ID 0 en la espalda, el de ID 1 en la pierna, y así sucesivamente.

¡Me cuentas si todo sale bien!

juanmalunatic avatar Jan 16 '23 17:01 juanmalunatic

Hola, Juan Manuel:

Gracias por tu pronta contestación.

Si me permites, ¿Puede hacerte algunas preguntas más en esta misma issue para no agregar más issues y así no dejarte la bandeja de entrada con mensajes de github? :-)

  • [ ] Entonces, sólo por saber si lo he entendido bien. De manera esquemática sin tener en cuenta inicializaciones ni grabaciones en fichero o animación en 3d, estos serían los pasos. (pongo también el nombre de los métodos más importantes para cada paso).
    • Colocar en el sujeto los imus de 0 a n, según los utilizados.
    • Calcular mQ_Sensors_ref, lo que sería calcular el montaje de los sensores (calculateMounting()) --> posición 0 (sin moverse)
    • Calcular mQ_Virtual (calculateVirtualOrientation()) -> esto no sé si debería estar en la posición 0 o podría estar en movimiento el sujeto.
    • Actualizar los datos de las articulaciones y calcular los ángulos (updateSegmentsAndJoints()) -> esto ya es en movimiento.
  • [ ] Si quiero cambiar la posición del imu que está en la espalda, ya que, el imu que tengo tiene una forma que si lo pongo tal y como están las x,y,z no se ajustaría bien al cuerpo? Yo tengo un imu que digamos es plano cuando x+ va hacia el este e y+ al norte. Tal y como esta imagen:

image

En el muslo y en la pierna estaría bien. Pero en el pie y espalda sería incómodo. ¿Debería ejecutar rotaciones para realizar los cálculos para dejar los ejes tal y como los tienes? Sería una rotación en el eje Z de 90 grados, estos sería correcto?

Gracias otra vez por tu ayuda.

En serio, es el proyecto de biomecánica más ejemplificador que he visto. La traducción a código de la tesis es fantástica!!

ivanjimenez avatar Jan 16 '23 20:01 ivanjimenez