Android сенсорный тег азимута для компаса не работает (код Java)
Я использую Sensortag cc2541 в качестве датчика, подключенного к NEXUX 5 через Bluetooth. Таким образом, приведенный ниже код не имеет типичного 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. Я положил то, что я сделал до сих пор, и я сделал много исследований. Если кто-то может помочь мне найти, где моя ошибка, я бы с удовольствием дал им награды.