【问题标题】:Using gyroscope data for a crosshair GUI将陀螺仪数据用于十字准线 GUI
【发布时间】:2013-07-23 18:55:50
【问题描述】:

用我手中的手机代表玩具枪,我移动它(“瞄准”,如果你愿意的话)并将方向数据(俯仰、偏航、滚动)传输到我的笔记本电脑上,在那里我渲染了一个移动的十字准线相对于指向前方的网络摄像头馈送。

我通过让用户在笔记本电脑上按 Enter 键来启动应用程序,同时他们将手机直接放在他们面前 - 这是初始校准步骤,我使用初始偏航/俯仰作为瞄准的参考中心。

然后在相机馈送循环期间,我绘制十字准线,我测量俯仰/偏航相对于那些初始校准值的变化,并使用它们重绘十字准线左/右/上/下。

这是我当前的代码:

  pitchDiff = initPitch - newPitch   #corresponds to Y axis
  yawDiff = 0-(initYaw - newYaw)     #corresponds to X axis
  pitchChangeFactor = 10
  yawChangeFactor = 10

  xC = int((imgWidth/2) + yawDiff*yawChangeFactor) 
  yC = int((imgHeight/2) - pitchDiff*pitchChangeFactor)

  ## THE TARGETING GUI
  cR = 40 #circle radius
  cv2.circle(img, (xC,yC), cR, (20, 20, 255), 3)

我在这个问题中要问的是如何才能更准确、更顺利地做到这一点。陀螺仪数据很嘈杂,所以当我每 30 帧/秒采样一次时,我实际上取了大约 60 个陀螺仪读数的中位数来表示俯仰/偏航。

另外,我认为我的动态模型是错误的:我只是根据角度的变化在屏幕上以恒定的量移动目标十字准线。我认为需要三角函数,但我不清楚我应该尝试什么。仅使用 1 个摄像头,我显然缺乏深度数据。但是,我可以假设我想瞄准的目标是我面前的 3-4 米。

感谢您的帮助

【问题讨论】:

    标签: python user-interface


    【解决方案1】:

    我怎样才能更准确、更顺利地做到这一点?

    陀螺仪测量偏航率、滚动率和俯仰率,但不能直接测量滚动、俯仰和偏航。当您从手机请求俯仰角和偏航角时,它会结合陀螺仪和加速度计数据(可能还有磁力计数据)来估算俯仰角和偏航角。 陀螺仪数据我假设您指的是手机提供的估计偏航角和俯仰角。 确保您使用的是偏航角和俯仰角,而不是偏航率、俯仰率等。

    如果您正在使用估计角度,那么您可以在进行计算之前查看过滤这些信号的不同方法。您提到了一个 60 个样本的中值滤波器。您是否尝试过其他过滤器?一个简单的低通滤波器可能更适合您的情况。如果信号中出现大而突然的尖峰,则中值滤波器很好,但低通滤波器或移动平均线可能更适合您的情况。正确的方法是固定手机的位置,同时采集一段时间的数据,然后分析噪声的频率成分,并选择具有适当截止频率的滤波器,以尽可能多地去除噪声。对于您要尝试做的事情,这可能有点矫枉过正。

    我建议先尝试一个简单的移动平均线或低通滤波器。网上有很多资源展示了如何在软件中实现过滤器。(http://en.wikipedia.org/wiki/Low-pass_filter)

    动态模型

    就您的计算而言,只要您的手机提供角度而不是上面讨论的费率,它们对我来说似乎很好。

    您不需要三角函数。如果您只是想将角度映射到屏幕位置,那么您只需要像您所做的那样简单的线性映射,以便 x 度的角度变化对应于 M*x 像素的屏幕位置变化。

    如果您的手机能够以超过 30 赫兹的速度提供数据,那么另一件事可能会有所帮助。您仍然可以以 30 Hz 的频率更新屏幕,但采样速度更快时您的过滤可能会更有效。不过,这一切都取决于噪声的性质,如果可以的话,您应该尝试采样率。

    祝你的项目好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 2011-04-13
      相关资源
      最近更新 更多