Skip to content

Ergonomics

alt text

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

alt text alt text
Side view

The angle of each joint is expressed as the angle between the joint that came before it.

Finger spread

alt text alt text
Top view

The spread is the splay of the MCP joint. The zero position is the forward vector of the hand.

Thumb flex

alt text alt text
Top view

The angle of the thumb extension/flexion is expressed.

Thumb spread

alt text alt text
Side view

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

alt text

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.

SDKClient.cpp OnErgonomicsCallback
/// @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];
            }
        }
    }
}