利用智能手机(Android)追踪一块磁铁(一)
之前看到一个外国人用iPhone做了一个追踪磁铁的Demo感觉不错(参考视频:http://v.youku.com/v_show/id_XODM2MjczNzE2.html),然后我就参考做了一个Android上的,视频如下http://v.youku.com/v_show/id_XODQ3MDgzMTUy.html(这个视频并非最终的效果)。下面是算法的介绍,希望有兴趣的朋友可以参考或者提出意见。
1:原理介绍:
现在基本上每一款智能手机都配有磁感应计,所以只要利用磁感应计记录当前手机位置的磁场强度,然后就可以根据磁场强度计算出磁铁的位置进行追踪。因此追踪磁铁就是找出磁场强度和位置的关系。
2:磁场强度公式:
因为磁场强度的分布和磁铁的形状等各种因素有关,为了便于计算一般把一块磁铁等价看作为一个"磁偶极子",当手机和磁铁的距离远大于磁铁本身时才可以这么等价。我的理解 "磁偶极子"就是一段电流围绕着一个"轴"做不停地旋转,然后产生的磁场(不知对不对有知道的可以给出意见,但是不理解并不影响最终的效果)。而"磁偶极子"的磁场强度和位置的关系是已经知道的,如下图:图1是磁场强度和位置的关系公式(感兴趣的可以查看推导:http://www.physicsinsights.org/dipole_field_1.html,或者查阅各种论文)。其中
为磁场强度,
为对应的空间位置,
为磁偶极矩矢量方向为z轴向上,表示磁铁的北极朝上,是磁铁的属性针对每一块磁铁为常数。
是常数(具体什么忘了,不影响最终结果)。图2位磁铁和位置的空间关系图。

图1

图2
根据上述的矢量关系可以得出以下的公式,如图3,图4:图4的公式是从图3变换过来的。其中
,
为对应的
与z轴正方向的夹角。

图3

图4
3:解方程:
知道了位置和磁场强度的关系,下面就是根据公式解出向量
对应的x,y,z的值。首先根据图4中的公式,利用
和
表示
和
,然后消去
得到
的值(具体方法可以自行推导,需要注意换元后是一个关于
的一元二次方程有两个解,又因为
是距离大于0,所以只需要取一个正值)。接出来
的值如图5,其中
。

图5
根据
和图4的公式可以得出
的值(这里假设
,一下会说明为什么),然后根据
和
的值可以得出z值,再根据图3的公式可以得出x,y的值。所以最终的结果如图6。其中
为常数,
。根据这个公式就可以计算出磁铁相对于手机(传感器)的位置。

图6
4:补充说明:
如图7,由于磁铁的磁感应线是轴对称和中心对称的所以A和B两个点的磁感应强度是一样的,即磁感应的方向和大小均相同。所以根据磁感应强度计算的位置应该是两个即A和B的坐标,但是我们只需要一个坐标,所以将设
即可。
假如手机(传感器)只在x轴的正方区域,那么根据磁感应线的方向可以判断
的大小。比如,如果Bx大于0表示
,Bx小于0表示
。从而可以判断
的正负从而得到准确的坐标。

图7
如图7中的C点在x-y平面上表明C点的磁场强度为(0,0,Bz),即xy轴上的磁场强度均为0。这是从z轴的上方向下看,可以看到图8的情形,叉号磁感应线向下插入。在图8中x-y平面圆上的所有点的磁场强度均相同即为(0,0,Bz),所以磁场强度(0,0,Bz)对应着无数个坐标点,因此在平面x-y上是没办法利用上述公式的!!!。

图8
5:结论:
按理说依照上述公式就可以定位磁铁的位置了,但是代码阶段还是遇到了一些问题。在下篇博客中将说明遇到的问题和解决办法。有兴趣和问题的可以给出意见。
利用智能手机(Android)追踪一块磁铁(一)的更多相关文章
- 利用智能手机(Android)追踪一块磁铁(转)
利用智能手机(Android)追踪一块磁铁(一) 利用智能手机(Android)追踪一块磁铁(二) 利用智能手机(Android)追踪一块磁铁(三)
- 利用智能手机(Android)追踪一块磁铁(二)
在上一篇博客中提到了利用磁场强度推算传感器位置坐标的公式,下面就介绍怎么利用智能手机完成磁铁的追踪(任何具有磁感应器的装置均可以),这里主要是利用Android手机. 1:程序步骤: 首先将磁铁放置在 ...
- 利用智能手机(Android)追踪一块磁铁(三)
更新磁铁追踪算法的源代码,Android Studio项目工程 github地址:https://github.com/amazingyyc/MagnetLocate 说明:将磁铁的位置信息封装成消息 ...
- 如何利用php+android+新浪sae服务器做一个app下载应用
功能简介:提供一个app下载的平台,类似于appstore,上面有很多app可供下载 实现基本思路:利用android,在手机桌面建立一个图标,点击该图标不是打开app应用,而是跳转到一个web页面, ...
- 利用神器BTrace 追踪线上 Spring Boot应用运行时信息
概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值.外部调用情况 以及 函数执行时间等信息以便定位问题.传 ...
- 利用SQL Profiler 追踪数据库操作
SQL Server 事件探查器 是一个界面,用于创建和管理跟踪并分析和重播跟踪结果. 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分析或用它来重播一系列特定的步骤. SQL S ...
- Uber能知道你是不是在开车的时候玩手机
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- TaintDroid:智能手机监控实时隐私信息流跟踪系统(一)
1.1 摘要 现今,智能手机操作系统不能有效的提供给用户足够的控制权并且很清楚的了解到第三方的应用程序是如何使用其的隐私数据.我们使用了TaintDroid来阐明这个缺点,其是一个高效的,全系 ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
随机推荐
- map循环遍历删除
typedef map<string,int> MapFileList; int main() { MapFileList m_SingleList; m_SingleList.inser ...
- Java 内存区域和GC机制-java概念理解
推荐几篇关于java内存介绍的文章 Java 内存区域和GC机制 http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html ...
- Hadoop 1、在虚拟机上进行 HDFS 安装
一.准备条件 1.四台Linux虚拟机(1台NameNode节点,1台Secondary节点(Secondary和其中1台DataNode共用),外加2台DataNode) 2.下载Hadoop版本, ...
- Quartz定时调度CronTrigger时间配置格式说明与实例
1. CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...
- MySQL精粹
关于Mysql整理的需要记忆和熟练掌握的内容 1.查询数据表的信息(比如有多少行数据): show table status like 'tab_User' -- 数据表中的数量 2. 使用 ex ...
- Understanding Abstractions of Secure Channels 的研读
- Android万能分辨率适应法
(1)获取屏幕的尺寸 WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); D ...
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类
前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...
- 虚拟现实,增强现实,VR,AR
现在的热点不止VR,还有AR和披着MR.HR.CR外衣的各种高级AR们,所以比较着一起说.以下知乎上一网友观点,放几条结论:1.近期(未来两三年)看,VR能火,AR尚待成熟: 2.VR设备中,插片式是 ...
- (转)android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码 ...