Vì sao head unit báo tốc độ bằng 0 dù xe đang chạy 60 km/h
Location.hasSpeed() trả về true nhưng giá trị luôn là 0,0. Vì sao hiện tượng này lại phổ biến trên màn hình Android lắp thêm, và app nhận biết nó như thế nào.
Khi thử trên bàn làm việc, đọc tốc độ từ Android chỉ cần một dòng code. Nhưng trên các head unit lắp thêm ở Việt Nam, đây lại là chỗ thường gặp sự cố đầu tiên.
Nguyên nhân nằm ở câu NMEA
Module GPS gửi dữ liệu cho hệ điều hành bằng các câu NMEA. Vị trí nằm trong câu $GPGGA, còn tốc độ và hướng nằm trong $GPRMC. Nhiều module giá rẻ chỉ đọc câu $GPGGA — đủ để đánh dấu vị trí trên bản đồ, nên với phần lớn app thì như vậy là đủ.
Khó hơn nữa là driver vẫn khai báo trường tốc độ là hợp lệ: location.hasSpeed() trả về true, còn location.speed trả về 0.0f. Không có lỗi nào được báo ra, cũng không có cờ lỗi nào được bật. Nếu app tin vào con số đó, đồng hồ tốc độ sẽ luôn đứng yên ở 0 — mà lại xảy ra trên chính nhóm máy phổ biến nhất.
Chỉ kiểm tra 'tốc độ bằng 0' là chưa đủ
Khi xe dừng đèn đỏ, tốc độ cũng bằng 0. Vì vậy cần một dấu hiệu để phân biệt 'xe đang đứng yên' với 'driver bị lỗi', và dấu hiệu đó là khoảng cách giữa hai lần định vị liên tiếp: nếu xe đang chạy, hai điểm định vị (fix) sẽ cách nhau vài chục mét, bất kể driver báo tốc độ bao nhiêu.
Cách app xử lý
SpeedEstimator chạy song song hai nguồn:
- Nguồn từ driver — lấy nguyên giá trị
location.speed. - Nguồn tự tính — lấy khoảng cách giữa hai lần định vị chia cho thời gian giữa chúng.
Bình thường app dùng nguồn từ driver vì số liệu mượt hơn. Nhưng mỗi khi nguồn tự tính cho thấy xe rõ ràng đang chạy mà driver vẫn báo 0, app ghi nhận thêm một mẫu. Sau khoảng tám mẫu như vậy, app kết luận driver bị lỗi và chuyển hẳn sang nguồn tự tính cho tới hết phiên sử dụng đó.
Vì sao là tám mà không phải hai? Một lần định vị bị nhiễu có thể tạo ra khoảng cách sai, nhưng tám mẫu liên tiếp thì gần như không thể.
Người lái sẽ thấy gì
Khi đã chuyển nguồn, màn hình sẽ hiện dòng 'Tốc độ tính từ GPS'. Đây không phải thông báo lỗi — dòng này chỉ cho bạn biết con số đang được tính từ đâu, để nếu thấy tốc độ cập nhật chậm hơn một chút thì bạn hiểu lý do. Trạng thái này hoàn toàn bình thường trên nhiều head unit.
Cập nhật tháng 10/2026: app không còn hiện dòng trạng thái về GPS nữa — việc chuyển sang tốc độ tự tính diễn ra im lặng, giống cách Google Maps xử lý.