eth-ait / dip18

Deep Inertial Poser: Learning to Reconstruct Human Pose from Sparse Inertial Measurements in Real Time
GNU General Public License v3.0
141 stars 47 forks source link

Clarification on Sensor Calibration and Acceleration #39

Closed XnetLoL closed 4 months ago

XnetLoL commented 5 months ago

Hello,

I am currently working on replicating the sensor calibration procedure described in your paper, but I had no luck so far applying the methods to my own sensors. I have two main points I would like clarification on:

  1. Sensor Alignment with SMPL Body Frame:

The paper mentions placing the head sensor onto the head such that the sensor axes align with the SMPL body frame. However, from the images provided, it appears that the head sensor is oriented with the Z-axis pointing up or down, whereas the SMPL body frame uses Y-up. Here is the image from the repository showing sensor placement and pose: Sensor Placement Image And the image I found depicting the Xsens axes: xsens. My guess is that the image might be a generic visual aid or possibly there's a difference in sensor models.

  1. Acceleration Calibration Procedure:

While not explicitly detailed in the paper, I assume that the steps used for orientation calibration might be applicable to acceleration data as well. My approach involves:

Could you confirm if this approach is valid for calibrating accelerations?

Thank you for your assistance and for the insights provided in your paper.

kaufManu commented 4 months ago

Hi @XnetLoL and apologies for the late reply.

  1. Your observation is correct. Without any adjustment, the head sensor's orientation will not align with the SMPL body frame, even if placed like shown in the image. You have to adjust the sensor orientation manually. I think Xsens allows you to set a custom offset on-board, but we did this in the code, which you can find here, excerpt:
// quaternion that rotates the sensor axes so that they align with the SMPL frame
// this assumes that the sensor is placed correctly on the head
Quaternion R = new Quaternion(0.5f, 0.5f, 0.5f, 0.5f);

// the quaternion that maps from inertial to SMPL frame
Quaternion calib = Quaternion.Inverse(_connectedMtwData[_headId].quat * R);
  1. Also this is correct. We do exactly what you describe in the code here, excerpt:
/// <summary>
/// The calibrated orientation.
/// </summary>
public Quaternion quat {
    get { return calibrationQuat * _quat * boneQuat; }
}

/// <summary>
/// The acceleration without any gravity.
/// </summary>
public Vector3 freeAcc {
    get {
        Vector3 noG = _quat * _acc - _gravityZ;
        return calibrationQuat * noG;
    }
}

Hope this helps!

XnetLoL commented 4 months ago

Hi @kaufManu, thanks for your response! You have clarified a few points. The code will be handy too as a reference.