Beispiel #1
0
        /// <summary>
        /// Evaluate an exercise step
        /// </summary>
        /// <param name="exerciseStep">The performed step</param>
        /// <param name="idealExerciseStep">Optional, required if no training set was provided</param>
        /// <returns></returns>
        public EvaluationResults EvaluateExerciseStep(ExerciseStep exerciseStep, ExerciseStep idealExerciseStep = null)
        {
            bool niceWork = true;

            ArticolationError[] stepEvaluationResults = _exerciseEvaluator.EvaluateExerciseStep(ExerciseTollerance, exerciseStep, idealExerciseStep);
            if (ExerciseTollerance != null)
            {
                for (int i = 0; i < stepEvaluationResults.Length; i++)
                {
                    ArticolationError error = stepEvaluationResults[i];
                    niceWork &= error.Position.IsMagnitudeCorrect && error.Position.IsSpeedCorrect &&
                                error.Angle.IsSpeedCorrect && error.Angle.IsMagnitudeCorrect;
                }
            }

            return(new EvaluationResults(niceWork, stepEvaluationResults));
        }
Beispiel #2
0
        private void CalculateSpeedErrors(ArticolationError articolationError,
                                          ArticolationPoint currentArticolationPoint, ArticolationPoint previousArticolationPoint,
                                          ArticolationPoint currentIdealArticolationPoint, ArticolationPoint previousIdealArticolationPoint)
        {
            if (previousIdealArticolationPoint != null && previousArticolationPoint != null)
            {
                articolationError.Position.Speed = CalculateSpeedError(
                    currentIdealArticolationPoint.Position, previousIdealArticolationPoint.Position,
                    currentArticolationPoint.Position, previousArticolationPoint.Position,
                    _trainingSet.timing);

                articolationError.Angle.Speed = CalculateSpeedError(
                    currentIdealArticolationPoint.Angle, previousIdealArticolationPoint.Angle,
                    currentArticolationPoint.Angle, previousArticolationPoint.Angle,
                    _trainingSet.timing);
            }
            else
            {
                articolationError.Position.Speed = Vector3.zero;
                articolationError.Angle.Speed    = Vector3.zero;
            }
        }
Beispiel #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tollerances"></param>
        /// <param name="currentStep"></param>
        /// <param name="idealExerciseStep"></param>
        /// <returns></returns>
        public ArticolationError[] EvaluateExerciseStep(ArticolationTollerance[] tollerances, ExerciseStep currentStep, ExerciseStep idealExerciseStep = null)
        {
            // check abiity to evaluate the step
            if (_isRealTimeSampling && idealExerciseStep == null)
            {
                throw new Exception("Unable to evaluate exercise step without ideal sample or a training set!");
            }

            PerformedMovementSteps.Add(currentStep);

            // eventually keep training the ai (doing this all the following code is the same in both cases)
            if (idealExerciseStep != null)
            {
                _trainingSet.idealMovementSteps.Add(idealExerciseStep);
            }

            ExerciseStep previousStep      = GetPerformedStep(-1),
                         currentIdealStep  = GetIdealStep(0),
                         previousIdealStep = GetIdealStep(-1);

            if (currentIdealStep == null)
            {
                int lastStepIndex = _trainingSet.idealMovementSteps.Count - 1;
                currentIdealStep  = _trainingSet.idealMovementSteps[lastStepIndex];
                previousIdealStep = _trainingSet.idealMovementSteps[lastStepIndex - 1];
            }

            List <ArticolationError> articolationErrors                 = new List <ArticolationError>();
            ArticolationPoint        currentStepArticolationPoint       = currentStep.Root,
                                     previousStepArticolationPoint      = previousStep == null ? null : previousStep.Root,
                                     currentStepIdealArticolationPoint  = currentIdealStep.Root,
                                     previousStepIdealArticolationPoint = previousIdealStep == null ? null : previousIdealStep.Root;
            int i = 0;

            while (currentStepArticolationPoint != null)
            {
                ArticolationError      articolationError = new ArticolationError();
                ArticolationTollerance tollerance        = tollerances[i++];

                articolationError.Position.Magnitude = currentStepIdealArticolationPoint.Position - currentStepArticolationPoint.Position;

                Debug.Log("Articolation [" + i + "]");
                Debug.Log("ideal position (" +
                          currentStepIdealArticolationPoint.Position.x + ", " + currentStepIdealArticolationPoint.Position.y + ", " + currentStepIdealArticolationPoint.Position.z + ")"
                          );
                Debug.Log("real position (" +
                          currentStepArticolationPoint.Position.x + ", " + currentStepArticolationPoint.Position.y + ", " + currentStepArticolationPoint.Position.z + ")"
                          );

                articolationError.Position.IsMagnitudeCorrect = articolationError.Position.Magnitude.magnitude < tollerance.positionTolleranceRadius;

                articolationError.Angle.Magnitude          = currentStepIdealArticolationPoint.Angle - currentStepArticolationPoint.Angle;
                articolationError.Angle.IsMagnitudeCorrect = articolationError.Angle.Magnitude.magnitude < tollerance.rotationTolleranceRadius;

                CalculateSpeedErrors(articolationError, currentStepArticolationPoint, previousStepArticolationPoint, currentStepIdealArticolationPoint, previousStepIdealArticolationPoint);
                articolationError.Position.IsSpeedCorrect = articolationError.Position.Speed.magnitude < tollerance.positionSpeedTolleranceRadius;
                articolationError.Angle.IsSpeedCorrect    = articolationError.Angle.Speed.magnitude < tollerance.positionSpeedTolleranceRadius;

                articolationErrors.Add(articolationError);

                currentStepArticolationPoint       = currentStepArticolationPoint.Substaining;
                previousStepArticolationPoint      = previousStepArticolationPoint == null ? null : previousStepArticolationPoint.Substaining;
                currentStepIdealArticolationPoint  = currentStepIdealArticolationPoint.Substaining;
                previousStepIdealArticolationPoint = previousStepIdealArticolationPoint == null ? null : previousStepIdealArticolationPoint.Substaining;
            }
            return(articolationErrors.ToArray());
        }
    private void CreateAI()
    {
        Sensor shoulderSensor = new Sensor(shoulder, shoulderTollerance, "spalla");
        Sensor elbowSensor    = new Sensor(elbow, elbowTollerance, "gomito");
        Sensor handSensor     = new Sensor(hand, handTollerance, "mano");

        LimbConfiguration config = new LimbConfiguration(shoulderSensor, elbowSensor, handSensor);

        // check that there is the ghost
        if (sampleRecorder.trackersPreview.Count != 3)
        {
            throw new System.Exception("Ghost non correttamente configurato");
        }

        LimbConfiguration ghostConfig = new LimbConfiguration(new Sensor(sampleRecorder.trackersPreview[0]), new Sensor(sampleRecorder.trackersPreview[1]), new Sensor(sampleRecorder.trackersPreview[2]));

        exerciseConfiguration = new ExerciseConfiguration(
            config,
            (EvaluationResults results) =>
        {
            AIProxy aiProxy = new AIProxy();     // should be taken from context
            List <string> articolationNames = new List <string>()
            {
                "spalla", "gomito", "mano"
            };
            foreach (string articolationName in articolationNames)
            {
                ArticolationError error = aiProxy.UnwrapFromResults(articolationName, results, articolationNames);
                bool isPositionCorrect  = error.Position.IsSpeedCorrect && error.Position.IsMagnitudeCorrect,
                isRotationCorrect       = error.Angle.IsSpeedCorrect && error.Angle.IsMagnitudeCorrect;
                Debug.Log(articolationName + ": POSITION IS CORRECT - " + isPositionCorrect.ToString()
                          + " # ROTATION IS CORRECT - " + isRotationCorrect.ToString());

                GameObject trackerOb;
                string nameID = "";

                switch (articolationName)
                {
                case "spalla":
                    nameID    = "Shoulder";
                    trackerOb = shoulder;
                    break;

                case "gomito":
                    nameID    = "Elbow";
                    trackerOb = elbow;
                    break;

                case "mano":
                    nameID    = "Wrist";
                    trackerOb = hand;
                    break;

                default:
                    trackerOb = hand;
                    break;
                }

                //Genera evento con risultati AI -> contesto
                SendResult(nameID, isPositionCorrect);


                if (isPositionCorrect)
                {
                    trackerOb.GetComponent <MeshRenderer>().material.color = Color.green;
                }
                else
                {
                    trackerOb.GetComponent <MeshRenderer>().material.color = Color.red;
                }
            }
        },
            ghostConfig
            );
        VirtualPhysioterphyst.Instance.ExerciseSetup(exerciseConfiguration);
    }