我正在使用Sensortag cc2541作为通过蓝牙连接到 NEXUX 5 的传感器。所以下面的代码没有典型的onSensorChanged
,因为它没有使用手机本身的传感器。相反,它使用 sensortag cc2541 的方法。
我想做一个简单的指南针,做了一些研究,得出了以下结论。
根据我在互联网上阅读的内容,方位角应该是指南针的方向(围绕 Z)。但是,我没有得到正确的阅读。
我还附上了显示传感器方向accelerometer
和方向的图片。magnetometer
加速度计方向
磁力计方向
代码
public class ManagerListener extends SensorTagLoggerListener implements SensorTagListener {
private float[] gravityData = new float[3];
private float[] geomagneticData = new float[3];
private double azimuth,pitch,roll;
@Override
public void onUpdateAccelerometer(SensorTagManager mgr, Point3D acc) {
super.onUpdateAccelerometer(mgr, acc);
gravityData[0] = (float)acc.x;
gravityData[1] = (float)acc.y;
gravityData[2] = (float)acc.z;
}
@Override
public void onUpdateMagnetometer(SensorTagManager mgr, Point3D b) {
super.onUpdateMagnetometer(mgr, b);
geomagneticData[0] = (float) -b.y;
geomagneticData[1] = (float) b.x;
geomagneticData[2] = (float) -b.z;
float I[] = new float[9];
float R[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, gravityData, geomagneticData);
if (success)
{
float orientationMatrix[] = new float[3];
SensorManager.getOrientation(R, orientationMatrix);
azimuth = Math.toDegrees(orientationMatrix[0]);
pitch = Math.toDegrees(orientationMatrix[1]);
roll = Math.toDegrees(orientationMatrix[2]);
}
final float rotation = (float) azimuth;
final String xyz = "Azimuth:\t" + String.valueOf(Math.round(azimuth)) +
"\nPitch:\t" + String.valueOf(Math.round(pitch)) +
"\nRoll:\t" + String.valueOf(Math.round(roll));
runOnUiThread(new Runnable() {
@Override
public void run() {
degree.setText(xyz);
pointer.setRotation(rotation);
}
});
}
}
函数onUpdateAccelerometer
和onUpdateMagnetometer
是传感器标签库的覆盖。那不是问题。它是什么里面的问题。
此外,磁力计和加速度计每 100 毫秒获取一次值。
我正在尝试做一个简单的指南针。我的应用程序和普通指南针之间的唯一区别是我必须使用 SensorTag 及其库。我已经放了代码。有诸如 onUpdateAccelerometer 等方法......这些方法是不言自明的。Point3D 具有 x,y,z 作为字段。度数和指针只是要显示的文本和要旋转的指南针图像。请看一下我在互联网上找到的这个简单而简短的应用程序https://www.sendspace.com/file/62ubk7我想要与此类似的东西,但使用我的 sensorTag 库。我已经完成了到目前为止所做的工作,并且做了很多研究。如果有人能帮我找出我的错误在哪里,我很乐意给他们赏金。