Health/Assets/Scripts/PoseCheck/HandsUp.cs

74 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using OpenCVForUnity.CoreModule;
using System;
using System.Collections.Generic;
using UnityEngine;
public class HandsUp : PoseBase
{
public override Vector2 GetBasicVectorDirection(List<Point> startPoint, List<Point> endPoint)
{
//必要点位 "RShoulder", "LShoulder", "RElbow", "LElbow"
//计算肩膀到手肘矢量,右手
Vector2 rightHandVector = GetAverageVector(startPoint, endPoint, "RElbow");
Vector2 leftHandVector = GetAverageVector(startPoint, endPoint, "LElbow");
//平均矢量
Vector2 averageVector = (rightHandVector + leftHandVector) / 2;
//如果左右手肘矢量差小于两者平均值的0.3倍且左右手矢量夹角小于30度返回左右手矢量平均值
if ((rightHandVector - leftHandVector).magnitude < averageVector.magnitude * 0.3f
&& Vector2.Angle(rightHandVector, leftHandVector) < 30)
{
return averageVector;
}
return Vector2.zero;
}
protected override bool IsMovePoint(string tagName)
{
return "RWrist".Equals(tagName) ||
"LWrist".Equals(tagName);
}
public override void ValidationMovement(Vector2 distance, TimeSpan totalTimeSpan, int level)
{
if (totalTimeSpan.TotalMilliseconds / 1000 < 0.05f)
{
LogPrint.Error("TimeSpan too short");
return;
}
var angle = Vector2.SignedAngle(Vector2.up, distance);
LogPrint.Log($"Angle:{angle}", PrintLevel.Normal);
if (MathF.Abs(angle) < 10)
EventManager.Instance.Dispatch(YogaEventType.Action_Success); //方向不能偏移超过10°
else
{
EventManager.Instance.Dispatch(YogaEventType.Action_Fail);
return;
}
if (level < 1)
return;
LogPrint.Log($"distance x:{distance.x}, y:{distance.y}, magnitude:{distance.magnitude}", PrintLevel.Normal);
if (distance.magnitude > 80f || distance.magnitude < 20f)
EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceNotAccurate);
else
EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceExactly);
if (level < 2)
return;
var speed = distance.magnitude / totalTimeSpan.TotalSeconds;
LogPrint.Log($"speed:{speed}", PrintLevel.Normal);
if (speed > 0.5f)
EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooFast); //速度语音提示
else if (speed < 0.1f)
EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooSlow); //速度语音提示
}
public override void ExcellenceEstimate(List<(TimeSpan, Vector2)> frameData, Vector2 distance, TimeSpan totalTimeSpan)
{
throw new NotImplementedException();
}
}