eth-ait/dip18

Clarification on Sensor Calibration and Acceleration

Closed this issue · 2 comments

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:

  • Starting with the acceleration data in the inertial frame and removing the gravitational component (Z-axis in my setup).
  • Rotating the de-gravitized data by the inverse orientation of the head sensor.
  • Applying the per-bone offset.

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

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

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!

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