2017-06-12 17 views
5

Giả sử một người đang sử dụng la bàn này và bắt đầu xoay 90 độ, chúng bắt đầu xoay theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Cách tốt nhất để đếm số lượng xoay 360 độ hoàn chỉnh là bao nhiêu? Giả sử họ sẽ quay hoặc chỉ theo chiều kim đồng hồ hoặc chỉ ngược chiều kim đồng hồ từ đầu đến cuối.La bàn - Theo dõi số quay 360 độ đầy đủ

Tôi tiếp tục đưa ra các giải pháp nếu ổ bắt đầu, 90 độ, tôi tiếp tục kiểm tra vòng bi tiếp theo khi dữ liệu cảm biến thay đổi và nếu nó di chuyển theo một hướng tôi biết chúng đang quay. Và nếu họ tiếp tục quay theo hướng đó và quay trở lại 90 độ, nó được tính là một vòng quay. Cách của tôi dường như rất phức tạp và không hiệu quả và tôi đang gặp khó khăn trong việc tìm ra một cách tốt hơn.

Trong trường hợp này, tôi mong đợi nhiều phép quay đầy đủ.

Tôi đánh giá cao bất kỳ trợ giúp nào. Cảm ơn bạn!

Tôi đã tìm thấy this câu trả lời có liên quan và tôi đang cố gắng tổng hợp mẫu mã cho điều đó. Nếu ai đó đã làm một cái gì đó tương tự, xin vui lòng gửi nó!

@Override 
public void onSensorChanged(SensorEvent event) 
{ 
    switch(event.sensor.getType()) 
    { 
     case Sensor.TYPE_GRAVITY: 
     { 
      mValuesAccelerometer = lowPass(event.values.clone(), mValuesAccelerometer); 
      break; 
     } 
     case Sensor.TYPE_MAGNETIC_FIELD: 
     { 
      mValuesMagneticField = lowPass(event.values.clone(), mValuesMagneticField); 
      break; 
     } 
    } 

    boolean success = SensorManager.getRotationMatrix(
      mMatrixR, 
      mMatrixI, 
      mValuesAccelerometer, 
      mValuesMagneticField); 

    if (success) 
    { 
     SensorManager.getOrientation(mMatrixR, mMatrixValues); 

     float azimuth = toDegrees(mMatrixValues[0]); 
     float pitch = toDegrees(mMatrixValues[1]); 
     float roll = toDegrees(mMatrixValues[2]); 

     if (azimuth < 0.0d) 
     { 
      //The bearing in degrees 
      azimuth += 360.0d; 
     } 
    } 
} 

Trả lời

1

Nếu bạn chắc chắn rằng họ sẽ được di chuyển trong chỉ có 1 hướng, để tối ưu hóa mã của bạn bạn có thể có điểm kiểm tra cho độ thay vì liên tục giám sát nếu họ vẫn đang di chuyển theo hướng đúng.

Dưới đây là một algo thô để làm điều đó

//You noted 90 degree as starting point 
// checkpoint 1 will be 180 keep it as a boolean 
// now you've reached 180 if the meter gets to 180 before going to next checkpoint 
// which is 270 then make 180 false. it means they turned back. 
// if they make it to 270 then wait for 0 degrees and do the same. 
// if they make it back to 90 like that. You got a rotation and hopefully 
// a bit of complexity is reduced as you're just checking for 4 checkpoints 

tôi không có bất kỳ mã tiện dụng vào lúc này.

0

Tạo 3 số nguyên

int rotationCount=0 
int currentDegrees=0 
int previousDegrees=89 

không phải là một lập trình viên java vì vậy tôi không biết làm thế nào bạn xử lý các sự kiện onSensorChanged nhưng về cơ bản thực hiện một kiểm tra trong vòng một vòng lặp while

while (currentDegrees + 90 < 360) 
{ 
    if (currentDegrees + 90 == 0) 
    { 
     if (previousDegrees == 359) 
     { 
      rotationCount = rotationCount + 1 
     } 
    } 
    else if (currentDegrees + 90 == 359) 
    { 
     if (previousDegrees == 0) 
     { 
      rotationCount = rotationCount - 1 
     } 
    } 
    previousDegrees = currentDegrees + 90 
} 

xin lỗi về cú pháp, điều này chỉ là một ví dụ về cách làm như vậy ..

0

Đây là vấn đề theo dõi với việc đọc mà tràn. Bạn cần theo dõi lần đọc cuối cùng và hy vọng người dùng không thực hiện quá nửa lượt đọc giữa mỗi lần đọc .... (vì định lý Nyquist)

Đây là mã giả cơ bản.

var totalChange = 0; 
var lastAzimuth = -1000; 

function CountTurns(az) 
{ 
    if (az > 180) az -= 360; // do this if your azimuth is always positive i.e. 0-360. 

    if (lastAzimuth == -1000) 
    { 
    lastAzimuth = az; 
    } 

    diff = az - lastAzimuth; 
    if (diff > 180) 
    diff -= 360; 
    if (diff < -180) 
    diff += 360; 

    lastAzimuth = az; 
    totalChange += diff; 
    return totalChange/360; 
} 
0

Trực quan hóa những gì tôi sẽ nói và bạn chắc chắn sẽ đạt được mục tiêu của bạn một cách nhanh chóng. Vì bạn không cần phải nghĩ đến 360 độ đầy đủ, nhưng bạn có thể lấy một nửa số đó và sử dụng các dấu hiệu khác biệt cho lợi thế của bạn.

Hãy nhìn vào con số này: 360 Rotation

Chúng tôi có một vòng tròn đó được chia cho hai bên (trái và phải).

Phía bên trái sẽ lấy 180 độ âm. (Phía tây).

Phía bên phải sẽ lấy 180 độ dương. (Phía đông).

Đặt giá trị hiện tại sẽ luôn bằng 0 (Bắc) và dương 180 là (Nam).

Nếu la bàn dương (nghĩa là đi đúng hướng)

Sau đó, thêm +1 trên mỗi lượt.

NẾU la bàn bị âm (nghĩa là đi theo hướng bên trái).

Sau đó trừ -1 trên mỗi lượt

NẾU la bàn nhấn OR là 0, thì vị trí hiện tại (NORTH).

NẾU la bàn nhấn OR là 90, thì đó là (Đông).

NẾU la bàn nhấn HOẶC là 180, thì đó là (Nam)

NẾU la bàn nhấn OR là -90, thì đó là (Tây). Điều này sẽ chỉ ra rằng bất cứ khi nào người đó đi Đông, bộ đếm sẽ thêm +1 cho đến khi nó đạt tới 180, thì nó sẽ thay đổi từ dương sang âm, sẽ trừ -1 trên mỗi lượt cho đến khi nó đạt đến 0. Điều đó sẽ là một vòng quay 360 độ đầy đủ.

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