2017-08-27 35 views
13

在Kotlin,我正在研究一个用户移动手机来控制虚拟蝴蝶网的程序。位置信息被发送到MQTT broker,UI应用程序将获取数据。计算Kotlin的Android手机的位置,以模拟蝶形网

我的问题是准确地显示位置。如果手机是捕手的网络部分,那么理想情况下,当您移动手机时,使用加速计我应该知道您正在移动哪个方向,并且可以发送该数据。

理论上很好,在实践中更难。为了减少代码,我只想知道手机上移了多少,意识到它至多会移动两三英尺,所以如果移动六英寸,我想告诉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 
+0

认识到如果用户缓慢移动设备,它将在加速度计的噪声容限水平内。你有没有考虑过使用ARCore?找到这个关于ARKit的内容丰富的帖子:https://medium.com/super-ventures-blog/why-is-arkit-better-than-the-alternatives-af8871889d6a –

+0

嗨@MorrisonChang,其实我倾向于这样,作为我认为我想要做的事是不可能的,或者很难。我将看看我是否可以通过在树莓派上使用相机来训练神经网络来识别位置。 –

+0

我认为你应该删除[tag:kotlin],因为我不认为它与你的问题真正相关。是的,你正在使用这种语言,但是你的问题不在Kotlin中,你正试图找到正确的算法。如果有的话,[标签:Java]会更加相关,因为Android库是基于Java的更多人使用Java的。 – thecoshman

回答

0

我想你应该使用Sensor.TYPE_LINEAR_ACCELERATION来处理消除重力。这会给你准确的价值。也可以尝试使用具有世界值映射的任何统一插件,这些插件将正确映射到您的计算值。