2017-08-27 69 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來處理消除重力。這會給你準確的價值。也可以嘗試使用具有世界值映射的任何統一插件,這些插件將正確映射到您的計算值。