/// <summary> /// Begins the calibration process. /// </summary> /// <param name="initializationType"></param> public void Begin(SlamInitializationType initializationType) { //prevent runaway calibration process if (_calibration != null) { StopCoroutine(_calibration); } _calibration = StartCoroutine(FullCalibration(initializationType)); }
/// <summary> /// Run UI /// </summary> /// <param name="initializationType"></param> private IEnumerator FullCalibration(SlamInitializationType initializationType) { yield return(SensorInitialization()); SLAMUIManager slamInitManager = GetComponentInChildren <SLAMUIManager>(); yield return(slamInitManager.RunFullCalibration(initializationType)); // yield return StartCoroutine(canvas.FindCanvasOrigin()); yield return(null); Cleanup(); }
private IEnumerator ShowUI(SlamInitializationType initializationType) { //Waiting for the interop to refresh slam data after reset. yield return new WaitForSeconds(3f); yield return new WaitUntil(() => _showCalibrationUI); if (IsFinished) { yield break; } if (_slamUiPrefab != null) { _slamUI = Instantiate(_slamUiPrefab); BaseSlamGuide slamGuide = _slamUI.GetComponent<BaseSlamGuide>(); slamGuide.StartTrackCalibrationSteps(initializationType); } else { Debug.LogError("Could not locate SLAM UI resource."); } }
private IEnumerator TrackCalibrationSteps(SlamInitializationType initializationType) { // waiting for the sensors while (!_sensorsReady) { yield return(null); } // shows a message in case the user doesn't move in the beggining _currentCalibrationStage = CalibrationStage.WaitingForTracking; StartCoroutine(_slamUI.ChangeUIStage(_currentCalibrationStage)); if (initializationType == SlamInitializationType.NewMap) { _currentCalibrationStage = CalibrationStage.Mapping; // start timeout countdown StartCoroutine(TimeOutCalibrationFail(SlamFailTimeOut)); } else { _headOrientation.gameObject.SetActive(false); _currentCalibrationStage = CalibrationStage.Remapping; } // show start message StartCoroutine(_slamUI.ChangeUIStage(_currentCalibrationStage)); int currentStep = 0; while (true) { float coverage = _coverageAngle; if (_calibrationSteps[currentStep] == CalibrationStep.RotateFurtherLeft || _calibrationSteps[currentStep] == CalibrationStep.RotateFurtherRight) { coverage *= _furtherAngleIncrease; } float angle; // TODO change logic to consider _initialYOrientation after compositor implements different origin if (_centerEye.rotation.eulerAngles.y > 180) { angle = Mathf.Clamp(_centerEye.rotation.eulerAngles.y - 360, -coverage, coverage); } else { angle = Mathf.Clamp(_centerEye.rotation.eulerAngles.y, -coverage, coverage); } _headOrientation.Rotation = (coverage - angle) / (coverage * 2); // if calibration happens at any point if (DetectCalibratedStage()) { _currentCalibrationStage = CalibrationStage.Completed; yield return(StartCoroutine(_slamUI.ChangeUIStage(_currentCalibrationStage))); } // if hold still stage is detected at any point else if (DetectHoldStillStage() && _currentCalibrationStage != CalibrationStage.HoldStill) { _currentCalibrationStage = CalibrationStage.HoldStill; _headOrientation.gameObject.SetActive(false); StartCoroutine(TimeOutCalibrationFail(SlamHoldStillMaxTime)); StartCoroutine(_slamUI.ChangeUIStage(_currentCalibrationStage)); } // if goal for the current step is achieved else if (ApproximatelyWithThreshold(_calibrationStepAngle[_calibrationSteps[currentStep]], ConvertToPositiveAngle(_centerEye.rotation.eulerAngles.y))) { if (currentStep + 1 < _calibrationSteps.Length) { currentStep++; StartCoroutine(_slamUI.ChangeUIStage(_currentCalibrationStage)); } // steps finished else { // if not initialized then fail StartCoroutine(FailState()); } } yield return(null); } }
/// <summary> /// Start tracking users steps to guide calibration /// </summary> /// <param name="initializationType"></param> public override void StartTrackCalibrationSteps(SlamInitializationType initializationType) { _mainCoroutine = StartCoroutine(TrackCalibrationSteps(initializationType)); }
/// <summary> /// Start tracking users steps to guide calibration /// </summary> /// <param name="calibrationStage"></param> public abstract void StartTrackCalibrationSteps(SlamInitializationType calibrationStage);