- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
要在 Android 中从欧拉角(例如俯仰、滚转、方位角)中获取方向,需要执行以下操作:
float Ax = gravity[0];
float Ay = gravity[1];
float Az = gravity[2];
final float Ex = geomagnetic[0];
final float Ey = geomagnetic[1];
final float Ez = geomagnetic[2];
float Hx = Ey*Az - Ez*Ay;
float Hy = Ez*Ax - Ex*Az;
float Hz = Ex*Ay - Ey*Ax;
final float normH = (float)Math.sqrt(Hx*Hx + Hy*Hy + Hz*Hz);
if (normH < 0.1f) {
// device is close to free fall (or in space?), or close to
// magnetic north pole. Typical values are > 100.
return false;
}
final float invH = 1.0f / normH;
Hx *= invH;
Hy *= invH;
Hz *= invH;
final float invA = 1.0f / (float)Math.sqrt(Ax*Ax + Ay*Ay + Az*Az);
Ax *= invA;
Ay *= invA;
Az *= invA;
final float Mx = Ay*Hz - Az*Hy;
final float My = Az*Hx - Ax*Hz;
final float Mz = Ax*Hy - Ay*Hx;
if (R != null) {
if (R.length == 9) {
R[0] = Hx; R[1] = Hy; R[2] = Hz;
R[3] = Mx; R[4] = My; R[5] = Mz;
R[6] = Ax; R[7] = Ay; R[8] = Az;
} else if (R.length == 16) {
R[0] = Hx; R[1] = Hy; R[2] = Hz; R[3] = 0;
R[4] = Mx; R[5] = My; R[6] = Mz; R[7] = 0;
R[8] = Ax; R[9] = Ay; R[10] = Az; R[11] = 0;
R[12] = 0; R[13] = 0; R[14] = 0; R[15] = 1;
}
}
azimuth = (float)Math.atan2(R[1], R[4]);
pitch = (float)Math.asin(-R[7]);
roll = (float)Math.atan2(-R[6], R[8]);
最佳答案
让我试着解释一下:
getRotationMatrix 根据重力和磁矢量组成旋转矩阵。
我们的主要目标是构建 NED frame
我们假设重力指向地球的中心,而磁铁指向北极。但在实际情况下,这些向量是非垂直的,这就是为什么我们首先计算与 E 和 A 正交并属于切线平面的向量 H。 H 是叉积 (E x A),与 E 和 A 正交。
float Hx = Ey*Az - Ez*Ay;
float Hy = Ez*Ax - Ex*Az;
float Hz = Ex*Ay - Ey*Ax;
final float normH = (float)Math.sqrt(Hx*Hx + Hy*Hy + Hz*Hz);
final float invH = 1.0f / normH;
Hx *= invH;
Hy *= invH;
Hz *= invH;
final float invA = 1.0f / (float)Math.sqrt(Ax*Ax + Ay*Ay + Az*Az);
Ax *= invA;
Ay *= invA;
Az *= invA;
double Mx = Ay * Hz - Az * Hy;
double My = Az * Hx - Ax * Hz;
double Mz = Ax * Hy - Ay * Hx;
R[0] = Hx; R[1] = Hy; R[2] = Hz;
R[3] = Mx; R[4] = My; R[5] = Mz;
R[6] = Ax; R[7] = Ay; R[8] = Az;
azimuth = (float)Math.atan2(R[1], R[4]);
pitch = (float)Math.asin(-R[7]);
roll = (float)Math.atan2(-R[6], R[8]);
关于Android:SensorManager.getRotationMatrix 和 SensorManager.getOrientation() 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372847/
要在 Android 中从欧拉角(例如俯仰、滚转、方位角)中获取方向,需要执行以下操作: SensorManager.getRotationMatrix(float[] R, float[] I, f
API 演示 -> 图形 -> Compass 它只能正常工作,直到您不更改设备的自然方向。在大多数手机中是纵向的,而大多数 10 英寸平板电脑是横向的。如果您进行更改,则需要将其旋转 90 度。我希
我的线程上有此命令,但它不起作用:sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 我想在不打开我的应用程序的情况下创
我希望实现一个 SensorManager 类,它可以处理所有与传感器相关的事情,但这显然需要我启动一个新 Activity 。 我不打算这样做 - 只是运行计算。是使用服务处理此问题的最佳方式,您可
我正在为平板电脑开发一个应用程序,平板电脑将放在一个围绕给定点旋转的支架上。这意味着当应用程序首次打开时,很少从平板电脑移动。该应用程序将根据平板电脑在支架上的旋转显示各种内容。无论我多么努力地搜索,
在我的应用中,我使用光线和接近传感器来检测手机自掏腰包功能,然后在检测完成后注销 SensorManager。但是,即使应用程序的 CPU 使用率仅显示 1-2 秒,电池使用率始终显示我的应用程序为否
我的应用程序创建了一个 Service,它覆盖了 onStartCommand 以创建一个 SensorManager 并将一个 SensorEventListener 附加到其中一个传感器: pub
我需要检索手机的方向。目前我写了这个: public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType(
我正在为我的 Android 应用程序使用传感器。我用一行代码注册传感器: mySensorManager.registerListener(this, orientationSensor, Sens
我在以下的帮助下获得了我的手机方向 SensorManager.getOrientation 但是结果很不稳定,大概+-8度,有什么好的过滤结果的方法吗? 这是我获取值的方式: public void
我有一个为 Cordova 应用程序编写的 Android 后台服务,我想通过 sensorManager 与加速度计进行交互。 我觉得我已经很接近了,但我认为还不够。 出于某种原因,sensorMa
我在 logcat 中遇到传感器管理器和错误的问题。当我用这一行注册监听器时: sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(
我在资源中找到了这个值。 /** Standard gravity (g) on Earth. This value is equivalent to 1G */ public static
我一直在研究如何在我的 Android 应用程序中读取步数,并在文档中找到了两种完全不同的方法: Using SensorManager : val sensorManager = getSystem
我使用单例模式实现了一个简单的指南针类。一旦我向传感器管理器注册了加速度计和磁力计监听器,内存消耗就会增加。我的 GPS 类与指南针类非常相似,并且我没有出现内存泄漏问题。我在 onSensorCha
@Override protected void onResume(){ //super.onResume(); sensorManager.registerListener
Scala/Android 新手问题。我正在尝试将这个简单的代码从 Java 重写为 Scala。Java 工作代码: private final SensorEventListener mAccLi
我的源代码是: import android.content.Context; import android.hardware.SensorManager; public class ShakeEve
我在三星 S6 上使用心率传感器。为了访问此传感器,从 SDK 版本 > 23 开始,用户必须授予 BODY_SENSORS 权限 https://stackoverflow.com/a/326360
我使用 StackOverflow 的一些建议编写了一个加速度计应用程序(用于学习目的)。一切正常,但我在代码中收到“SensorManager.DATA_X 已弃用”消息作为警告: // setup
我是一名优秀的程序员,十分优秀!