菜鸟教程小白 发表于 2022-12-13 05:01:36

ios - 使用 Core Motion 检测道路颠簸


                                            <p><p>我正在尝试创建一个在驾驶时检测道路颠簸或坑洼的应用程序,我在谷歌上搜索了可能的解决方案,我找到了一个使用加速度计值来检测道路颠簸的解决方案。</p>

<p>我使用了此链接中的代码,当您用手掌轻敲手机时这很好,但在驾驶汽车时它不会检测到颠簸。 <a href="https://stackoverflow.com/questions/6536922/ios-accurately-determining-energy-of-a-bump-from-accelerometer-output/6642071#6642071" rel="noreferrer noopener nofollow">iOS: Accurately determining energy of a bump from accelerometer output</a> </p>

<p>我还发现了一种算法 Z-Diff 可以用来查找道路颠簸,该算法的解释在这里:<a href="http://open-sci.net/wiki/sealappexamplepotholes" rel="noreferrer noopener nofollow">http://open-sci.net/wiki/sealappexamplepotholes</a> </p>

<p>这是我使用的代码:</p>

<p>类型定义结构{
    双 x,y,z;
}vec_d3;</p>

<pre><code>#define RECENT_COUNT 10
#define SMOOTH_IP(x,x_new,fac) x = fac * x + (1. -fac) * x_new
#define DOUBLE_EMPTY DBL_MAX

-(void)startTakingMotionValues{



withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {


    static vec_d3 smooth = {DOUBLE_EMPTY,0,0};
    {
      if(smooth.x == DOUBLE_EMPTY){
            smooth.x=accelerometerData.acceleration.x;
            smooth.y=accelerometerData.acceleration.y;
            smooth.z=accelerometerData.acceleration.z;

            return;
      }
      SMOOTH_IP(smooth.x, accelerometerData.acceleration.x, 0.9);
      SMOOTH_IP(smooth.y, accelerometerData.acceleration.y, 0.9);
      SMOOTH_IP(smooth.z, accelerometerData.acceleration.z, 0.9);
    }

    // keep track of last k smoother acceleration values
    static vec_d3 recent;
    {
      static int ptr=0;
      static BOOL gotEnoughData = NO;

      recent= smooth;
      ptr++;
      if(ptr==RECENT_COUNT){
            ptr=0;
            gotEnoughData=YES;
      }
      if (!gotEnoughData) {
            return;
      }
    }
    //get the resultant variation in acceleration over the whole array
    double variation;
    {
      vec_d3 min = smooth,max=smooth;
      for (int i=0; i&lt; RECENT_COUNT; i++) {
            min.x = MIN(min.x, recent.x);
            min.y = MIN(min.y, recent.y);
            min.z = MIN(min.z, recent.z);

            max.x = MAX(max.x, recent.x);
            max.y = MAX(max.y, recent.y);
            max.z = MAX(max.z, recent.z);
      }
      vec_d3 V = (vec_d3)
      {
            .x = max.x - min.x,
            .y = max.y - min.y,
            .z = max.z - min.z
      };
      variation =sqrt(
                        V.x * V.x +
                        V.y * V.y +
                        V.z * V.z
                        );
    }
    //smooth it
    static double var_smoothed = DOUBLE_EMPTY;
    {
      if (var_smoothed == DOUBLE_EMPTY) {
            var_smoothed = variation;
            return;
      }
      SMOOTH_IP(var_smoothed, variation, 0.9);
    }

    // see if it&#39;s just passed a peak
    {
      static double varSmoothed_last = DOUBLE_EMPTY;
      if (varSmoothed_last == DOUBLE_EMPTY) {
            varSmoothed_last=var_smoothed;
            return;
      }
      static double varSmoother_preLast = DOUBLE_EMPTY;
      if (varSmoother_preLast == DOUBLE_EMPTY) {
            varSmoother_preLast = varSmoothed_last;
            varSmoothed_last = var_smoothed;
            return;
      }

#define THRESHOLD_IMPLUSE .40

      if (varSmoothed_last &gt; varSmoother_preLast &amp;&amp;
            varSmoothed_last &gt; var_smoothed &amp;&amp;
            varSmoothed_last &gt; THRESHOLD_IMPLUSE) {
            didFindLocation=NO;
            if (newLocation.speed &lt; 5) {

            }else{
            NSLog(@&#34;varSmoothed_last: @ %f&#34;,varSmoothed_last);
            NSLog(@&#34;varSmoother_preLast : %f&#34;,varSmoother_preLast);
            NSLog(@&#34;var_smoothed : %f&#34;,var_smoothed);

            ];
            ;
            }

            //;

      }
      varSmoother_preLast = varSmoothed_last;
      varSmoothed_last = var_smoothed;
    }

    }];
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您需要从使用参数开始,以了解如何调整算法以适应不同的频率灵敏度:</p>

<pre><code>#define THRESHOLD_IMPLUSE .40
#define RECENT_COUNT 10
</code></pre>

<p>您还可以尝试调整 0.9 的平滑系数:</p>

<pre><code>SMOOTH_IP(smooth.x, accelerometerData.acceleration.x, 0.9);
</code></pre>

<p>您正在尝试隔离指示道路颠簸的幅度和波长。调整 RECENT_COUNT 或平滑系数应该可以降低对高频颠簸的敏感性。调整 THRESHOLD_IMPULSE 可能会影响幅度截止。</p>

<p>要衡量这些因素对结果的影响,您还应该设计一些测试和测量方法。 <em>记录</em>来自道路颠簸的一些数据将帮助您了解您希望检测到的行为。</p>

<p>一旦你理解了算法并对其进行了调整,如果它仍然不能隔离你所追求的运动,你应该看看你的第一个链接中的其他算法,分别理解它们,然后尝试添加他们混在一起。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 Core Motion 检测道路颠簸,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28186543/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28186543/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 Core Motion 检测道路颠簸