3

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

我通过让用户在将手机直接放在他们面前时按下笔记本电脑上的 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 米。

感谢您的任何帮助

4

1 回答 1

2

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

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

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

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

动态模型

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

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

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

祝你的项目好运。

于 2013-07-24T16:11:15.827 回答