2013-01-07 13 views
5

Tôi đã đoạn mã sau đây mà dường như được làm việc tốt:Android GPS Tọa độ rải rác

// GPS Reader 
    // Criteria 
    Criteria criteria = new Criteria(); 
    //criteria.setAccuracy(Criteria.ACCURACY_COARSE); // Used when we can't get a GPS Fix 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Used when we can get a GPS Fix 

    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 

    LocationListener locationListener = new MyLocationListener(); 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 0, 0, 
      locationListener); 

Tuy nhiên, khi tôi vẽ đồ thị dữ liệu tôi đã thu thập được trên Google maps, tọa độ GPS rất rải rác trong một số trường hợp, hoặc nó sẽ được đi dọc theo một con đường tôi đi bộ chỉ tìm thấy và sau đó tất cả các bước đột ngột đến một điểm một dặm và sau đó trở lại. Có cách nào để sửa lỗi này không? Một số loại kiểm tra độ chính xác tôi đoán?

Cập nhật:

Về cơ bản vấn đề của tôi trông như thế này là một ví dụ - GPS Jitter

Cập nhật 2:

tôi coi không làm cho một tiền thưởng nhưng tôi figured tôi có thể cũng có được một sự hiểu biết đầy đủ về những gì đang xảy ra ở đây, và xem có lẽ cách tiếp cận của tôi là hơn giết. Tôi vẫn còn có cùng một vấn đề mà tọa độ của tôi có jitter trong họ mặc dù thực tế là tôi có độ chính xác của 3m, vv Bây giờ điều này có thể là vệ tinh có sẵn, vv Tôi không biết, nhưng về cơ bản tôi đang cố gắng để hiểu làm thế nào là tất cả các ứng dụng khác, đặc biệt là các ứng dụng tập thể dục, có thể nhận được các bài đọc trơn tru như vậy trong cùng hoàn cảnh.

Tôi đã ở trên Quora và có thể tìm thấy điều này Does any running app have a feature of filtering GPS data to get more accurate tracking? Thật không may là nó không cung cấp thông tin chi tiết về vấn đề của tôi, ngoại trừ bạn có thể sử dụng bộ lọc Kalman nếu muốn, nhưng chắc chắn phải có ít phương tiện phức tạp hơn nghi ngờ hầu hết các ứng dụng hiện có đang thực hiện điều này.

Dù sao nếu một nhà phát triển đồng nghiệp muốn chia sẻ những gì họ đang làm với một số mã giả sẽ được đánh giá cao. Ý tôi là nếu tôi bị mắc kẹt với Kalman, nhưng tôi chắc chắn phải có các thuật toán thực hiện dễ dàng hơn, và hy vọng sẽ học được những thuật toán đó và cách thực hiện chúng, điều đó phù hợp.

Bối cảnh: Đây là ứng dụng dành cho người đi bộ trên thiết bị di động.

liên quan SO Câu hỏi Tôi đã cố gắng để thu thập thông tin từ Create a smooth curve from a series of GPS coordinates Smooth gps data: Đây là một khởi đầu tốt, mặc dù tôi không chắc chắn những gì giả tôi sẽ cần phải thực hiện để có được đúng Least squares Fit để làm việc một cách thích hợp để rằng tôi sẽ có một dữ liệu GPS splines mà sau đó tôi có thể xem trên một cái gì đó như bản đồ google để xác nhận tôi đã làm nó một cách chính xác. Tôi nghĩ vấn đề là nếu đây là dữ liệu chung của X và Y mà tôi đã xử lý và không phải là tọa độ của GEO, tôi có thể viết một thứ gì đó trong bài kiểm tra MATLAB và tiếp tục.

Cập nhật 3

Một hình ảnh của messed up dữ liệu GPS Tôi recieving https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

https://gist.github.com/4505688

+2

Yêu cầu về quyền lực và độ chính xác của bạn dường như mâu thuẫn với nhau. Nhà cung cấp duy nhất cung cấp cho bạn kết quả với ACCURACY_FINE là LocationManager.GPS_PROVIDER. Tại sao bạn không sử dụng nó trực tiếp thay vì tạo một số loại tiêu chí như thế này: locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, MyLocationListener)? –

+2

Ngoài ra, nó có thể bị phân tán vì thiết bị không ở dưới bầu trời mở/các lý do khác dẫn đến việc tiếp nhận khắc phục bị trì hoãn. –

+0

Được rồi tôi sẽ trở lại với điều đó - vì ban đầu tôi đã thiết lập nhưng nghĩ rằng Tiêu chí sẽ làm tốt hơn và thử lại vào ngày mai. Trên ghi chú của bầu trời mở - Tôi đang ở trong một khu vực bầu trời mở, khi chạy thử nghiệm - nhưng khi tôi chạy một chương trình như mapmywalk không có tán xạ. – eWizardII

Trả lời

4

gì bạn đang nhận được là bởi vì tiêu chí của bạn xác định cung cấp dịch vụ tốt nhất như NETWORK_PROVIDER. Không xác định vị trí của bạn mà thay vào đó cung cấp cho bạn vị trí của tháp di động có phạm vi bao phủ thiết bị của bạn. Khi bạn ở bên ngoài bất kỳ tòa nhà nào thì tốt hơn là sử dụng GPS_PROVIDER để có được độ chính xác cao của vị trí địa lý.Tại sao bạn có được phối hợp phân tán là bởi vì thiết bị của bạn đến phạm vi của một tháp di động khác do đó vị trí nhảy xảy ra. Trực tiếp sử dụng GPS_PROVIDER là giải pháp tốt nhất mà bạn từng nhận được.

+0

Tôi nên thêm rằng nhờ lời khuyên từ Nitin tôi đã thực hiện bằng cách sử dụng GPS chỉ như sau : // Trình đọc GPS Vị tríListListListener = new MyLocationListener(); LocationManager lm = (LocationManager) getSystemService (Context.LOCATION_SERVICE); lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, locationListener); Nhưng vấn đề vẫn còn hiện diện. – eWizardII

+0

Cảm ơn bạn đã có cái nhìn sâu sắc, tiếc là không phải trên đầu trang của các câu hỏi SO của tôi do thi, nhưng về cơ bản đã lấy một số gợi ý từ điều này, http://stackoverflow.com/questions/6181704/good-way-of-getting-the- người dùng-vị trí-trong-android, và tôi cẩn thận nghiên cứu một chương trình khác implementationhttps: //github.com/marcfasel/LocationMapper. Tôi tin rằng vấn đề là vì tôi đã sử dụng một số lớp khác để xử lý trình quản lý vị trí, tôi đã triển khai lại nó mà không cần lớp này theo cách họ làm và mọi thứ dường như hoạt động tốt. Bây giờ cần phải tối ưu hóa tuổi thọ pin. Cảm ơn các bạn! :) – eWizardII

+0

Cảm ơn rất nhiều. Lời giải thích đơn giản và tuyệt vời. Đã khắc phục sự cố ngay lập tức của tôi. tôi đã bắt đầu nghĩ về việc lọc lại dữ liệu đến với Kalman và blahblahblah và cuối cùng, chỉ là vấn đề lựa chọn nhà cung cấp dữ liệu vị trí. Tuyệt quá! – cedbeu

2

Kiểm tra this bài viết về Reto Meier (bao gồm mã). Nó sẽ cung cấp cho bạn rất nhiều thông tin để suy nghĩ. Bạn nên đặt ít nhất các thông số khoảng cách và thời gian tối thiểu.

lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 5000, 20, 
     locationListener); 

Ngoài ra, bạn có thể kết hợp một số nhà cung cấp để có tọa độ tốt nhất hiện tại. Chúc may mắn!

+0

Tôi sẽ thử lại thiết lập tiêu chí và xem điều gì mang lại. – eWizardII

+0

Tôi đã thực hiện lời khuyên của bạn và tôi vẫn chạy vào vấn đề phân tán GPS - xem hình ảnh sau - https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png đường dẫn màu xanh là đường dẫn thực - nhưng màu đỏ là những gì Đã đăng nhập GPS. – eWizardII

+0

Và độ chính xác của tọa độ này là gì? Bạn có thể vẽ bản đồ om không? Bạn có thể gửi cho tôi skype nếu bạn muốn và tôi nghĩ tôi sẽ giúp bạn trong tình huống này. – Evos

5

Bản thân dữ liệu GPS dễ bị lỗi. Ngay cả khi bạn có tất cả các thiết lập LocationManager một cách chính xác (và có vẻ như bạn làm), bạn sẽ thấy jitter không thường xuyên tại các địa điểm.

Độ chính xác

Một điều cần lưu ý là độ chính xác GPS chỉ mang đến cho bạn một ước tính đến như thế nào tốt các tính toán đã được trao GPS tín hiệu nhận được. Lỗi hệ thống có thể cung cấp cho bạn một số chính xác tốt (< 10m) nhưng vẫn đại diện cho một lỗi vị trí lớn. Đây là lý do tại sao bạn sẽ thấy jitter ngay cả khi độ chính xác của bạn là rất tốt. Các biện pháp chính xác là tốt để loại bỏ các lỗi rất lớn (> 100m) nhưng ở mức thấp hơn nó chỉ cho bạn một dấu hiệu cho thấy các phép tính hội tụ.

Filtering

lọc, giống như nhiều thứ, là tốt nhất nếu bạn làm càng ít càng tốt. Một bộ lọc chính xác sẽ có thể loại bỏ các lỗi lớn và nếu bạn kết thúc với một ngưỡng tốt, bạn có thể có được dữ liệu trơn tru.

Bạn cũng có thể nhận được một số lợi ích nếu bạn đặt ngưỡng thay đổi vị trí cho các ứng dụng đang chạy. Ví dụ một Á hậu chỉ có thể bao gồm một khoảng cách nhất định theo thời gian và bằng cách thiết lập một ngưỡng trên (Usain Bolt Cutoff), bạn sẽ có thể loại bỏ các điểm xấu. Vấn đề với điều đó là nếu điểm đầu tiên của bạn là lỗi, bạn sẽ loại bỏ tất cả các điểm khác.

Kalman Filter

Các Kalman Filter là một giải pháp tuyệt vời và tôi đã thực hiện nó trên ứng dụng chuyển hướng mà tôi đang làm việc trên. Các kết quả rất hợp lý và thậm chí cho phép tính toán chết hạn chế trong các trường hợp GPS kém hoặc không khả dụng. Thật không may tôi không thể chia sẻ mã nguồn nhưng tôi có thể cung cấp cho bạn một chút hướng dẫn nếu bạn quyết định đi theo cách đó. Các kết quả tốt nhất đến từ bộ lọc 6 DoF, nơi bạn tính toán gia tốc và tốc độ và sử dụng nó để ước lượng vị trí. Nó không phải là giải pháp đơn giản nhất nhưng chúng tôi đã thấy kết quả tốt từ nó.

Least-Squares

Các Kalman Filter là rất tốt vì nó có thể được sử dụng trong thời gian thực để lọc các vị trí. Nó theo dõi trạng thái riêng của nó và bạn không cần phải lưu trữ các vị trí cũ. Nhưng mặt khác, nếu bạn muốn xử lý tuyến đường của mình, hình vuông nhỏ nhất phù hợp là một cách tối ưu để đi. (Kalman có nguồn gốc từ các công thức LSQ). Tôi không làm nhiều công đoạn hậu xử lý nhưng tôi nghi ngờ tôi có thể đào một số sách giáo khoa cũ trên đó. Tuy nhiên, lý thuyết nên giống nhau.

Hầu hết các thiết bị GPS là khá tốt và từ tất cả các thử nghiệm tôi đã thấy tôi không thường thấy jitter bạn đang thấy trong ví dụ của bạn.Tuy nhiên, một lợi thế lớn và lý do tại sao tôi thực hiện Bộ lọc Kalman là khoảng cách đi và tính toán vận tốc của bạn chính xác hơn nhiều

+0

"Vấn đề với điều đó là nếu điểm đầu tiên của bạn là lỗi, bạn sẽ xóa tất cả các điểm khác." Vấn đề cổ điển, đã khiến tôi phát điên –

2

Một cách tiếp cận đơn giản là vứt bỏ bất kỳ dữ liệu cũ hoặc không chính xác nào và giữ trung bình kinh độ và vĩ độ.

private static final long WILDLY_OUT = 15; 
private static final long TOO_OLD = 30000; 
private static final long NO_SAMPLES = 5; 

double lastLocationTime; 

double calclongitude(Location location, double oldLongitude) { 
    double newLongitude = oldLongitude; 

    if (location.getAccuracy() < WILDLY_OUT) { 
     newLongitude = (NO_SAMPLES * oldLongitude + location 
       .getLongitude())/(NO_SAMPLES + 1); 
     lastLocationTime = System.currentTimeMillis(); 
    } 

    if (lastLocationTime > TOO_OLD) { 
     newLongitude = location.getLongitude(); 
    } 

    return newLongitude; 
} 

Và làm tương tự cho vĩ độ.