C++ 使用Arduino检测点头

C++ 使用Arduino检测点头,c++,arduino,accelerometer,gesture,gesture-recognition,C++,Arduino,Accelerometer,Gesture,Gesture Recognition,我正在开发一个应用程序,我需要检测某人头部的运动,特别是当某人点头时。为此,我们将Arduino与加速计(MPU-6050)一起放置在盖子上。加速计返回0和10之间的值,从水平向上看一点,从0和-10之间看一点向下看 我需要识别表示简单点头的值的模式,如。我被告知我必须使用类似于: for(int x = 0; x < 100; x++){ result += abs(oldvalue) + abs(newvalue) / 2; } for(int x=0;x阈值| |当前状态

我正在开发一个应用程序,我需要检测某人头部的运动,特别是当某人点头时。为此,我们将Arduino与加速计(MPU-6050)一起放置在盖子上。加速计返回0和10之间的值,从水平向上看一点,从0和-10之间看一点向下看

我需要识别表示简单点头的值的模式,如。我被告知我必须使用类似于:

for(int x = 0; x < 100; x++){
    result += abs(oldvalue) + abs(newvalue) / 2;
}
for(int x=0;x<100;x++){
结果+=abs(旧值)+abs(新值)/2;
}
这将得到100次循环的平均值(如0.5秒),但无法根据
结果确定一个人是否点头


我自己也考虑过检查某种波形,实际上是点头。旧值将在一段时间内低于或高于另一个值,但不确定如何做到这一点,因为我无法暂停代码,因为它也在检查其他传感器(麦克风和指南针)的输出。

当传感器处于理想/静态状态时,您需要有一个阈值 或者轻微的自然头部运动 嗯,你可以试试这个代码,我想它对你有用:

void loop()
{
    int CurrentState = analogRead(AccPin);
     if(CurrentState > ThresHold || CurrentState < ThresHold)
     {boolean IsNoding = CheckForNoding();} 
     if(IsNoding)
     {
         //Do Whatever You Want
     }
     else
     delay(TimeInterVal); 
}

boolean CheckForNoding()
{ 
  Count = 0;
  boolean State = false;
  while(Count<MinToConsiderNode) // Your Case 100?!
  {
      int CurrentState = analogRead(AccPin);
      if(CurrentState > ThresHold || CurrentState < ThresHold)
      {
          int Count ++;
          delay(TimeInterval) // What you Think Should Be The Time Period Between each => Head Going Up or Down
          State = true;
      }
      else 
        {
            State = false;
            break;
        }
  }

    return State;
}
void循环()
{
int CurrentState=模拟读取(AccPin);
如果(当前状态>阈值| |当前状态<阈值)
{boolean IsNoding=CheckForNoding();}
如果(正在点头)
{
//你想干什么就干什么
}
其他的
延迟(时间间隔);
}
布尔CheckForNoding()
{ 
计数=0;
布尔状态=假;
while(计数阈值| |当前状态<阈值)
{
整数计数++;
delay(TimeInterval)//您认为应该是每个=>头部上升或下降之间的时间段
状态=真;
}
其他的
{
状态=假;
打破
}
}
返回状态;
}

你试过求导数吗?我没有,也不确定怎么做,但我会试试。谢谢你的输入。当寻找周期性信号时,总是考虑FFT。小波变换是另一种选择。我不确定您共享的代码试图做什么——因为它取绝对值,结果会无限增加。首先,我承认我没有使用加速度计的经验。我不确定您共享的代码试图做什么——因为它取绝对值,结果将无限增加。您可以尝试使用运行平均值——创建一个数组来存储值(可能值1秒),进行初始读取并用该值填充数组。然后,对于每一次读取,替换一个值,在执行时递增,最后滚动。每次取平均值。当你看到自己的价值明显低于平均水平时(你必须测试到底有多少),你就会点头(我想)。