/// <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.");
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
 /// <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);