在Kotlin中计算Android手机的位置,依赖于小运动,以模拟蝴蝶网。

13
在Kotlin中,我正在开发一个程序,用户通过移动手机来控制虚拟蝴蝶网。位置信息将被发送到MQTT代理服务器,UI应用程序将获取数据。
我的问题是如何准确显示位置。如果手机是捕手的一部分,那么理想情况下,当您移动手机时,使用加速度计,我应该知道您移动的方向,并可以发送该数据。
理论上很好,但实践起来更难。
为了简化代码,我只想知道手机移动了多少,意识到最多只会上下移动两三英尺,因此如果它移动了六英寸,我想告诉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

请注意,如果用户缓慢移动设备,则加速度计的噪声边界水平将会受到影响。您是否考虑过使用ARCore?在此发现了一篇有关ARKit的信息文章:https://medium.com/super-ventures-blog/why-is-arkit-better-than-the-alternatives-af8871889d6a - Morrison Chang
嗨@MorrisonChang,实际上我正在倾向于这种方式,因为我认为我试图做的事情是不可能的,或者很难。我将尝试使用树莓派上的摄像头训练神经网络来识别位置。 - James Black
我认为你应该删除[tag:kotlin],因为我认为它与你的问题并不相关。是的,你正在使用这种语言,但你的问题不在于Kotlin,而是在于你想找到正确的算法。如果有什么的话,[tag:Java]会更相关,因为Android库是基于Java的,有更多的人在使用Java。 - thecoshman
1个回答

0

我想你应该使用Sensor.TYPE_LINEAR_ACCELERATION,它可以除去重力影响并给出准确的数值。另外,尝试使用任何具有世界值映射功能的Unity插件,这将正确地映射到你计算出的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接