Как я могу рассчитать курс (N / W / S / E) с учетом (x, y, z) данных магнитометра и акселерометра?

Вероятно, из-за этой ошибки или любой из многих подобных ошибок в базе данных ошибок Java:

http://bugs.sun.com/view_bug.do?bug_id=4523159

Причина в том, что «! /» в jar-URL интерпретируется как разделитель между именем файла JAR и курсором в самом JAR-файле. Если имя каталога заканчивается на!, Последовательность символов «! /» В конце каталога неверно интерпретируется. В вашем случае вы фактически пытаетесь получить доступ к ресурсу со следующим URL:

jar: file: /// d: / test1231 @ # !!! /test.jar! / Images / Logo. png

Ошибка была открыта почти 12 лет и вряд ли будет исправлена. На самом деле я не знаю, как это можно исправить, не нарушая других вещей. Проблема заключается в конструктивном решении использовать! как символ со специальным значением (разделитель) в схеме URL-адресов для файлов JAR:

jar:!/

Поскольку восклицательный знак является допустимым символом в URL-адресах, это может происходить как в URL-адресе JAR-файла сам, а также на пути в JAR-файле, что делает невозможным в некоторых случаях найти фактический разделитель «! /».

1
задан TIMEX 7 March 2019 в 00:16
поделиться

1 ответ

Фон

Магнитометр измеряет магнитное поле Земли. Эта информация сочетается с ускорителем внутри телефона. Ускоритель получает информацию о положении телефона в пространстве. Он способен точно определять положение телефона с помощью твердотельных датчиков внутри телефона, которые могут измерять их наклон и движение. Информация, предоставляемая этими устройствами, означает, что приложение компаса может отображать основные направления независимо от ориентации телефона, согласно компании Sensor Platforms, занимающейся разработкой алгоритмического программного обеспечения.

Аналогичный проект: compass-реагировать-native-non-expo по лицензии MIT , чтобы использовать только встроенный в магнитометр датчик устройства, чтобы определить направление и рассчитать степень угла, используя Пакет реагирует на нативные датчики, использует 3 точки данных из магнитометра:

subscribe = async () => {
    new Magnetometer({
      updateInterval: 100
    })
    .then(magnetometerObservable => {
      this._subscription = magnetometerObservable;
      this._subscription.subscribe(sensorData => {
        console.log(sensorData);
        this.setState({magnetometer: this._angle(sensorData)});
      });
    })
    .catch(error => {
      console.log("The sensor is not available");
    });
  };

  _unsubscribe = () => {
    this._subscription && this._subscription.stop();
    this._subscription = null;
  };

  _angle = (magnetometer) => {
    if (magnetometer) {
      let {x, y, z} = magnetometer;

      if (Math.atan2(y, x) >= 0) {
        angle = Math.atan2(y, x) * (180 / Math.PI);
      }
      else {
        angle = (Math.atan2(y, x) + 2 * Math.PI) * (180 / Math.PI);
      }
    }

    return Math.round(angle);
  };

  _direction = (degree) => {
    if (degree >= 22.5 && degree < 67.5) {
      return 'NE';
    }
    else if (degree >= 67.5 && degree < 112.5) {
      return 'E';
    }
    else if (degree >= 112.5 && degree < 157.5) {
      return 'SE';
    }
    else if (degree >= 157.5 && degree < 202.5) {
      return 'S';
    }
    else if (degree >= 202.5 && degree < 247.5) {
      return 'SW';
    }
    else if (degree >= 247.5 && degree < 292.5) {
      return 'W';
    }
    else if (degree >= 292.5 && degree < 337.5) {
      return 'NW';
    }
    else {
      return 'N';
    }
  };

  // Match the device top with pointer 0° degree. (By default 0° starts from the right of the device.)
  _degree = (magnetometer) => {
    return magnetometer - 90 >= 0 ? magnetometer - 90 : magnetometer + 271;
};

Другой проект : реагирует на нативный датчик и использует 6 точек данных из и магнитометра и акселерометра для расчета ориентации:

 float[] mGravity;
float[] mGeomagnetic;

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
  Sensor mySensor = sensorEvent.sensor;
  WritableMap map = mArguments.createMap();

  if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER)
    mGravity = sensorEvent.values;
  if (mySensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
    mGeomagnetic = sensorEvent.values;
  if (mGravity != null && mGeomagnetic != null) {
    float R[] = new float[9];
    float I[] = new float[9];
    boolean success = mSensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
    if (success) {
      long curTime = System.currentTimeMillis();
      float orientation[] = new float[3];
      mSensorManager.getOrientation(R, orientation);

      float heading = (float)((Math.toDegrees(orientation[0])) % 360.0f);
      float pitch = (float)((Math.toDegrees(orientation[1])) % 360.0f);
      float roll = (float)((Math.toDegrees(orientation[2])) % 360.0f);

      if (heading < 0) {
        heading = 360 - (0 - heading);
      }

      if (pitch < 0) {
        pitch = 360 - (0 - pitch);
      }

      if (roll < 0) {
        roll = 360 - (0 - roll);
      }

      map.putDouble("azimuth", heading);
      map.putDouble("pitch", pitch);
      map.putDouble("roll", roll);
      sendEvent("Orientation", map);
      lastUpdate = curTime;
    }
  }
}

Есть других тоже .

0
ответ дан TiyebM 7 March 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: