How to Recalibrate Structure Core Depth with CorePlayground

Though all sensors leave our manufacturing facility properly calibrated, sometimes a rough delivery, a drop or wear & tear can cause Structure Core to become "uncalibrated", depth-wise. Fortunately, this is something that can be fixed through software. 

First of all, make sure that the sensor glass surface is completely clean. This can be done by wiping it with a clean, humid cloth. 

Next, if the problem persists, please proceed with the following:

  1. Download CorePlayground from the link below, or download the entire Structure SDK (Cross-Platform) from our Developer's Portal.
  2. Please note: the above CorePlayground sample will only work with sensors running firmware 1.2.0. To upgrade your firmware, please use the updater included in the Cross-Platform SDK or follow the instructions here.
  3. Place the Structure Core on a table (or similar stable surface) facing perpendicular towards a relatively featureless planar surface, like a ceiling. 

    Structure Core on a desk

  4. Connect Structure Core to your fastest USB port and launch CorePlayground. 
  5. Make sure the "Stream Depth" box is checked. Select the "One-shot" option under "Dynamic calibration mode", then press the green triangle to start streaming.

    5. Allow CorePlayground to calibrate for three to four minutes. Make sure not to touch or move the sensor during calibration.

  6. Press the red square to stop the process. The updated calibration will be automatically saved to the Structure Core's memory, so you can exit the CorePlayground app normally and leave the Structure Core connected.

Once done, the depth map of the sensor after calibration should be uniform relatively free of holes (technically, >90% coverage within the inner 70% of the depth map). See the example below.

Screenshot of CorePlayground


From the manufacturing perspective, CorePlayground might be too heavy to use since it’s a GUI-based application. In that case, the depth calibration feature can be independently added into your application. 

1. Access Structure SDK Cross platform. Within CaptureSessionSettings.h, search for StructureCoreDynamicCalibrationMode dynamicCalibrationMode.

The user will see the following code:

struct ST_API StructureCoreSettings
{
....
/** @brief The dynamic calibration mode to use during depth streaming. */
StructureCoreDynamicCalibrationMode dynamicCalibrationMode =
StructureCoreDynamicCalibrationMode::Default;
...
}structureCore;

There are three modes: Off, OneShotPersistent, and ContinuousNonPersistent, which can be implied by their comments.

enum class  StructureCoreDynamicCalibrationMode

{ /** No dynamic calibration is performed. If misalignment of the stereo infrared cameras exceeds 0.1 mm, the quality of depth data may be reduced. */
Off,

/** A single dynamic calibration cycle is performed when depth streaming starts. This mode is sufficient to correct for misalignment caused by static mechanical stress, such as that caused by attaching the sensor to a fixture which is not perfectly aligned to the body of the sensor. Once a suitable calibration is determined, it is stored persistently on the sensor. If the dynamic calibration matches the existing calibration stored on the sensor (if any), no update is performed. */
OneShotPersistent,

/** Dynamic calibration is performed continuously as the sensor streams depth data. This mode should be employed in cases where the sensor is subject to continuously varying mechanical stresses such as vibration, thermal expansion/contraction, etc. The calibration is not stored on the sensor in this mode. */
ContinuousNonPersistent,

/** Dynamic calibration is disabled by default. */ Default = Off, };

2. Instanize a ST::CaptureSessionSettings object and assign one of them to dynamicCalibrationMode. 

ST::CaptureSessionSettings _settings;
_settings.structureCore.dynamicCalibrationMode = ST::StructureCoreDynamicCalibrationMode: OneShotPersistent;

3. After all the settings are applied, call startMonitoring to make it effective.

_captureSession.startMonitoring( _settings);
Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.