Подтвердить что ты не робот

Рассчитайте местоположение, полагаясь на небольшие движения, телефона Android, в Котлине, чтобы имитировать сеть бабочек

В Котлине я работаю над программой, в которой пользователь перемещает свой телефон для управления виртуальной сетью бабочек. Информация о местоположении отправляется на MQTT broker, и приложение UI получит данные.

Моя проблема точно показывает позицию. Если телефон является чистой частью улавливателя, то в идеале при перемещении телефона с помощью акселерометра я должен знать, в каком направлении вы двигаетесь, и можете отправлять эти данные.

Ницца в теории, сложнее на практике.

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

Я пытаюсь настроить на основе ориентации телефона в начале раздела.

Как точно отслеживать информацию о позициях?

override fun onSensorChanged(sensorEvent: SensorEvent?) {
    val mySensor = sensorEvent!!.sensor

     if (mySensor.type == Sensor.TYPE_ACCELEROMETER) {
        var mSensorZ: Float= 0F
        when (mDisplay?.getRotation()) {
            Surface.ROTATION_0 -> {
                mSensorZ = sensorEvent.values[2];
            }
            Surface.ROTATION_90 -> {
                mSensorZ = sensorEvent.values[2];
            }
            Surface.ROTATION_180 -> {
                mSensorZ = sensorEvent.values[2];
            }
            Surface.ROTATION_270 -> {
                mSensorZ = sensorEvent.values[2];
            }
        }
         val alpha = 0.8;

        var gravity = DoubleArray(3)
        var linear_acceleration = DoubleArray(3)
        // Isolate the force of gravity with the low-pass filter.
        gravity[2] = alpha * gravity[2] + (1 - alpha) * sensorEvent.values[2];

        // Remove the gravity contribution with the high-pass filter.
        linear_acceleration[2] = sensorEvent.values[2] - gravity[2];
        // Limit to 3 significant figures, rather than using BigDecimal
        val nz = (((mSensorZ - gravity[2]) * 1000).toInt() / 1000).toFloat()
        if(Math.abs(lz - nz) > 0.3) {
            Log.d(TAG, "Moved z " + (lz - nz))
            // This may be the wrong direction, don't care as long as it is roughly accurate on amount 
            val payload: String = if (lx1 - nz < 0) Operator.Right.toString() + (12 * (lz1 - nz)).toString() else Operator.Up.toString() + (12 * (lz1 - nz)).toString
            try {
                val encodedPayload = payload.toByteArray(Charset.defaultCharset())
                val message = MqttMessage(encodedPayload)
                val r = client?.publish(topic, message);
                Log.d(TAG, "**** mqtt: ${payload}")
            } catch (e: Exception) {
                e.printStackTrace();
            }

        }
        lz = nz
4b9b3361

Ответ 1

Я думаю, вы должны использовать Sensor.TYPE_LINEAR_ACCELERATION, который обрабатывает удаление гравитации. Это даст вам точные значения. Также попробуйте использовать любые единственные плагины, которые имеют сопоставления мирового значения, которые правильно отображают ваши расчетные значения.