Ergonomics
MANUS Core exposes it's data in two forms. Skeletal data via the skeleton system and in the form of ergonomics
data. Here the shape of the hand is expressed in bends and stretch values.
Data
The data is expressed as a joint angle (flexion or (hyper)extension, i.e. bending; abduction or adduction, i.e. splaying) of the joint in degrees.
Finger flex
The angle of each joint is expressed as the angle between the joint that came before it.
Finger spread
The spread is the splay of the MCP joint. The zero position is the forward vector of the hand.
Thumb flex
The angle of the thumb extension/flexion is expressed.
Thumb spread
Thumb spread refers to the angle of thumb palmar abduction.
Availability
The ergonomics data is exposed through a few methods.
CSV export
The CSV exporter can export the ergonomics data of a recording. Below is an example of what 10 frames of exported ergonomics data may look like.
Frame | Elapsed_Time_In_Milliseconds | Time | Thumb_CMC_Spread | Thumb_CMC_Flex | Thumb_PIP_Flex | Thumb_DIP_Flex | Index_MCP_Spread | Index_MCP_Flex | Index_PIP_Flex | Index_DIP_Flex | Middle_MCP_Spread | Middle_MCP_Flex | Middle_PIP_Flex | Middle_DIP_Flex | Ring_MCP_Spread | Ring_MCP_Flex | Ring_PIP_Flex | Ring_DIP_Flex | Pinky_MCP_Spread | Pinky_MCP_Flex | Pinky_PIP_Flex | Pinky_DIP_Flex |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 03:08:42:2042 | 7.76028 | 52.28523 | 13.45082 | 6.985502 | -8.84265 | -55.6618 | 0 | 0 | -6.52444 | 57.52699 | 34.82026 | 22.05363 | -7.45598 | 86.6957 | 41.60022 | 26.47276 | -17.7503 | 108.2572 | 24.86548 | 15.72668 |
1 | 41.66667 | 03:08:42:2125 | 7.76028 | 52.28523 | 13.45082 | 6.985502 | -8.84265 | -55.6618 | 0 | 0 | -6.52444 | 57.52699 | 34.82026 | 22.05363 | -7.45598 | 86.6957 | 41.60022 | 26.47276 | -17.7503 | 108.2572 | 24.86548 | 15.72668 |
2 | 83.33334 | 03:08:42:2250 | 4.371436 | 52.81559 | 13.05657 | 6.268728 | -20.2851 | -63.9535 | 0 | 0 | -7.39388 | 89.00375 | 57.58315 | 36.60889 | -5.09243 | 90.07294 | 52.47465 | 33.31127 | -13.2157 | 102.8983 | 38.58518 | 24.54881 |
3 | 125 | 03:08:42:2375 | 6.774421 | 54.78779 | 16.21277 | 11.9278 | 2.785161 | 100.4811 | 0 | 0 | -5.32035 | 80.98426 | 70.38481 | 44.75171 | -3.06956 | 73.303 | 57.73388 | 36.64686 | -7.98834 | 78.25156 | 48.39624 | 30.78353 |
4 | 166.6667 | 03:08:42:2458 | 6.774421 | 54.78779 | 16.21277 | 11.9278 | 2.785161 | 100.4811 | 0 | 0 | -5.32035 | 80.98426 | 70.38481 | 44.75171 | -3.06956 | 73.303 | 57.73388 | 36.64686 | -7.98834 | 78.25156 | 48.39624 | 30.78353 |
5 | 208.3333 | 03:08:43:083 | 38.97761 | 50.76754 | 31.34525 | 37.92809 | -8.73739 | 102.3336 | 0 | 0 | -3.64207 | 32.73631 | 70.41073 | 46.45795 | -9.81069 | 12.33638 | 40.8983 | 26.00516 | -12.532 | 15.30413 | 28.06619 | 17.6064 |
6 | 250 | 03:08:43:167 | 38.97761 | 50.76754 | 31.34525 | 37.92809 | -8.73739 | 102.3336 | 0 | 0 | -3.64207 | 32.73631 | 70.41073 | 46.45795 | -9.81069 | 12.33638 | 40.8983 | 26.00516 | -12.532 | 15.30413 | 28.06619 | 17.6064 |
7 | 291.6667 | 03:08:43:250 | 42.94995 | 47.20762 | 34.72069 | 43.62371 | -6.45989 | 102.6125 | 0 | 0 | -5.38128 | 0.566137 | 44.47557 | 28.30182 | -14.9866 | 0.090654 | 34.00534 | 21.56993 | -18.9714 | 9.627044 | 17.9592 | 11.17294 |
8 | 333.3333 | 03:08:43:375 | 44.54718 | 34.27273 | 34.45324 | 42.66684 | -3.65302 | 102.7442 | 0 | 0 | -20.65 | -19.585 | 0 | 0 | -21.373 | -8.02174 | 23.39929 | 14.76403 | -24.9665 | 1.593236 | 7.930088 | 4.875038 |
9 | 375 | 03:08:43:500 | 43.44453 | 27.02697 | 29.30736 | 33.59231 | 13.25663 | 102.106 | 0 | 0 | -20.4344 | -30.8877 | 0 | 0 | -24.6207 | -8.60145 | 18.92728 | 11.92084 | -26.0091 | 6.93319 | 7.741617 | 4.736028 |
10 | 416.6667 | 03:08:43:583 | 43.44453 | 27.02697 | 29.30736 | 33.59231 | 13.25663 | 102.106 | 0 | 0 | -20.4344 | -30.8877 | 0 | 0 | -24.6207 | -8.60145 | 18.92728 | 11.92084 | -26.0091 | 6.93319 | 7.741617 | 4.736028 |
Data view
The data view in the MANUS Core Dashboard visualizes the ergonomics data in a simplistic way. Showing the individual finger's flex angles and the CMC spread values.
Datastream
Ergonomics data is also available within our SDK and plugins for use in application development. This gives all the control to use the ergonomics data in real-time applications.
Below is the function where the ergonomics data enters the SDKClient example we ship with our SDK.
/// @brief This gets called when receiving ergonomics data from Manus Core
/// In our sample we only save the first left and first right glove's latests ergonomics data.
/// Ergonomics data gets generated and sent when glove data changes, this means that the stream
/// does not always contain ALL of the devices, because some may not have had new data since
/// the last time the ergonomics data was sent.
/// @param p_Ergo contains the ergonomics data for each glove connected to Core.
void SDKClient::OnErgonomicsCallback(const ErgonomicsStream* const p_Ergo)
{
if (s_Instance)
{
for (uint32_t i = 0; i < p_Ergo->dataCount; i++)
{
if (p_Ergo->data[i].isUserID)continue;
ErgonomicsData* t_Ergo = nullptr;
if (p_Ergo->data[i].id == s_Instance->m_FirstLeftGloveID)
{
t_Ergo = &s_Instance->m_LeftGloveErgoData;
}
if (p_Ergo->data[i].id == s_Instance->m_FirstRightGloveID)
{
t_Ergo = &s_Instance->m_RightGloveErgoData;
}
if (t_Ergo == nullptr)continue;
CoreSdk_GetTimestampInfo(p_Ergo->publishTime, &s_Instance->m_ErgoTimestampInfo);
t_Ergo->id = p_Ergo->data[i].id;
t_Ergo->isUserID = p_Ergo->data[i].isUserID;
for (int j = 0; j < ErgonomicsDataType::ErgonomicsDataType_MAX_SIZE; j++)
{
t_Ergo->data[j] = p_Ergo->data[i].data[j];
}
}
}
}