10/10/2026 · VietTechies · Biên tập

Ngày 23 tháng 9 năm 1999, tàu Mars Climate Orbiter của NASA, thuộc một sứ mệnh trị giá 327,6 triệu USD, đốt động cơ để tiến vào quỹ đạo quanh sao Hỏa. Sớm hơn dự kiến khoảng một phút, tín hiệu radio im bặt. Tín hiệu ấy không bao giờ quay lại.
Trên tàu không có bộ phận nào hỏng. Thủ phạm là một con số nằm trong một file dưới mặt đất, và con số đó sai gấp 4,45 lần.
Bối cảnh: con tàu được điều khiển từ Trái Đất
Mars Climate Orbiter rời bệ phóng ngày 11 tháng 12 năm 1998 trên tên lửa Delta II. Trang sứ mệnh của chính NASA ghi rằng tàu bị mất ngay khi tới nơi và nêu nguyên nhân là lỗi dẫn đường: không chuyển đổi đơn vị đo lường Anh sang hệ mét.
Muốn hiểu vì sao một lỗi đơn vị có thể làm mất cả con tàu, bạn cần biết một chút cơ học. Các bánh đà phản lực (reaction wheel) trên tàu cứ quay nhanh dần theo thời gian, nên thỉnh thoảng đội điều khiển phải cho các động cơ đẩy nhỏ đốt một lúc để giảm bớt phần quay dư thừa ấy. Mỗi lần đốt như vậy cũng đẩy quỹ đạo của tàu lệch đi một chút. Vì thế, đội dẫn đường trên Trái Đất phải biết chính xác từng cú đẩy mạnh bao nhiêu thì mới liên tục tính ra được vị trí thật của tàu.
Lỗi diễn ra từng bước như thế nào
Bước 1: tác động của động cơ đẩy được đo bằng xung lượng (impulse). Xung lượng là lực nhân với thời gian. Bản đặc tả giao diện của tàu, tức tài liệu quy định dữ liệu mà các hệ thống trao đổi với nhau, yêu cầu ghi xung lượng bằng newton-giây, một đơn vị hệ mét.
Bước 2: phần mềm mặt đất xuất ra sai đơn vị. Phần mềm của Lockheed Martin, nhà chế tạo tàu, ghi xung lượng bằng pound-lực giây. Một pound-lực giây xấp xỉ 4,448 newton-giây.
Bước 3: bên dẫn đường đọc các con số như thể chúng tính theo hệ mét. Trong file không có gì báo điều ngược lại, vì file chỉ chứa một cột số. Kết quả là mô hình quỹ đạo nhận được tác động của động cơ đẩy nhỏ hơn thực tế khoảng 4,45 lần.
# simplified illustration, not mission code
impulse = 100.0 # written by ground software, in lbf*s
used_by_navigation = impulse # read as if it were N*s
actual_n_s = impulse * 4.448 # what it really was
Bước 4: sai số nhỏ cứ thế cộng dồn. Lần đốt nào cũng bị tính cú đẩy thấp hơn thực tế một chút. Sau nhiều tháng bay, quỹ đạo ước tính và quỹ đạo thật lệch nhau dần, và nếu chỉ nhìn vào các con số thì rất khó nhận ra khoảng lệch đó.
Hậu quả, và những dấu hiệu bị bỏ qua
Theo kế hoạch, tàu sẽ bay qua sao Hỏa ở độ cao khoảng 226 km so với bề mặt; độ cao thấp nhất mà người ta cho rằng tàu còn chịu được là khoảng 80 km. Kết quả dựng lại quỹ đạo sau sự cố cho thấy tàu thực ra đã xuống tới độ cao chỉ khoảng 57 km. Các con số độ cao ở đây lấy theo những bản tóm tắt đã công bố về báo cáo của hội đồng điều tra, và các nguồn không thống nhất về độ cao dự kiến, vì vậy hãy xem các con số này là gần đúng.
Lỗi này không hoàn toàn vô hình. Ít nhất hai nhân viên dẫn đường đã nhận thấy vị trí của tàu có điểm bất thường. Theo một bài tường thuật trên IEEE Spectrum, mối lo của họ bị gạt đi, một phần vì họ không báo cáo theo đúng mẫu quy định. Một lần hiệu chỉnh quỹ đạo nữa từng được đem ra bàn, nhưng rốt cuộc không được thực hiện.
Hội đồng điều tra thật ra quy lỗi cho điều gì
Phiên bản phổ biến rất đơn giản: ai đó quên chuyển đơn vị hệ Anh sang hệ mét. Hồ sơ thực tế cho thấy bức tranh rộng hơn. Trong báo cáo Giai đoạn I đề ngày 10 tháng 11 năm 1999, Hội đồng điều tra sự cố (Mishap Investigation Board) xác định lỗi đơn vị là nguyên nhân gốc rễ, đồng thời chỉ ra những vấn đề về quy trình: sứ mệnh không được nhìn nhận như một hệ thống hoàn chỉnh, việc trao đổi thông tin và đào tạo thiếu nhất quán, còn phần mềm dẫn đường thì không được kiểm chứng trọn vẹn từ đầu đến cuối (end-to-end). Các quan chức NASA được IEEE Spectrum trích lời đã tóm lại như sau: “Vấn đề ở đây không nằm ở lỗi sai, mà ở chỗ khâu kỹ thuật hệ thống của NASA đã thất bại.”
Còn một chi tiết nữa cần đính chính. Con tàu không để lại miệng hố va chạm nào có thể nhìn thấy. Theo NASA, nhiều khả năng tàu đã bốc cháy trong khí quyển sao Hỏa, và đến nay không ai biết chính xác chuyện gì đã xảy ra với con tàu.
Vì sao thiết kế này thất bại, và vì sao bài học vẫn còn nguyên giá trị
Một con số đứng trơ trọi thì không mang theo đơn vị. Hai chương trình, chương trình nào cũng chạy đúng như được viết, vẫn có thể trao đổi với nhau một file đúng định dạng nhưng lại hiểu file đó theo hai nghĩa khác nhau. Bản đặc tả thật ra đã yêu cầu dùng hệ mét, nhưng file không tuân thủ, và ở điểm giao tiếp giữa hai bên không có bước kiểm tra nào phát hiện ra.
Đó là lý do các dự án phần mềm hiện đại gắn đơn vị vào giá trị: dùng kiểu dữ liệu biết đơn vị, dùng schema (bản mô tả cấu trúc dữ liệu) có kiểm tra tính hợp lệ, hoặc tối thiểu là đặt tên trường kiểu impulse_newton_seconds. Cái giá chỉ là thêm vài ký tự cho mỗi giá trị.
Nguyên tắc có thể áp dụng ở bất cứ đâu: mọi giá trị đi qua ranh giới giữa các nhóm đều cần được ghi rõ đơn vị và ý nghĩa, ngay ở chỗ mà code phía nhận có thể kiểm tra. Còn trong hệ thống của bạn, có những con số nào đang đi qua ranh giới giữa các nhóm mà chỉ có mỗi tiêu đề cột để giải thích ý nghĩa?
Bài liên quan
Đọc bằng ngôn ngữ khác: English
Nguồn
- NASA Science, “Mars Climate Orbiter”
- NASA JPL, trang sứ mệnh “Mars Climate Orbiter”
- NASA, Mars Climate Orbiter Mishap Investigation Board, Phase I Report (10 November 1999)
- “Mars Climate Orbiter,” Wikipedia (tóm tắt báo cáo của hội đồng điều tra và bài tường thuật trên IEEE Spectrum)
- Ảnh đại diện: tranh minh họa Mars Climate Orbiter tại sao Hỏa do họa sĩ vẽ (minh họa, không phải ảnh chụp sự kiện). NASA/JPL, qua Wikimedia Commons, phạm vi công cộng (Public domain)
