将陀螺仪数据用于十字准线GUI

时间:2013-07-23 18:55:50

标签: python user-interface

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

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

然后在我拍摄十字准线的相机进给循环中,我测量相对于那些初始校准值的俯仰/偏航的变化,并且我使用它们来重绘左/右/上/下的十字准线。 crosshair program

这是我目前的代码:

  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个陀螺仪读数的中位数用于俯仰/偏航。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

如何更准确,更顺利地完成这项工作?

陀螺仪可测量横摆率,侧倾率和俯仰率,但无法直接测量横摇,俯仰和偏航。当您从手机请求俯仰角和偏航角时,它会结合陀螺仪和加速度计数据(以及可能的磁力计数据)来估计俯仰和偏航。 通过陀螺仪数据我假设您的意思是手机提供的估计偏航和俯仰。 确保使用的是偏航和俯仰角,而不是偏航率,俯仰率等。

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

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

动态模型

就你的计算而言,只要你的手机提供角度而不是如上所述的费率,它们对我来说似乎很好。

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

另一件可能有用的事情是,如果您的手机能够提供超过30赫兹的数据。您仍然可以以30 Hz的频率更新屏幕,但在采样速度更快时,您的过滤可能更有效。这一切都取决于噪音的性质,如果可以,你应该尝试采样率。

祝你的项目好运。