private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _executeControlStrategies = !_executeControlStrategies; } var ballRadiusAndPosition = _cameraPlugin.UpdateImageProcessing(); var height = FOVCalculations.RadiusToDistance(ballRadiusAndPosition.Radius); if (!_executeControlStrategies) { foreach (var strategy in _ballControlStrategies) { strategy.Reset(); } _currentStrategyIndex = 0; } if (height >= float.MaxValue) { // couldn't find ball in image return; } _ballData.UpdateData( new Vector3( FOVCalculations.PixelPositionToDistanceFromCenter(ballRadiusAndPosition.PositionX, height), FOVCalculations.PixelPositionToDistanceFromCenter(ballRadiusAndPosition.PositionY, height), height), _machineController.IsReadyForNextInstruction); _ballPositionVisualizer.SpawnPositionPoint(_ballData.CurrentUnityPositionVector); if (_machineController.IsReadyForNextInstruction && _executeControlStrategies) { var nextStrategyRequested = _ballControlStrategies[_currentStrategyIndex].Execute(_ballData, _machineController); if (nextStrategyRequested) { _ballControlStrategies[_currentStrategyIndex].Reset(); if (_currentStrategyIndex < _ballControlStrategies.Count - 1) { _currentStrategyIndex++; } } } }
private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _executeControlStrategies = !_executeControlStrategies; } var ballRadiusAndPosition = _cameraPlugin.UpdateImageProcessing(); var height = FOVCalculations.RadiusToDistance(ballRadiusAndPosition.Radius); if (!_executeControlStrategies) { foreach (var strategy in _strategies) { strategy.Reset(); } _currentStrategyIndex = 0; } if (height >= float.MaxValue) { // couldn't find ball in image return; } var ballPosX = FOVCalculations.PixelPositionToDistanceFromCenter(ballRadiusAndPosition.PositionX, height); _gradientDescentX.Hypothesis.SetTheta_0To(ballPosX); _gradientDescentX.AddTrainingSet(new TrainingSet(0f, ballPosX)); _gradientDescentX.UpdateHypothesis(); var ballPosY = FOVCalculations.PixelPositionToDistanceFromCenter(ballRadiusAndPosition.PositionY, height); _gradientDescentY.Hypothesis.SetTheta_0To(ballPosY); _gradientDescentY.AddTrainingSet(new TrainingSet(0f, ballPosY)); _gradientDescentY.UpdateHypothesis(); _gradientDescentZ.Hypothesis.SetTheta_0To(height); _gradientDescentZ.AddTrainingSet(new TrainingSet(0f, height)); _gradientDescentZ.UpdateHypothesis(); _ballData.UpdateData( new Vector3( _gradientDescentX.Hypothesis.Parameters.Theta_0, _gradientDescentY.Hypothesis.Parameters.Theta_0, height), new Vector3( _gradientDescentX.Hypothesis.Parameters.Theta_1, _gradientDescentY.Hypothesis.Parameters.Theta_1, _gradientDescentZ.Hypothesis.Parameters.Theta_1 )); _ballPositionVisualizer.SpawnPositionPoint(_ballData.CurrentUnityPositionVector); if (_machineController.IsReadyForNextInstruction && _executeControlStrategies) { var isRequestingNextStrategy = _strategies[_currentStrategyIndex].Execute(_ballData, _machineController); if (isRequestingNextStrategy) { _strategies[_currentStrategyIndex].Reset(); if (_currentStrategyIndex < _strategies.Count - 1) { _currentStrategyIndex++; _predictedPositionVisualizer .SetActive(_strategies[_currentStrategyIndex].UsesBallPositionPrediction); } } } }