проблема с повторными значениями датчика при записи в CSV-файл - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть приложение для Android, которое получает данные от датчика ускорения и датчика вектора вращения с частотой 100 Гц. Он также получает местоположение от GPS каждую 1 секунду. Приложение делает некоторые расчеты на собранные данные по таймеру каждые 10 мс. и сохраняет результаты в CSV-файле и загружает файл в базу данных каждые 3 минуты.

Проблема заключается в том, что в результирующем csv-файле имеется много последовательных повторяющихся значений, даже если прослушиватель местоположения выполняется в отдельном потоке, а прослушиватель датчиков работает в отдельном потоке, а запись в файл и загрузка в Firebase выполняются асинхронно .

Версия приложения для iOS написана с использованием swift примерно с той же процедурой, но не имеет этой проблемы.

mSensorThread = new HandlerThread("Sensor thread", Thread.MAX_PRIORITY);
mSensorThread.start();
Handler mSensorHandler = new Handler(mSensorThread.getLooper());

mSensorManager.registerListener(this, mAccelerometer, 10000,9000,mSensorHandler);
mSensorManager.registerListener(this, mRotationVector, 10000,9000, mSensorHandler);
mLocationThread = new HandlerThread("Location thread", Thread.MAX_PRIORITY);
mLocationThread.start();
Looper looper = mLocationThread.getLooper();

LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient, mLocationRequest, this, looper).addStatusListener(new PendingResult.StatusListener() {
    @Override
    public void onComplete(Status status) {
        startRecording();
    }
});
t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // some calculations on sensors data.
    }
}, 0, period);
private void writeToCsvFileAndFirebase(final String data, final Date lastDate) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            // write the file and upload to firebase every 3 minuets.
            // this function is called from the scheduled timer.
        }
    });
    thread.start();
}

1 Ответ

0 голосов
/ 15 апреля 2019

Каждое 10ms звучит проблематично, хотя эта часть даже отсутствует; Я даже не понимаю, почему 10ms, когда значения меняются только каждые 100ms. Если вы открываете / пишете / закрываете файл там, это обречено на неудачу; хранение значений в оперативной памяти и иногда сбрасывание их в файл может потребовать меньших затрат на обработку.

Я имею в виду, просто учтите время обработки и асинхронную операцию, которая может привести к тому, что итерации будут мешать друг другу. понижение интервала может стоить попытки - или лучше использовать Семафор , чтобы предотвратить возможное состояние гонки, независимо от интервала; что CSV является общим ресурсом.

Java всегда будет работать немного медленнее, чем C++. Можно использовать JNI .

...