Manus gloves
Manus gloves are a type of wearable device designed for precise hand and finger tracking which is useful in virtual reality (VR) environments. Users can grasp and manipulate virtual objects finely using their own hands. Manus in INTERACT allows users to check hand clearance for assembly tasks in tight environments.
Calibrate Manus gloves
Manus Core version
In order to properly use Manus gloves, you need to download Manus Core 2.2.
Download the version corresponding to your gloves on Manus website.
- Launch Manus Core 2.2 and turn on the Manus gloves.
- Run Manus Dashboard (right click on Manus Core in minimized applications)
- Calibrate both gloves with trackers (read Manus documentation for more information).
Once the calibration is done you should see your hands and finger move in Manus Dashboard. You are good to go on your INTERACT project in Unity.
Create a Manus player in INTERACT
Two different INTERACT VR players are compatible with Manus gloves depending on your use-case or the numbers of Vive trackers.
You can choose between :
- a VR player with only hand and finger tracking
- one with hands, finger and full body tracking and ergonomics analysis capabilities.
Full body tracking
You can use Vive trackers to track your arms and legs motion in addition to your Manus gloves to have full body motion tracking. This allows you to use INTERACT ergonomics features with your Manus gloves.
Add this player by selecting VR Headset in display settings, and both Hand & Finger Tracking and Body Tracking in Additional Tracking Settings:
The suit consists of 7 devices placed on both hands, arms, legs and around the belt :
Trackers assignation
When using Manus and Vive trackers for full body motion tracking, the calibration automatically assigns the trackers.
Advanced
Grab conditions
Grab/ungrab conditions are set in the component "HandGrabEvents" (in HandsCallBack).
Then you must fill the parameters needed according to the grab condition type you have chosen. Default type is distance for both grab and ungrab, and the parameters are index tip and thumb tip (transforms), and two separated thresholds for grab and ungrab (distance in meters), in order to avoid accidental ungrab ("flickering" of the distance). There are also settings for grabbing timer, which is a minimum time to prevent false positives.
Listen to Hand grab/ungrab events
Those events can raise a function of your choice: the listener is set either in inspector of the component "HandGrabEvents" (in HandsCallBack) or from script (Unity event).
Here below is an example of script that you can drag in HandsCallBack to show visually when the grab/ungrab is triggered. To simplify testing, this code works without any references, but if you are willing to keep it in your scene, you should refactor using serialized fields.
using UnityEngine;
using INTERACT.Runtime.Core;
public class HandGrabEventsListener : MonoBehaviour
{
Material grabbedMat;
Material ungrabbedMat;
Renderer glovesRenderer;
void Start()
{
grabbedMat = new Material(Shader.Find("Standard"));
grabbedMat.SetColor("_Color", Color.green);
ungrabbedMat = new Material(Shader.Find("Standard"));
ungrabbedMat.SetColor("_Color", Color.red);
glovesRenderer = GameObject.Find("Gloves").GetComponent<Renderer>();
HandGrabEvents[] handGrabEventsComponents = GameObject.Find("HandsCallback").GetComponents<HandGrabEvents>();
handGrabEventsComponents[0].m_handClosed.AddListener(CallbackOnLeftGrabEnter);
handGrabEventsComponents[0].m_handOpened.AddListener(CallbackOnLeftGrabExit);
handGrabEventsComponents[1].m_handClosed.AddListener(CallbackOnRightGrabEnter);
handGrabEventsComponents[1].m_handOpened.AddListener(CallbackOnRightGrabExit);
}
public void CallbackOnLeftGrabEnter()
{
glovesRenderer.material = grabbedMat;
}
public void CallbackOnLeftGrabExit()
{
glovesRenderer.material = ungrabbedMat;
}
public void CallbackOnRightGrabEnter()
{
glovesRenderer.material = grabbedMat;
}
public void CallbackOnRightGrabExit()
{
glovesRenderer.material = ungrabbedMat;
}
}
Overview of the hand tracking pipeline
In Interact, we use XDE to physicalize the hand as well, so that's why we don't use the Manus hand directly. There are three types of hands :
- the tracked hand: node positions updated from OpenXR.
- the XDE hand: act like an intermediate between the tracked hand and the skinned hand, to constrain hand with XDE collisions and allows other XDE interactions.
- the skin hand: controls the skin mesh of the avatar.