Java: умноженные значения в двойном массиве - PullRequest
0 голосов
/ 06 июля 2018

Я работаю над приложением для Android, которое будет записывать данные датчиков в базу данных SQLite.

Процедура выглядит следующим образом:

  1. Добавьте все значения от датчика к двойным массивам. Один двойной массив для каждого измерения, например, для акселерометра I имеет 3 двойных массива (один для значений x, один для значений y и один для значений z).
  2. Когда все значения находятся в двойных массивах, преобразуйте двойные массивы в строки.
  3. Поместить строки в соответствующие столбцы таблицы SQLite.

Я столкнулся с проблемой, когда умножил значения в каждом двойном массиве.

Вот фрагмент кода:

@Override
public void onSensorChanged(final SensorEvent sensorEvent) {

    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        //Getting and displaying accelerometer data
        x = sensorEvent.values[0];
        y = sensorEvent.values[1];
        z = sensorEvent.values[2];
    }

    if (sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
        //Getting and displaying gyroscope data
        x2 = sensorEvent.values[0];
        y2 = sensorEvent.values[1];
        z2 = sensorEvent.values[2];
    }

    if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        //Getting and displaying gyroscope data
        x3 = sensorEvent.values[0]; // x*sin(θ/2)
        y3 = sensorEvent.values[1]; // y*sin(θ/2)
        z3 = sensorEvent.values[2]; // z*sin(θ/2)
        cos3 = sensorEvent.values[3]; // cos(θ/2)
        accuracy3 = sensorEvent.values[4]; // estimated heading Accuracy (in radians) (-1 if unavailable)
    }

    //Start recording sensor data on click
    Button startButton = (Button) findViewById(R.id.buttonStart);
    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //Get label from EditText
            label = textLabel.getText().toString();

            statusText.setText("Wait");
            statusText.setTextColor(Color.RED);

            //Get current date and time
            currentTime = Calendar.getInstance().getTime();
            dateTime = currentTime.toString();

            flag = true; //flag set to true = record data
            samples = 0;
            startTime = System.currentTimeMillis();
        }
    });


    //Insert given number of sensor data samples into database
    if (samples < samples_total) {
        if (flag == true) {

            //Get current date and time
            currentTime = Calendar.getInstance().getTime();
            dateTime = currentTime.toString();

            //Add x,y,z values to arrays for sensors
            accDoubleArrayX[samples] = x;
            accDoubleArrayY[samples] = y;
            accDoubleArrayZ[samples] = z;

            gyroDoubleArrayX[samples] = x2;
            gyroDoubleArrayY[samples] = y2;
            gyroDoubleArrayZ[samples] = z2;

            rotationDoubleArrayX[samples] = x3;
            rotationDoubleArrayY[samples] = y3;
            rotationDoubleArrayZ[samples] = z3;
            rotationDoubleArrayCos[samples] = cos3;
            rotationDoubleArrayAccuracy[samples] = accuracy3;

            samples++;

        } else {
            //Log.d("", "samples < total but Flag is false - Data NOT inserted");
        }
    } else if (samples == samples_total) {
        durationTime = System.currentTimeMillis() - startTime;

        //Insert x,y,z values for sensors
        dbRef.insertData(dateTime, accDoubleArrayX, accDoubleArrayY, accDoubleArrayZ,
                gyroDoubleArrayX, gyroDoubleArrayY, gyroDoubleArrayZ,
                rotationDoubleArrayX, rotationDoubleArrayY, rotationDoubleArrayZ, rotationDoubleArrayCos, rotationDoubleArrayAccuracy,
                durationTime, label);

        Log.d("", "Data inserted!");
        Toast.makeText(this, "Data inserted!", Toast.LENGTH_LONG).show();

        //Stop recording when given number of samples inserted
        flag = false;
        samples++;

    } else {
        //Not in use
    }

}

А также метод insertData:

//Inserting data
public boolean insertData(String start_time,
                          double[] acc_x, double[] acc_y, double[] acc_z,
                          double[] gyro_x, double[] gyro_y, double[] gyro_z,
                          double[] rotation_x, double[] rotation_y, double[] rotation_z, double[] rotation_cos, double[] rotation_accuracy,
                          long duration_time, String label) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_REC_TIME, start_time);
    contentValues.put(COL_ACC_X, Arrays.toString(acc_x));
    contentValues.put(COL_ACC_Y, Arrays.toString(acc_y));
    contentValues.put(COL_ACC_Z, Arrays.toString(acc_z));
    contentValues.put(COL_GYRO_X, Arrays.toString(gyro_x));
    contentValues.put(COL_GYRO_Y, Arrays.toString(gyro_y));
    contentValues.put(COL_GYRO_Z, Arrays.toString(gyro_z));
    contentValues.put(COL_ROTATION_X, Arrays.toString(rotation_x));
    contentValues.put(COL_ROTATION_Y, Arrays.toString(rotation_y));
    contentValues.put(COL_ROTATION_Z, Arrays.toString(rotation_z));
    contentValues.put(COL_ROTATION_COS, Arrays.toString(rotation_cos));
    contentValues.put(COL_ROTATION_ACCURACY, Arrays.toString(rotation_accuracy));
    contentValues.put(COL_DURATION, String.valueOf(duration_time));
    contentValues.put(COL_LABEL, label);
    long result = db.insert(TABLE_NAME, null, contentValues);
    if (result == -1)
        return false;
    else
        return true;
}

Этот код работает почти так, как ожидалось, но дает мне умноженные значения. Например, значения в массивах выглядят так:

accDoubleArrayX: [2.013523578643799, 2.013523578643799, 2.013523578643799, 2.492363929748535, 2.492363929748535, 2.492363929748535, -7.771578788757324, -7.771578788757324, -7.771578788757324, 2.0913352966308594, 2.0913352966308594, 2.0913352966308594, 9.205705642700195, 9.205705642700195, 9.205705642700195, -2.649184226989746, -2.649184226989746, -2.649184226989746, 0.851138710975647, 0.851138710975647, 0.851138710975647, 1.4508862495422363, 1.4508862495422363, 1.4508862495422363, 3.1938650608062744, 3.1938650608062744, 3.1938650608062744, 1.7621324062347412, 1.7621324062347412, 1.7621324062347412, -5.260061264038086, -5.260061264038086]   
accDoubleArrayY: [5.456385612487793, 5.456385612487793, 5.456385612487793, 7.893682956695557, 7.893682956695557, 7.893682956695557, 3.6786909103393555, 3.6786909103393555, 3.6786909103393555, 2.8095955848693848, 2.8095955848693848, 2.8095955848693848, 6.449979305267334, 6.449979305267334, 6.449979305267334, 5.60602331161499, 5.60602331161499, 5.60602331161499, 5.076904773712158, 5.076904773712158, 5.076904773712158, -0.05985504388809204, -0.05985504388809204, -0.05985504388809204, 2.78086519241333, 2.78086519241333, 2.78086519241333, 6.861782073974609, 6.861782073974609, 6.861782073974609, 4.49870491027832, 4.49870491027832]    
accDoubleArrayZ: [18.986019134521484, 18.986019134521484, 18.986019134521484, 0.5770025849342346, 0.5770025849342346, 0.5770025849342346, 6.994660377502441, 6.994660377502441, 6.994660377502441, 13.217190742492676, 13.217190742492676, 13.217190742492676, 2.6240451335906982, 2.6240451335906982, 2.6240451335906982, -9.330204010009766, -9.330204010009766, -9.330204010009766, 9.876082420349121, 9.876082420349121, 9.876082420349121, 13.722367286682129, 13.722367286682129, 13.722367286682129, 4.235342979431152, 4.235342979431152, 4.235342979431152, -10.040084838867188, -10.040084838867188, -10.040084838867188, -1.8638859987258911, -1.8638859987258911]   

gyroDoubleArrayX: [-0.575242817401886, 0.14913702011108398, 0.14913702011108398, 0.14913702011108398, 2.141181468963623, 2.141181468963623, 2.141181468963623, -4.218447208404541, -4.218447208404541, -4.218447208404541, -0.030892670154571533, -0.030892670154571533, -0.030892670154571533, 5.554288864135742, 5.554288864135742, 5.554288864135742, -2.211488962173462, -2.211488962173462, -2.211488962173462, -5.499960422515869, -5.499960422515869, -5.499960422515869, -1.3646037578582764, -1.3646037578582764, -1.3646037578582764, 7.179882526397705, 7.179882526397705, 7.179882526397705, 1.353951096534729, 1.353951096534729, 1.353951096534729, -5.861084938049316]   
gyroDoubleArrayY: [-0.4165183901786804, -1.6266587972640991, -1.6266587972640991, -1.6266587972640991, -1.0279802083969116, -1.0279802083969116, -1.0279802083969116, 3.4663705825805664, 3.4663705825805664, 3.4663705825805664, -7.069095134735107, -7.069095134735107, -7.069095134735107, 0.3334277868270874, 0.3334277868270874, 0.3334277868270874, 2.221076488494873, 2.221076488494873, 2.221076488494873, -0.21944448351860046, -0.21944448351860046, -0.21944448351860046, -3.3257555961608887, -3.3257555961608887, -3.3257555961608887, 0.04580637067556381, 0.04580637067556381, 0.04580637067556381, 0.3419498801231384, 0.3419498801231384, 0.3419498801231384, 1.2857742309570312]  
gyroDoubleArrayZ: [0.0649811327457428, -0.18002969026565552, -0.18002969026565552, -0.18002969026565552, 0.2865561246871948, 0.2865561246871948, 0.2865561246871948, -0.7233145833015442, -0.7233145833015442, -0.7233145833015442, -0.6796387434005737, -0.6796387434005737, -0.6796387434005737, -1.1739214658737183, -1.1739214658737183, -1.1739214658737183, -3.5452001094818115, -3.5452001094818115, -3.5452001094818115, -0.014913702383637428, -0.014913702383637428, -0.014913702383637428, -0.6348975896835327, -0.6348975896835327, -0.6348975896835327, -0.9310411214828491, -0.9310411214828491, -0.9310411214828491, -2.379800796508789, -2.379800796508789, -2.379800796508789, -0.6317018270492554]    

rotationDoubleArrayX: [0.2823379933834076, 0.2823379933834076, 0.26849400997161865, 0.26849400997161865, 0.26849400997161865, 0.2820430099964142, 0.2820430099964142, 0.2820430099964142, 0.35002198815345764, 0.35002198815345764, 0.35002198815345764, 0.20867300033569336, 0.20867300033569336, 0.20867300033569336, 0.2366899996995926, 0.2366899996995926, 0.2366899996995926, 0.39944401383399963, 0.39944401383399963, 0.39944401383399963, 0.3354569971561432, 0.3354569971561432, 0.3354569971561432, 0.17095300555229187, 0.17095300555229187, 0.17095300555229187, 0.1272200047969818, 0.1272200047969818, 0.1272200047969818, 0.34220200777053833, 0.34220200777053833, 0.34220200777053833]    
rotationDoubleArrayY: [0.10564299672842026, 0.10564299672842026, 0.08853700011968613, 0.08853700011968613, 0.08853700011968613, 0.04211900010704994, 0.04211900010704994, 0.04211900010704994, 0.01869099959731102, 0.01869099959731102, 0.01869099959731102, 0.1025020033121109, 0.1025020033121109, 0.1025020033121109, -0.10204900056123734, -0.10204900056123734, -0.10204900056123734, -0.06824100017547607, -0.06824100017547607, -0.06824100017547607, 0.03044299967586994, 0.03044299967586994, 0.03044299967586994, 0.026799000799655914, 0.026799000799655914, 0.026799000799655914, -0.07169300317764282, -0.07169300317764282, -0.07169300317764282, -0.07498300075531006, -0.07498300075531006, -0.07498300075531006]  
rotationDoubleArrayZ: [0.19162000715732574, 0.19162000715732574, 0.18857499957084656, 0.18857499957084656, 0.18857499957084656, 0.16563500463962555, 0.16563500463962555, 0.16563500463962555, 0.15753500163555145, 0.15753500163555145, 0.15753500163555145, 0.16617600619792938, 0.16617600619792938, 0.16617600619792938, 0.0989999994635582, 0.0989999994635582, 0.0989999994635582, 0.0755779966711998, 0.0755779966711998, 0.0755779966711998, -0.011357000097632408, -0.011357000097632408, -0.011357000097632408, -0.0029909999575465918, -0.0029909999575465918, -0.0029909999575465918, -0.039792999625205994, -0.039792999625205994, -0.039792999625205994, -0.05465399846434593, -0.05465399846434593, -0.05465399846434593]    
rotationDoubleArrayCos: [0.9340260028839111, 0.9340260028839111, 0.9404839873313904, 0.9404839873313904, 0.9404839873313904, 0.94405597448349, 0.94405597448349, 0.94405597448349, 0.9232100248336792, 0.9232100248336792, 0.9232100248336792, 0.9582970142364502, 0.9582970142364502, 0.9582970142364502, 0.9611250162124634, 0.9611250162124634, 0.9611250162124634, 0.911083996295929, 0.911083996295929, 0.911083996295929, 0.9414939880371094, 0.9414939880371094, 0.9414939880371094, 0.9849100112915039, 0.9849100112915039, 0.9849100112915039, 0.9884790182113647, 0.9884790182113647, 0.9884790182113647, 0.9350330233573914, 0.9350330233573914, 0.9350330233573914] 
rotationDoubleArrayAccuracy: [246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0, 246.0]   

Как видите, первые 3 значения акселерометра одинаковы, следующие 3 одинаковы и т. Д. Для гироскопа: первое значение уникально, затем три одинаковы, следующие 3 одинаковы и т. Д. Для вектора вращения: первые два одинаковы, затем следующие три одинаковы, затем следующие 3 и т. Д.

Для меня это кажется действительно странным, и я не могу найти решение этой проблемы.

Не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 06 июля 2018

Это происходит потому, что каждый раз при получении события датчика вы заполняете массивы для ВСЕХ 3 типов событий, а не заполняете массивы только для одного типа события (типа, для которого было получено событие).

Чтобы избежать этого, вам нужно сохранить три отдельных счетчика для каждого типа события.

Кроме того, насколько я понял, вы хотите вставить свои выборочные массивы в БД, когда все они будут полностью заполнены. Следовательно, вам также нужно изменить ваше условие для вставки БД.

Следовательно, подпрограмма заполнения должна быть изменена следующим образом:

if (samples_acc < samples_total || samples_gyro < samples_total || samples_rotation < samples_total) 
                {
                            if (flag == true) 
                            {

                                //Get current date and time
                                currentTime = Calendar.getInstance().getTime();
                                dateTime = currentTime.toString();

                                //Add x,y,z values to arrays for sensors

                                if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER && samples_acc < samples_total) 
                                {
                                accDoubleArrayX[samples_acc] = x;
                                accDoubleArrayY[samples_acc] = y;
                                accDoubleArrayZ[samples_acc] = z;

                                samples_acc++;
                                }

                                if (sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE && samples_gyro < samples_total) 
                                {
                                gyroDoubleArrayX[samples_gyro] = x2;
                                gyroDoubleArrayY[samples_gyro] = y2;
                                gyroDoubleArrayZ[samples_gyro] = z2;

                                samples_gyro++;
                                }

                                if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR && samples_rotation < samples_total) 
                                {
                                rotationDoubleArrayX[samples_rotation] = x3;
                                rotationDoubleArrayY[samples_rotation] = y3;
                                rotationDoubleArrayZ[samples_rotation] = z3;
                                rotationDoubleArrayCos[samples_rotation] = cos3;
                                rotationDoubleArrayAccuracy[samples_rotation] = accuracy3;

                                samples_rotation++;
                                }

                            }//end if flag=true
                            else 
                            {
                            //Log.d("", "samples < total but Flag is false - Data NOT inserted");
                            }
            }//end if at least one of arrays is not filled yet

            //all arrays have been filled   
            else 
            {
                durationTime = System.currentTimeMillis() - startTime;

                //Insert x,y,z values for sensors
                dbRef.insertData(dateTime, accDoubleArrayX, accDoubleArrayY, accDoubleArrayZ,
                        gyroDoubleArrayX, gyroDoubleArrayY, gyroDoubleArrayZ,
                        rotationDoubleArrayX, rotationDoubleArrayY, rotationDoubleArrayZ, rotationDoubleArrayCos, rotationDoubleArrayAccuracy,
                        durationTime, label);

                Log.d("", "Data inserted!");
                Toast.makeText(this, "Data inserted!", Toast.LENGTH_LONG).show();

                //Stop recording when given number of samples inserted
                flag = false;
            }

Да, и еще одно примечание о вашей кнопке: вам лучше убрать ее из вашего onSensorChanged метода, потому что не имеет смысла переопределять ее каждый раз, когда получено новое событие

...