dwelling act 4 (live motion cap w/ kinect azure)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.7 KiB

1 year ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace com.rfilkov.kinect
{
/// <summary>
/// Checks the status of the connected sensors and restarts the sensors, if needed
/// </summary>
public class KinectStatusChecker : MonoBehaviour
{
[Tooltip("Time between sensor-status checks, in seconds.")]
public float timeBetweenChecks = 1f;
[Tooltip("Max wait time before restart (in seconds), when the check is not successful.")]
public float maxWaitTime = 5f;
[Tooltip("Whether to restart the sensors or not, after the max wait time after unsuccessful checks is reached.")]
public bool restartAfterMaxWait = true;
[Tooltip("Whether all sensors are currently alive or not.")]
[HideInInspector]
public bool areSensorsAlive = false;
// references
private IEnumerator checkRoutine = null;
private KinectManager kinectManager = null;
private int numSensors = 0;
private float lastCheckTime = 0f;
private ulong[] lastColorFrameTimestamps = null;
private ulong[] lastDepthFrameTimestamps = null;
void OnEnable()
{
//Debug.Log("Starting check-sensors routine...");
checkRoutine = CheckSensorStatus();
StartCoroutine(checkRoutine);
}
void OnDisable()
{
if(checkRoutine != null)
{
//Debug.Log("Stopping check-sensors routine...");
StopCoroutine(checkRoutine);
checkRoutine = null;
}
}
// co-routine to check the sensor status periodically
private IEnumerator CheckSensorStatus()
{
while(true)
{
if (kinectManager == null)
{
kinectManager = KinectManager.Instance;
//Debug.Log("Got kinect manager: " + kinectManager);
if (kinectManager != null)
{
numSensors = kinectManager.GetSensorCount();
lastColorFrameTimestamps = new ulong[numSensors];
lastDepthFrameTimestamps = new ulong[numSensors];
}
}
if (kinectManager != null)
{
if(CheckAllSensors() || lastCheckTime == 0f)
{
// all sensor have new frames
areSensorsAlive = true;
lastCheckTime = Time.time;
//Debug.Log("Success checking sensor states at " + lastCheckTime);
}
else
{
// no frames from at least one sensor
areSensorsAlive = false;
float waitTime = Time.time - lastCheckTime;
Debug.LogWarning(string.Format("Failed checking sensor states. Wait time: {0:F1} s.", waitTime));
if (waitTime >= maxWaitTime)
{
if(restartAfterMaxWait)
{
Debug.LogWarning("Trying to restart sensors...");
kinectManager.StopDepthSensors();
kinectManager.StartDepthSensors();
Debug.LogWarning("Depth sensors successfully restarted!");
}
kinectManager = null;
lastCheckTime = 0f;
}
}
}
yield return new WaitForSeconds(timeBetweenChecks);
}
}
// checks if all sensors have produced frames in the meantime
private bool CheckAllSensors()
{
for(int s = 0; s < numSensors; s++)
{
ulong curColorFrameTimestamp = kinectManager.GetColorFrameTime(s);
ulong curDepthFrameTimestamp = kinectManager.GetDepthFrameTime(s);
if(lastColorFrameTimestamps[s] != curColorFrameTimestamp || lastDepthFrameTimestamps[s] != curDepthFrameTimestamp)
{
// color or depth frame has been updated in the meantime
lastColorFrameTimestamps[s] = curColorFrameTimestamp;
lastDepthFrameTimestamps[s] = curDepthFrameTimestamp;
}
else
{
// no frames have been received in the meantime
return false;
}
}
return true;
}
}
}