Articles of android sensors

Android Compass可以补偿Tilt和Pitch

我正在尝试在我的Android手机(Nexus 4)上制作应用程序,该手机将用于模型船。 我添加了低通滤波器来滤除传感器的gitter。 但是,当手机背面平放时,指南针才稳定。 如果我把它向上倾斜,(例如转动一个嘘声的页面),那么指南针标题就会消失 – 多达50 *。 我使用Sensor.TYPE_GRAVITY和Sensor.TYPE_ACCELEROMETER对Sensor.TYPE_MAGNETIC_FIELD进行了尝试,效果相同。 我已经使用了这里提到的解决方案以及许多其他地方。 我的数学不是很好,但这必定是一个常见的问题,我发现没有一个API可以解决这个问题令人沮丧。 我已经在这个问题上工作了3天并且仍然没有find任何解决方案,但是当我使用Catch的Compass时 ,无论手机倾斜多少,它们都能保持稳定。 所以我知道这一定是可能的。 我想要做的就是创建一个指南针,如果手机指向北方,那么指南针会向北读,而当手机通过任何其他轴(滚动或俯仰)时,指南针不会跳转。 在我不得不放弃我的项目之前,任何人都可以请求帮助。 谢谢,亚当

Android中的旋转矢量传感器和方向传感器之间的概念差异是什么?

Android提供旋转矢量传感器和方向传感器。 我知道它们会返回不同的数据,因为对于矢量传感器,我们有角度的误差,在方向传感器中我们有角度。 但是概念上的区别是什么? 我从文档中无法理解。 哪一个提供了三维空间中设备的方向? 我很困惑!

Android中“重力”和“加速度”传感器有什么区别?

Android中的重力和加速度传感器有什么区别? 从我的观点来看,两种情况下的物理价值都是相同的。 哪一个测量作用于设备内部单位质量的力? 加成 问题是:这些传感器测量的物理量是多少? 根据等效原理 ,加速度和重力是难以区分的,并且测量两者的唯一方法是通常(但是3d)弹簧平衡。

Android 4.3:BLE:startLeScan()的过滤行为

我正在开发一个蓝牙传感器设备,我需要对其进行一对多的数据广播。 根据规范,外设可能只有一个主机,由于我设计的芯片和堆栈的限制,主机只能有三个从机。 据我所知,Android无论如何都不能成为BLE奴隶,因此将我的设备作为主人不是一种选择。 BT4规范和制造商文档都讨论了另一种操作模式,称为广播模式。 在广播模式中,永远不会建立连接,并且应用数据作为广告包的一部分被发送。 这完全符合我的需求,因为许多Android / iOS手机可以同时扫描每个数据包。 广告数据包以突发方式多次传输,因此我怀疑数据接收最可靠。 如果数据包在此处丢失,则可以容忍。 这有趣的是,我希望这些数据包携带实时传感器数据,以10-20Hz的速率更新。 从我在网上find的例子来看,这种模式下的BLE主要用于“iBeacon”types的实现,它们在那里广播静态数据。 我找不到有关如何在Android堆栈中过滤广告数据包的任何信息。 它可能是每个蓝牙硬件地址返回一个结果,或者它可能是地址和数据的唯一组合。 第二个选项适用于此应用程序。 如果启动和停止扫描重置filter,我也可以做一些工作。 Android文档没有提及扫描方法中的设备过滤如何工作。 我已经能够在网上find一个试图解决同样问题的post,它有一个未解决的响应: BLE:在扫描过程中多次发现同一个外设 。 在iOS中,我的同事通知我,有一个参数可以传递给扫描function,使其成为可能。 我试图从Android源代码中的startLeScan()调用回溯代码,但代码非常复杂,并且使用抽象使得很难识别包含它的对象的实现。 我得到的最远的是从BluetoothManagerService类方法getBluetoothGatt()返回的IBluetoothGatt对象。 该对象接收开始扫描的请求。 它正在github上的当前版本上的BluetoothManagerService.java的第790行进行实例化。 该对象是从消息的结果转换而来的,所以我怀疑结果可能是电话/驱动程序特定的。 能够进一步追踪它是我的专业知识。 我想解决的另一个问题是可以快速打开和关闭扫描。 扫描是一项功耗密集型操作,但数据广播将在相当精确的实时计时器上定期发生。 因此,如果可以打开和关闭扫描,这将是一个很好的优化,使得广播和扫描同步,扫描仪关闭其他90%以上的时间。 这可能需要通过实验进行测试。 我还在进行可行性研究,看看我们的Android配件是否可行。 我目前的手机还没有运行4.3版,所以我无法通过实验测试/黑客攻击。

使用线性加速度计算距离android

可能重复: Android加速计精度(惯性导航) 我正在使用下面的代码来计算距离。 tnew和tnew是分别包含时间戳和加速度的 tnew 。 double distance=0; double init_vel=0; long time_prev=tnew.next(); while(anew.hasNext()) { float temp_acc=anew.next(); long temp_time=tnew.next(); interval=(temp_time-time_prev)/1000f; //milliseconds to seconds double fin_vel=init_vel+(temp_acc*interval); distance+=(init_vel*interval)+0.5f*temp_acc*interval*interval; init_vel=fin_vel; time_prev=temp_time; } 代码中是否有逻辑错误? 因为我得到的值比实际长度要小得多。 LogCat输出: ——— beginning of /dev/log/system ——— beginning of /dev/log/main V/PhonetapeActivity( 8842): Sensor Listener Registered V/PhonetapeActivity( 8842): Sensor Unregistered V/PhonetapeActivity( 8842): No. of Iterations : 49 […]

用Android手机在空气中

我正在研究一个应用程序,用Android手机在空中画。 当我的手机正在移动,感谢加速度计,我检索每个轴上的加速度ax,ay,az。 我感兴趣的是:x,y,z。 从我在论坛和一些教程中读到的内容来看,两次加速都会带来巨大的错误。 那么,获取关于手机取代信息的最佳解决scheme是什么? 谢谢你的帮助。

线性加速度方向跟踪手机的上下移动

我试图跟踪设备的运动只在垂直方向上,即向上和向下移动。 这应该与设备的方向无关。 事情,我已经知道或尝试过这些 线性加速度由传感器TYPE_LINEAR_ACCELERATION给出,轴是电话轴,因此跟踪任何特定的轴没有什么区别。 我尝试应用旋转vector的转置或反转(对于旋转vector的反转或转置相同),然后尝试跟踪线性加速度vector的z方向。 似乎没有帮助。 我正在尝试使用重力值(TYPE_GRAVITY)来获得点积,以获得加速的方向,但似乎很容易出错。 即使当我快速移动我的设备,它说下降。 我将在这里概述这个方法 dotProduct = vectorA[0]*vectorB[0]+vectorA[1]*vectorB[1] + vectorA[2]*vectorB[2]; cosineVal = dotProduct/(|vectorA|*|vectorB|) if(cosineVal > 0 ) down else Up. 这个方法有什么缺点? 请帮忙,我一直在这一段时间卡住了。

在Android上实现JKalman

关于从加速度计数据,其他传感器的数据,计算时空状态,以及在Android和其他设备中使用卡尔曼滤波器,有许多问题。 显然,这样做的最简单的方法是在Android上实现JKalman滤波器,例如用于汽车的稳定移动设备。 但是看看JKalman代码包中的示例实现,它并不多说,实际上和其他的Kalman实现有很大不同。 他们像这样实例化一个卡尔曼类: JKalman kalman = new JKalman(4, 2); 根据定义在哪里 public JKalman(int dynam_params, int measure_params) throws Exception { this(dynam_params, measure_params, 0); } dynam_params是“测量向量维度的数量”,而measure_params是“状态向量维度的数量” 。 Android中读取的传感器数据应该如何映射到这些? 以下是来自加速度计的数据,每500ms采样一次。 在其他听众有陀螺仪和指南针的数据。 我应该如何转换这些数据以input到卡尔曼? @Override public void onSensorChanged(SensorEvent event) { actualTime = System.currentTimeMillis(); if(actualTime – lastUpdateAcc < 500) return; else{ lastUpdateAcc = actualTime; //update myPosition TextView tv = (TextView)findViewById(R.id.textView3); tv.setText(String.format("X: […]

使用Androidaudio和方向传感器的机械安全破解

我正在编写一个应用程序,通过安全操作来帮助锁匠,主要是通过创build他们需要的图表。 当试图通过操纵进入安全区时,需要对“轮组”进行详细分析,并通过绘制“围栏”在“门”上的相对深度来完成。 如果所有的门都排列在包装上,围栏杆将落入凸轮门,锁将打开。 如果有人对更详细的解释感兴趣,你可以在这里findMatt Blaze的一个很棒的对待(从3.3开始):www.crypto.com/papers/safelocks.pdf 制作图表很重要,而且真正需要的是精确测量表盘上的两个位置,并logging两个声音之间的拨号距离。 所以说,“落入”点在10到15之间,可能发生在11.5和14.5的声音事件,或者下一次可能发生在12和15之间。数字,在图表上查找数字,缩小数字,也可能只是图表上的最低点。 我正在通过我的Android耳机插孔使用一个老式的收音机电话听筒(吸盘式麦克风)来收听声音事件。 为了在发生事件的表盘上精确测量,我简单的用魔术贴将手机挂在表盘上,并使用SensorManager根据手机从audio尖峰事件旋转到峰值的距离来计算声音之间的距离-事件。 这很好,但我想这样做,而不需要把手机挂在拨号盘上。 一些公司曾经通过networking摄像头来观察拨号盘本身,但是这样做似乎远不如安装手机那么准确,因为我可以使用小数的旋转angular度来获得更高的精度。 一旦你进入放置位置,你总是会打一个声音,然后将拨号盘备份到下一个声音,所以我想我可以简单地听声音事件,然后一旦拨盘反转方向测量到下一个声音事件,但是这将要求拨号盘不断移动,这在现实生活中不会发生。 而且我想我可以通过使用dynamic像素或舵机来为锁匠移动表盘,但是这不是一个好的解决scheme。 所以我的问题是,如果你们中的任何一个聪明的人都可以想象的方式,这些相关的速度(声音事件之间的距离和拨号位置的变化)可以量化,而无需将电话挂在拨号?

S-View盖板检测

我想写一个三星S-View封面的应用程序。 要了解封面是否closures,我想使用封面上的磁铁而不是光线传感器。 我用自己的Android磁性API试了一下自己: SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE); Sensor s = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); manager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL); tv.setText(event.values[2]); 但我不知道如何解释数字。 当然,我也尝试了X轴和Y轴。 他们取决于我如何握住我的手机的轴,如果我的手机后面或前面有翻盖,没有太大的区别。 你有什么想法,我怎么能找出盖子是否在我的手机前面使用磁性传感器? 我必须使用未校准的传感器还是我做了其他的错误?