В Котлине я работаю над программой, в которой пользователь перемещает свой телефон для управления виртуальной сетью бабочек. Информация о местоположении отправляется на 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