在上一篇博客中提到了利用磁场强度推算传感器位置坐标的公式,下面就介绍怎么利用智能手机完成磁铁的追踪(任何具有磁感应器的装置均可以),这里主要是利用Android手机。

1:程序步骤:

  1. 首先将磁铁放置在远离手机的位置,然后拿着手机在空中做"倒8"字运动(就是这个运动轨迹:)。这样做的目的就是标准化手机的磁感应器,因为磁感应装置很容易受到磁场的干扰变得不精准。
  2. 将手机放置平稳,然后记录当前的磁场强度,作为"原始磁场"(这个磁场必须精准可以取多次的平均值)。Android开发中需要用到SensorEventListener类。
  3. 然后将磁体放在距离手机20cm左右的距离,且磁铁位置在手机所在的水平线之上。之所以这么做是因为磁场强度和距离的k次幂成反比,如果太近会影响手机的磁感应器,太远磁场衰减的又太快。位于手机所在的水平线之上,是因为之前说过在xy平面上,上一篇所推的公式是不可用的。
  4. 记录当前的磁场作为"中心磁场", "中心磁场"减去"原始磁场"就是磁体在手机的磁感应器位置产生的磁场强度。然后根据上一篇的公式就可以计算一个"中心位置"。
  5. 移动磁铁,根据磁场的变化就可以实时的减去原始磁场,然后计算出磁感应器相对于磁铁的位置。然后减去"中心位置"就是得到了一个"相对于中心位置"的"移动"。
  6. 如图1:r1和r2的矢量位置可以通过上一篇的公式计算出来,然后r3=r1-r2就是磁铁相对于中心的移动位置,知道这个值就可以追踪磁铁的相对移动位置。

图1

2:磁场强度值的平滑滤波:

上述方法利用android进行编码后发现效果很差,主要是因为利用磁感应器得到的磁场值是不平滑的,磁场值无时无刻不在波动。造成了磁铁在定位时位置也在波动。如图2就是原始的未经过平滑过的磁场值,可以看到磁场的波动很大。图中的三个线就是磁场在xyz三个轴上产生的磁场值。

图2

因此需要对磁场值进行平滑滤波,我用的办法是卡尔曼滤波算法,有兴趣的可以去查一下资料,这里不做详细的介绍。主要介绍一下我针对本算法对卡尔曼算法做的一些改变。图3是卡尔曼的5个方程(图片中的-2应该改成-1),图4是针对方程的说明。因为这里磁场值为xyz三个轴上的分量为一维的值,所以用不到矩阵的计算,所以上述公式化简后是比较简单的(参考:http://blog.chinaunix.net/uid-26694208-id-3184442.html)。

图3

图4

这里需要针对Q和R两个参数进行说明,Q:说是噪声协方差矩阵,我理解就是Q的大小决定了最优值是更接近于测量值还是估计值。R:为过程噪声协方差,我理解就是再不做任何处理的情况下测量磁场值,然后根据测量值计算方差就是R,可以通过实验得到R的值。

而Q的值这需要进行判断,假设,K值就决定了Q的大小。当Q越大(k越大)时卡尔曼中的最优值就越接近于测量值,而Q越小(k越小)卡尔曼中的最优值就越接近于先验估计值。通俗的讲就是Q越大平滑的效果就越不好,而平滑后的值就越"跟随"(所谓的"跟随"就是原始测量值进行快速变化时,经过平滑过的值也很好的跟着变化)。而Q越小平滑的效果就越好,而平滑后的值越"不跟随"。

举个例子,假设测量的三个值为[0,1.0,0],如果Q值很大那么平滑后的效果为[0,0.8,0]。而如果Q值很小平滑后的值为[0,0.1,0]。

所以必须找一个好的Q值做出"平滑"和"跟随"之间的平衡,在试验过程中我把k值设为-4结果平滑的效果不错,可以很好的定位磁铁的位置(第一篇博客中的演示视频中的k值就是-4)。之前说过演示视频不是最终的结果,然后我对Q值得计算做了一下设想:既然又要做到"平滑"又要做到"跟随",那么就可以根据磁场值的变化动态的确定Q的值。即当磁场变化越大时就增加Q的值使之"跟随",当磁场变化越小时就减小Q的值使之更加"平滑"。假设在卡尔曼滤波中,当前的测量值为,上一状态的最优值为。而两者之差的绝对值为,然后假设和k为的函数

接下来就是确定函数,根据设想越大k就应该越大,而越小k越小。那么首先想到的就是线性函数(a,b为未知数)。得出的实验效果如图5(黑色线为原始磁场,绿色为平滑后的磁场),可以看到这种方法确实可以做到即"平滑"又"跟随"。但是仔细观察图片你会发现当磁场剧烈变化到平稳的过程中,"绿色"线总是不能很快的回到平稳状态(不能很快的接近黑色线)。

图5

因为是平均映射,所以为了解决不能很快平稳的问题,需要一个"非平均映射"。即当变小时需要k值变小的速度要远大于,因此想到非平均映射函数log。因此假设(计算a和b的值可以找两个点带入计算,比如当为0.1时k=-7,为3.0时k=-1,然后计算a和b。这两个参数就可以很好的做到"平滑"和"跟随")。然后得到实验结果如图6(黑色为原始磁场,蓝色谁平均映射,红色为非平均映射):可以看出红色线的效果明显好于蓝色线。[注:上述关于卡尔曼滤波均是本人的理解,并不能保证理论上也正确。而实验结果还不错。如果有人有更好的方法或者意见请务必和我联系E-mail:1219186770@qq.com]

图6

3:注意事项:

上面的介绍就是编程需要的知识,我是在android进行实验的,在其他设备上也应该没问题。下面介绍一下需要注意的地方。

  1. 实验前拿着手机"画"倒8字,为了标准化磁感应器。不然不标准的吃感应器没办法进行精确测量。
  2. 保证磁铁在手机的上面和侧面,因为之前介绍过在xy平面上述的公式是不成立的。
  3. 磁铁不要距离太远和太近,太远无法检测磁场,太近会影响磁感应器。

现在关于利用智能手机(Android)追踪磁铁的内容全部介绍完了,如果有人有问题,想法,兴趣等可以联系我。

利用智能手机(Android)追踪一块磁铁(二)的更多相关文章

  1. 利用智能手机(Android)追踪一块磁铁(转)

    利用智能手机(Android)追踪一块磁铁(一) 利用智能手机(Android)追踪一块磁铁(二) 利用智能手机(Android)追踪一块磁铁(三)

  2. 利用智能手机(Android)追踪一块磁铁(一)

    之前看到一个外国人用iPhone做了一个追踪磁铁的Demo感觉不错(参考视频:http://v.youku.com/v_show/id_XODM2MjczNzE2.html),然后我就参考做了一个An ...

  3. 利用智能手机(Android)追踪一块磁铁(三)

    更新磁铁追踪算法的源代码,Android Studio项目工程 github地址:https://github.com/amazingyyc/MagnetLocate 说明:将磁铁的位置信息封装成消息 ...

  4. Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法

    Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...

  5. Android VLC播放器二次开发2——CPU类型检查+界面初始化

    上一篇讲了VLC整个程序的模块划分和界面主要使用的技术,今天分析一下VLC程序初始化过程,主要是初始化界面.加载解码库的操作.今天主要分析一下org.videolan.vlc.gui.MainActi ...

  6. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...

  7. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  8. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  9. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

随机推荐

  1. Codeforces Round #322 (Div. 2) —— F. Zublicanes and Mumocrates

    It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...

  2. membership source code

    You can find their source code in codeplex at the ASP.NET source code. ExtendedMembershipProvider: h ...

  3. [置顶] ProDinner体验

    最近研究了MVC的经典案例ProDinner. 下载地址是:http://prodinner.codeplex.com/ 部署完毕后,看看效果怎么样: Meals的多选功能非常不错: Meal界面格外 ...

  4. RegexOptions.Compiled性能

    原文:http://www.cnblogs.com/me-sa/archive/2010/05/19/Is-RegexOptions-Compiled-a-Killer.html "使用正则 ...

  5. work staff

    培训一周,很抓狂.不是抓狂培训本身,是自己听不懂,培训还是有用的. 上周四接到一个task,关于checklist.因为组里没有人用过,所以遇到一些问题,本来不应该是一个复杂的工作,但是我需要一个一个 ...

  6. tips[Android]

    View:2D graphics,SurfaceView:3D graphics. ProgressBar进度渐进动画,可以使用ObjectAnimator实现.动画相关的类: android.vie ...

  7. 《第一行代码》学习笔记10-活动Activity(8)

    1.除了onRestart()方法,其他都是两两相对的.三种生存期: (1)完整生存期:onCreate()~onDestroy().一般情况下,一个活动会在onCreate()中完成各种初始化操作, ...

  8. ios开发必备第三方库

    引言 作为iOS开发人员,在开发App的过程中怎么会不使用第三方库呢?相信没有App是不使用第三方库的! 网络库 网络库,这是开发必备,除非你的App玩单机.现在特别火也特别好用的网络库就数AFNet ...

  9. 使用Flex 和 Red5开发简单视频直播功能

    Flex 是一个高效.免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash Player和Adobe AIR, 可以实现跨浏览器.桌面和操作系统.虽然只能使用 ...

  10. CODEVS 3279 奶牛的健美操

    3279 奶牛健美操 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的 ...