2017-08-27 13 views
13

Trong Kotlin tôi đang làm việc trên một chương trình mà người dùng di chuyển điện thoại của họ để điều khiển một mạng lưới bướm ảo. Thông tin vị trí được gửi đến MQTT broker và ứng dụng Giao diện người dùng sẽ nhận dữ liệu.Tính toán vị trí, dựa trên các chuyển động nhỏ, của điện thoại Android, trong Kotlin, để mô phỏng một mạng bướm

Sự cố của tôi hiển thị chính xác vị trí. Nếu điện thoại là phần mạng của thiết bị thu, thì lý tưởng nhất là khi bạn di chuyển điện thoại, sử dụng gia tốc kế, tôi nên biết bạn đang di chuyển hướng nào và có thể gửi dữ liệu đó.

Tốt về lý thuyết, khó hơn trong thực tế.

Để cắt giảm mã, tôi chỉ muốn biết số lượng điện thoại di chuyển lên, nhận ra rằng nhiều nhất nó sẽ di chuyển hai hoặc ba feet, vì vậy nếu nó di chuyển sáu inch, tôi muốn nói với giao diện người dùng rằng di chuyển lên sáu inch.

Tôi đang cố gắng điều chỉnh dựa trên hướng của điện thoại, trong phần bắt đầu.

Làm cách nào để theo dõi chính xác thông tin vị trí?

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

Nhận ra rằng nếu người dùng di chuyển thiết bị từ từ, nó sẽ nằm trong các mức độ nhiễu của gia tốc kế. Bạn đã cân nhắc sử dụng ARCore chưa? Tìm thấy bài đăng thông tin này về ARKit: https://medium.com/super-ventures-blog/why-is-arkit-better-than-the-alternatives-af8871889d6a –

+0

Xin chào @MorrisonChang, thực ra tôi đang nghiêng về hướng đó, như Tôi nghĩ rằng những gì tôi đang cố gắng làm là không thể, hoặc là khó khăn. Tôi sẽ xem liệu tôi có thể đào tạo một mạng thần kinh để nhận ra vị trí bằng cách sử dụng một máy ảnh trên một quả mâm xôi pi. –

+0

Tôi nghĩ bạn nên xóa [tag: kotlin] vì tôi không nghĩ nó thực sự liên quan đến câu hỏi của bạn. Có, bạn đang sử dụng ngôn ngữ này, nhưng vấn đề của bạn không phải với Kotlin, bạn đang cố gắng tìm ra thuật toán đúng. Nếu bất cứ điều gì, [tag: Java] sẽ có liên quan hơn khi các thư viện Android là Java dựa trên nhiều người làm việc trong Java. – thecoshman

Trả lời

0

Tôi đoán bạn nên sử dụng Sensor.TYPE_LINEAR_ACCELERATION để xử lý việc loại bỏ trọng lực. Điều này sẽ cung cấp cho bạn giá trị chính xác. Ngoài ra, hãy thử sử dụng bất kỳ plugin thống nhất nào có ánh xạ giá trị thế giới, sẽ ánh xạ chính xác đến các giá trị được tính của bạn.

Các vấn đề liên quan