- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
过去几天我一直在开发一个小型指南针应用程序,并且已经启动并运行了代码,但似乎指南针读数不准确。校准两部手机后,我的第一次测试发现这一点是因为我只是将手机靠在平面上看读数,然后将其水平翻转并将其放在同一个平面上(转 180* 圈),结果确实如此不改变 180* 它更接近 240*。
然后我测试了与指南针的读数,有时读数似乎很接近,但在其他点上却相差超过 50*。我什至试着把我的手机和指南针放在地板上,让指南针远离任何磁干扰,结果相同(注意我也将指南针和手机分开,通过与书的边缘对齐来保持它们在同一方向) .
然后我将示例应用程序放在另一部手机上(第一个是 nexus S,第二个是 Motorola droid 1)。两部手机之间的差异范围从在某些点相等,但在大多数点之间相差 50 到 15 度。
我浏览了文档,也浏览了许多不同的论坛帖子,但没有看到任何人有相同的结果。我的代码中可能有一些小错误导致我的读数不正确,或者我没有看到一些记录的错误。
任何见解或建议将不胜感激!
这是我的 SensorEventListener 类中的传感器更改代码
public void onSensorChanged(SensorEvent event)
{
// If the sensor data is unreliable return
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
{
Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show();
}
// Gets the value of the sensor that has been changed
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
m_vfgravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
m_vfgeomag = event.values.clone();
break;
}
if (m_vfgravity != null && m_vfgeomag != null)
{
if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag))
{
SensorManager.getOrientation(m_vfinR, m_vforientVals);
m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2;
//convert to 0-360 from -180-180
if(m_fCompBearing < 0.0)
{
m_fCompBearing = 360 + m_fCompBearing;
}
mCompHead.setText("" + (int)m_fCompBearing);
}
calcOffset();
rotateCmp();
}
}
mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSListener = new cSensorListener();
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_UI);
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
最佳答案
尽管作者回答了他自己的问题,但我必须在这里加一句,以强调 Android 平台上任何类型的指南针功能几乎完全无用。
我得出的结论是,任何依赖 Android 指南针应用程序的人都在自找麻烦,它们都不能可靠地工作,这不是开发人员的错。
谷歌和制造商根本没有提供一种方法来从这些设备中获得可靠的准确性,甚至没有提供一种方法来确定准确性是否可靠,这甚至更糟,因为有时它们是可靠的,很多时候它们不是,并且是否有人信任这些设备进行真正的定向运动上帝帮助他们。
作者可能认为他获得更好结果的原因是他们在已弃用的方向传感器上使用了相当不错的噪声过滤器(为什么他们不能在较新的方法上这样做超出了我的理解),并且在校准后在单个设备上进行了有限的测试。这似乎可行,但在使用许多设备的现场中,我发现在大多数情况下,可靠性始终存在问题。
首先,磁性和方向传感器产生的噪音是可怕的,是的,这可以通过适当的 DSP 技术来克服,并且使用 2.3 和陀螺仪的手机总体上会变得更好,但是对于 Google 和 Mfg 浪费这么多开发人员时间感到羞耻硬件和软件输出的劣质实现。
其次,我已经测试了至少 18 部具有适当 DSP 过滤的手机,虽然这可以清除噪音,但对准确性没有帮助,即使是相同型号的手机也有不同的输出(尽管有些型号似乎比其他型号更好)
第三,您几乎无法确定传感器是否已校准,即使进行痉挛的数字 8 运动也可能会或可能不会校准手机,并且用户永远不会真正知道它是否在工作,除非您有指南针来验证,有点失败不是吗?
注意:您可以将磁传感器彼此相乘和求和,然后取该 sqrt(x*x+y*y+z*z) 的平方根,并确保它在 25 到 65 左右之间,这是您的一个指标可以用来检测异常场,但它并不完全可靠,我猜总比没有好。
第四,许多手机完全不可靠,无论是否经过校准,这不仅限于型号类型,还可能是制造商的质量问题,我真的不知道为什么,但我可以说 3 台 HTC ARIA 产生了截然不同的结果(一个 30 度,另一个 50 度,第三个几乎点)同样的事情,令人难以置信,联系等。
我测试了 18 部手机,如果您可以正确校准,其中许多手机都非常接近准确,但其中许多手机需要 2-10 次尝试(我们在每次校准尝试后都使用高精度罗盘进行了验证),而且多次他们根本无法校准根本。
注意:您确实必须考虑到真正的北偏移量的偏角,如果您可以访问当前的 GPS 坐标、高度、时间等,您可以使用 android 中的 API 来完成。问题不是偏角,如果您是与指南针相比,无论如何这都不是问题,因为它也会受到局部磁场的影响。
Fith,冷启动总是需要在我们测试的每部手机上进行校准步骤,其中包括 X、不可思议的 Aria、Nexus 和 Thunderbolt。换句话说,当您第一次开始传感器监听时,95% 的时间都需要校准步骤(即使坏了的时钟每天也正确两次),因此如果您坚持添加此功能,我只会告诉您的用户在每个监听器事件的开始。
如果您让传感器保持运行(对电池不利),那么您可能需要或可能不需要根据遇到的字段重新校准)上述方法适用于此。
最重要的是,当它们工作时,它们看起来很酷,但您目前永远无法确定方位角的准确性,这使得它们对于任何实际工作都非常不可靠且毫无用处。
就我个人而言,我会在移动时使用 GPS 轴承,然后如果可能的话,使用旋转矢量方法,它可能并不完美,但它会比您在当前手机系列中的方位角实现方式要好得多。
很抱歉冗长的回复,但我已经浪费了将近一个月的时间来尝试在专业 DSP 工程师的帮助下使其工作,而且我们已经写了很多关于 android 平台在这方面很有用的文章。
在我看来,“有时这行得通,有时行不通,除非您有真正的指南针,否则您永远无法确定”免责声明应该放在每个指南针应用程序中。
关于android指南针似乎不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6256256/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!