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. For each value the zero position is the forward vector of the hand.
Finger flex
The finger flex is the angle of flexion at each finger joint.
Finger spread
The finger spread is the splay angle of each MCP joint towards the thumb joint.
Thumb flex
For the CMC joint, the angle of the radial abduction is expressed. For the MCP and IP joint, the flexion is expressed. Please note that this means the CMC joint has a opposite alignment to the other joints.
Thumb spread
The thumb spread is the angle of the 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_MCP_Flex | Thumb_IP_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.
Note
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.
void OnErgonomicsStreamCallback(const ErgonomicsStream* const p_Stream)
{
FeedTimestamp(p_Stream->publishTime);
for (uint32_t i = 0; i < p_Stream->dataCount; ++i)
{
if (p_Stream->data[i].isUserID) continue;
std::lock_guard<std::mutex> t_Lock(g_ErgonomicsMutex);
g_ErgonomicsData[p_Stream->data[i].id] = p_Stream->data[i];
}
}
def on_ergonomics_callback(self, ergonomics_stream):
"""Callback for ergonomics data"""
try:
# Update cached ergonomics data by glove ID
count = ergonomics_stream.dataCount
next_ergonomics_data = {}
for i in range(count):
data = ergonomics_stream.data[i]
glove_id = data.id
# Make a deep copy of the data since CFFI structures may be reused
data_copy = {
'id': data.id,
'isUserID': data.isUserID,
'data': list(data.data) # Convert CFFI array to Python list
}
next_ergonomics_data[glove_id] = data_copy
# Hand the data over to the main thread instead of processing it here
with self.ergonomics_mutex:
self.next_ergonomics_data = next_ergonomics_data
except Exception as e:
self.log("ERROR", f"Ergonomics callback error: {e}")
print(f"Error in ergonomics callback: {e}")

