过滤罗盘读数
我正在使用罗盘标题来旋转 MKMapView。旋转有点不稳定,所以我试图像 iPhone 上的 Google 地图一样过滤它(或者似乎做了一些欺骗)。
我正在尝试使用移动平均公式过滤 iPhone 指南针的读数,但它在 359 和 0 之间的交叉处失败,因为它开始从 35x 向后平均到 0,并导致地图在从 359 向北接近时向后旋转。西方。
任何想法最好的方法是过滤这些数据,使其从 359 回到零并保持滚动平均值。
代码在这里:
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
static float xd=0;
static float k = 0.22;
// Moving average formula
xd = k * xd + (1.0 - k) * newHeading.magneticHeading;
NSLog(@"%0.2f : %0.2f", newHeading.magneticHeading, xd);
[map setTransform:CGAffineTransformMakeRotation((-1 * xd * M_PI) /180)];}
感谢您的帮助
I'm using compass heading to rotate an MKMapView. The rotation was a bit jerky so I'm trying to filter it like Google Maps on the iphone does (or appears to do some trickery).
I'm trying to filter the reading from the iphone compass using a moving average formula but it fails on the crossover between 359 adn 0 becuase it starts to average backwards from 35x to 0 and causes the map to rotate backwards as it approaches north from the west.
Any ideas what the best way is to filter this data so that it crosses from 359 back to zero and maintain the rolling average.
Code is here:
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
static float xd=0;
static float k = 0.22;
// Moving average formula
xd = k * xd + (1.0 - k) * newHeading.magneticHeading;
NSLog(@"%0.2f : %0.2f", newHeading.magneticHeading, xd);
[map setTransform:CGAffineTransformMakeRotation((-1 * xd * M_PI) /180)];}
Thanks for any help
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果之前的移动平均线和新的方向相差超过 180 度,则以较小者为准加上 360。然后在存储新的移动平均线时除以 360。所以(没有精确的数学):
我希望这能起作用,并且比平均角度中描述的三角方法更有效(归功于马克·兰塞姆(Mark Ransom)提到了这一点)。
If the previous moving average and the new heading are different by more than 180 degrees, add 360 to whichever is smaller. Then mod by 360 when storing the new moving average. So (without precise math):
My hope is that this works and is more efficient than the trigonometric method described in Averaging angles (credit to Mark Ransom for referring to that).
我只是想添加我的 d0n 发布的代码版本,并进行一些调整。
我的代码是 Arduino 的 C 代码,所以我没有使用任何库(例如,我在没有 abs 函数的情况下获得绝对值)...
这个线程对我非常有帮助。谢谢 D0n 和约翰...
I just wanted to add my version of the code that d0n posted with a few tweaks.
My code is C code for an Arduino so I have used no libraries (for example I get the absolute value without abs function)...
This thread was very helpful to me. Thank you D0n and John...
最后,这对我有用。
In the end, this is what worked for me.