← GPS hoạt động thế nào?

Bài 4 · Nâng cao · 28 phút

Trilateration: định vị giao điểm

Biên soạn bởi Nguyễn Anh Tuấn

Lõi của GPS với mô phỏng kéo-thả: 1 vệ tinh cho một mặt cầu, 2 giao thành đường tròn, 3 còn 2 điểm, vệ tinh thứ 4 giải sai số đồng hồ - 4 ẩn x, y, z, Δt.

bài trước, mèo con đã đo được khoảng cách tới từng vệ tinh. Nhưng biết “cách vệ tinh số 7 đúng 20.000 km” thì bạn vẫn ở vô số chỗ: tất cả các điểm cách vệ tinh đó đúng 20.000 km nằm trên một mặt cầu bao quanh nó.

Một mặt cầu thì rộng mênh mông. Nhưng nếu biết khoảng cách tới nhiều vệ tinh, mỗi cái cho một mặt cầu, thì các mặt cầu giao nhau sẽ khoá dần vị trí lại. Kỹ thuật tìm vị trí từ nhiều khoảng cách như vậy gọi là trilateration. Để dễ nhìn, ta xét trong mặt phẳng - mặt cầu thành vòng tròn.

Kéo thử các 🛰️ vệ tinh và 🐱 máy thu bên dưới, và bấm đổi số vệ tinh để thấy vị trí bị khoá lại ra sao:

Số vệ tinh:
🛰️🛰️🛰️🐱

Ba vệ tinh: ba vòng giao nhau tại đúng MỘT điểm - chính là bạn.

Kéo 🛰️ vệ tinh hoặc 🐱 máy thu. Mỗi vòng tròn = “máy thu cách vệ tinh này đúng bấy nhiêu”.

  • 1 vệ tinh: bạn ở đâu đó trên một vòng tròn - vô số khả năng.
  • 2 vệ tinh: hai vòng giao nhau còn 2 điểm (một là bạn, một là “điểm ma”).
  • 3 vệ tinh: vòng thứ ba loại điểm ma, chốt lại đúng một điểm.

Không cần phép màu - chỉ là hình học. Lấy đúng ba vệ tinh trong mô phỏng: A ở (0,0), B ở (3,9), C ở (7,1), mỗi cái đo được khoảng cách 5. Giao hai vòng A và B trước, rồi để vòng C chọn ra điểm đúng:

Bạn ở đây
Ba vòng tròn khoảng cách (mỗi vòng một vệ tinh) cắt nhau tại đúng một điểm - vị trí của bạn.

trilateration.py - giao cac vong tron

import math

def giao_hai_duong_tron(c1, c2):
    (x1, y1, r1), (x2, y2, r2) = c1, c2
    dx, dy = x2 - x1, y2 - y1
    d = math.hypot(dx, dy)
    a = (r1**2 - r2**2 + d**2) / (2 * d)
    h = math.sqrt(r1**2 - a**2)
    xm, ym = x1 + a * dx / d, y1 + a * dy / d
    return [(xm + h * dy / d, ym - h * dx / d), (xm - h * dy / d, ym + h * dx / d)]

A = (0, 0, 5)
B = (3, 9, 5)
C = (7, 1, 5)

print("2 ve tinh -> 2 diem kha di:")
for p in giao_hai_duong_tron(A, B):
    tren_C = abs(math.dist(p, (C[0], C[1])) - C[2]) < 1e-9
    print(f"  ({p[0]:.0f}, {p[1]:.0f})  ->  nam tren vong tron C? {'co' if tren_C else 'khong'}")
print("=> Ve tinh thu 3 chot lai mot diem: (3, 4)")

Kết quả khi chạy

2 ve tinh -> 2 diem kha di:
  (3, 4)  ->  nam tren vong tron C? co
  (0, 5)  ->  nam tren vong tron C? khong
=> Ve tinh thu 3 chot lai mot diem: (3, 4)

Đúng như mô phỏng: hai vệ tinh cho hai điểm (3,4)(0,5); vệ tinh thứ ba giữ lại đúng điểm nằm trên cả ba vòng - vị trí thật của mèo con.

Đời thực là không gian 3 chiều, nên mỗi khoảng cách là một mặt cầu chứ không phải vòng tròn. Hai mặt cầu giao nhau thành một vòng tròn; mặt cầu thứ ba cắt vòng tròn đó tại 2 điểm. Một điểm nằm ngay trên mặt đất, điểm kia văng tít ngoài không gian - máy thu loại ngay điểm vô lý đó.

Trung thực

Mô phỏng phía trên là 2D (vòng tròn) cho dễ nhìn. Đời thực là 3D mặt cầu, và còn một ẩn số nữa mà bản 2D bỏ qua: sai số đồng hồ máy thu. Đó là lý do có Bước 5.

Nhớ “khoảng cách giả” (pseudorange) ở bài trước chứ? Đồng hồ máy thu lệch khiến cả ba khoảng cách đều sai một lượng chung. Tức là ngoài ba ẩn vị trí x, y, z, còn một ẩn thứ tư: Δt - độ lệch đồng hồ máy thu. Bốn ẩn thì cần bốn phương trình, nên phải có bốn vệ tinh.

  • Ẩn cần tìm: x, y, z (vị trí) và Δt (sai lệch đồng hồ máy thu) - tổng 4 ẩn.
  • Mỗi vệ tinh cho một phương trình; cần tối thiểu 4 vệ tinh.
  • Vệ tinh thứ tư vừa định vị, vừa “sửa” luôn đồng hồ rẻ tiền của máy thu.

Vì sao đây là tin tuyệt vời

Máy thu không cần đồng hồ nguyên tử đắt đỏ. Chỉ cần thêm một vệ tinh, phép toán tự suy ra đồng hồ máy thu đang lệch bao nhiêu rồi bù lại - nên con chip GPS vài chục nghìn đồng vẫn định vị tốt.

Giải xong, máy thu có toạ độ x, y, z trong hệ gắn với tâm Trái Đất. Bước cuối là đổi sang kinh độ, vĩ độ, độ cao dựa trên mô hình hình dạng Trái Đất gọi là ellipsoid WGS84 - rồi mới chấm được lên bản đồ thành cái chấm xanh quen thuộc.

Bước tiếp theo

Tới đây ta đã giả định mọi khoảng cách đo được đều chuẩn. Thực tế thì không: tín hiệu bị khí quyển làm chậm, dội vào nhà cao tầng… khiến các vòng tròn không giao gọn. Vì sao và cách trị ở Bài 5: Sai số & hiệu chỉnh.

Câu hỏi thường gặp

Khác cái gốc: triangulation dùng GÓC nhìn tới các mốc, còn trilateration dùng KHOẢNG CÁCH tới các mốc. GPS đo khoảng cách nên thuộc loại trilateration, dù dân gian hay gọi nhầm là “tam giác”.

Nếu đồng hồ máy thu hoàn hảo thì 3 là đủ. Nhưng đồng hồ máy thu KHÔNG hoàn hảo (bài trước), nên cần vệ tinh thứ tư để trị luôn sai số đồng hồ. Thực tế máy thường “nhìn thấy” 6 tới hơn 10 vệ tinh cùng lúc.

Hai mặt cầu giao nhau thành một vòng tròn; mặt cầu thứ ba cắt vòng tròn đó tại 2 điểm. Một điểm nằm gần mặt đất (hợp lý), điểm kia văng ra ngoài không gian, nên máy thu loại ngay điểm vô lý.

Gần như không. Điểm còn lại thường ở rất xa Trái Đất hoặc dưới lòng đất - vô lý về mặt vật lý, nên loại bỏ dễ dàng. Mô phỏng phía trên cho bạn thấy “điểm ma” đó khi mới có 2 vệ tinh.

Phép giao cho toạ độ trong một hệ gắn với tâm Trái Đất (x, y, z). Máy thu đổi nó sang kinh độ/vĩ độ/độ cao dựa trên một mô hình hình dạng Trái Đất gọi là ellipsoid WGS84 - rồi mới chấm lên bản đồ.

Đúng. Dư vệ tinh giúp máy thu lấy trung bình, kiểm tra chéo và loại tín hiệu xấu, nên sai số nhỏ lại. Vì sao vẫn còn sai số dù đủ vệ tinh thì để bài “Sai số & hiệu chỉnh”.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Biết khoảng cách tới đúng MỘT vệ tinh thì máy thu khoanh được bạn ở đâu?

  1. 1

    Tự tìm hai giao điểm

    Hai vệ tinh: A ở (0,0) đo được khoảng cách 5; B ở (3,9) cũng 5. Tìm 2 điểm giao của hai vòng tròn (vẽ hình hoặc dùng đoạn code ở Bước 3).

    Hoàn thành khi: Hai điểm: (3, 4) và (0, 5).

  2. 2

    Loại điểm ma

    Thêm vệ tinh C ở (7,1) đo được khoảng cách 5. Trong hai điểm ở câu trên, điểm nào nằm trên vòng tròn của C?

    Hoàn thành khi: Chỉ (3,4): khoảng cách từ (3,4) tới (7,1) đúng bằng 5; còn (0,5) cách (7,1) là √65 ≈ 8,06 nên bị loại.

  3. 3

    3 hay 4 vệ tinh?

    Vì sao máy thu thực tế cần ít nhất 4 vệ tinh, không phải 3?

    Hoàn thành khi: Vì có 4 ẩn: x, y, z và sai số đồng hồ máy thu (Δt). Bốn ẩn cần bốn phương trình, tức bốn vệ tinh.

  4. 4

    Trilateration hay triangulation?

    GPS dùng cái nào, và điểm khác nhau căn bản là gì?

    Hoàn thành khi: GPS dùng trilateration (dựa trên KHOẢNG CÁCH); triangulation dựa trên GÓC. Đó là khác biệt gốc.

  5. 5

    Điểm bay lên trời

    Trong 3D, ba mặt cầu cắt nhau cho 2 điểm. Máy thu chọn đúng một bằng cách nào?

    Hoàn thành khi: Giữ điểm nằm gần bề mặt Trái Đất (hợp lý), loại điểm còn lại vì nó ở ngoài không gian hoặc sâu dưới đất - vô lý.

  6. 6

    Nối sang Bài 5

    Trilateration giả định mọi khoảng cách đo được đều CHÍNH XÁC. Trong thực tế điều gì làm khoảng cách lệch, khiến các vòng tròn không giao gọn vào một điểm?

    Hoàn thành khi: Các nguồn sai số: trễ tầng khí quyển, tín hiệu dội, hình học vệ tinh xấu… làm vòng tròn “phình/teo”, giao điểm nhoè - chính là nội dung Bài 5.