Robot chạy hàng chục chương trình song song — đọc cảm biến, định vị, lập kế hoạch, điều khiển, giao diện. Cách tổ chức chúng quyết định hệ thống có gỡ lỗi được và có mở rộng được không.
Chia thành các thành phần
Nguyên tắc. Mỗi thành phần làm một việc, có đầu vào và đầu ra rõ ràng, chạy độc lập.
Lợi ích một — cô lập lỗi. Một thành phần treo thì các thành phần khác vẫn chạy, và biết ngay chỗ nào hỏng.
Lợi ích hai — phát triển song song. Nhiều người làm các phần khác nhau mà không đụng nhau.
Lợi ích ba — thay thế được. Đổi thuật toán định vị mà không sửa gì ở phần khác, miễn giữ nguyên giao diện.
Lợi ích bốn — kiểm thử riêng. Chạy một thành phần với dữ liệu đã ghi để kiểm tra mà không cần cả robot.
Cái giá. Truyền dữ liệu giữa các tiến trình có chi phí và độ trễ. Với dữ liệu lớn như ảnh thì đáng kể.
Chia thế nào cho vừa. Quá ít thành phần thì mất lợi ích; quá nhiều thì chi phí truyền thông và độ phức tạp tăng. Chia theo ranh giới tự nhiên của bài toán thường là đúng.
Cơ chế truyền thông
Phát và đăng ký. Thành phần phát dữ liệu ra một kênh, ai quan tâm thì đăng ký nhận. Bên phát không cần biết ai nhận.
Vì sao hợp với robot. Dữ liệu cảm biến thường có nhiều bên quan tâm. Thêm một thành phần mới đọc cùng dữ liệu mà không sửa gì ở bên phát.
Gọi và trả lời. Một bên hỏi, bên kia trả lời. Hợp với yêu cầu có kết quả cụ thể như tính đường đi.
Nhiệm vụ dài. Yêu cầu mất nhiều thời gian, cần báo tiến độ và huỷ được. Ví dụ đi tới một điểm.
Tham số cấu hình. Giá trị chia sẻ đọc được và sửa được lúc chạy. Tiện cho việc chỉnh mà không phải khởi động lại.
Chọn cơ chế đúng. Dữ liệu liên tục thì phát. Yêu cầu có kết quả thì gọi. Việc lâu thì nhiệm vụ dài. Dùng sai cơ chế làm hệ thống khó hiểu và dễ tắc.
Quản lý trạng thái
Chỗ gây lỗi nhiều nhất trong hệ thống nhiều thành phần.
Vấn đề. Robot có một trạng thái tổng thể — đang chờ, đang đi, đang lỗi, đang sạc. Nhiều thành phần cần biết và một số muốn thay đổi nó.
Sai lầm phổ biến. Mỗi thành phần giữ ý niệm riêng về trạng thái. Chúng lệch nhau và hành vi trở nên khó đoán.
Giải pháp — một nơi giữ trạng thái. Một thành phần quản lý trạng thái tổng thể, các thành phần khác đọc từ đó và yêu cầu thay đổi qua nó.
Máy trạng thái tường minh. Liệt kê các trạng thái và các chuyển đổi hợp lệ. Chuyển đổi không nằm trong danh sách thì bị từ chối. Ngăn được nhiều hành vi kỳ lạ.
Trạng thái lỗi phải có đường thoát. Vào được thì phải ra được. Trạng thái lỗi không có lối ra nghĩa là phải khởi động lại robot.
Ghi lại mọi chuyển đổi. Nhật ký chuyển trạng thái là công cụ chẩn đoán tốt nhất khi robot hành xử lạ.
Ghi và phát lại
Tính năng quan trọng nhất và hay bị thêm quá muộn.
Ghi gì. Toàn bộ dữ liệu truyền giữa các thành phần, kèm dấu thời gian.
Vì sao quý. Robot lỗi ở hiện trường, ghi lại được, mang về phát lại và gỡ lỗi mà không cần robot và không cần tái tạo tình huống.
Phát lại từng phần. Phát lại dữ liệu cảm biến, chạy phiên bản mới của thành phần định vị, so kết quả. Cách kiểm tra cải tiến hiệu quả nhất.
Dung lượng. Ghi ảnh liên tục tốn rất nhiều. Cần chiến lược — ghi ở độ phân giải thấp, ghi vòng và chỉ giữ lại khi có sự cố, hoặc ghi theo yêu cầu.
Ghi vòng là cách hay nhất. Luôn giữ vài phút gần nhất trong bộ nhớ, khi có sự cố thì lưu ra đĩa. Được dữ liệu quanh thời điểm quan trọng mà không tốn dung lượng.
Đồng bộ thời gian. Nếu các thành phần chạy trên máy khác nhau thì đồng hồ phải đồng bộ, nếu không dữ liệu ghép lại vô nghĩa.
Thêm từ đầu. Thêm sau khi đã triển khai thì luôn thiếu dữ liệu của giai đoạn cần nhất.
Nguyên tắc thiết kế thực dụng
Tách phần an toàn ra khỏi phần còn lại. Chức năng an toàn không phụ thuộc vào bất kỳ thành phần nào có thể treo.
Mọi thành phần phải chịu được đầu vào cũ hoặc thiếu. Dữ liệu không tới thì hành xử an toàn, không đơ và không dùng giá trị cũ như thể mới.
Cấu hình tách khỏi mã. Mọi tham số khác nhau giữa các robot hoặc các nơi triển khai nằm trong tệp cấu hình.
Khởi động tự động và tự phục hồi. Thành phần chết thì tự khởi động lại. Cả hệ thống chết thì tự chạy lại sau khi bật nguồn.
Giám sát nội bộ. Mỗi thành phần báo còn sống và báo chỉ số của mình. Cho phép phát hiện vấn đề trước khi nó thành sự cố.
Đừng tối ưu sớm. Kiến trúc rõ ràng quan trọng hơn nhanh vài mili giây. Tối ưu sau khi đo được chỗ chậm thật.
Và giữ đơn giản. Hệ thống robot vốn đã phức tạp vì phần cứng và môi trường. Thêm phức tạp ở phần mềm thì gỡ lỗi trở nên rất khó, và phần lớn thời gian của dự án là gỡ lỗi.
Câu hỏi thường gặp
Lợi ích chính của việc chia phần mềm thành các thành phần?
Cô lập lỗi — một thành phần treo thì các thành phần khác vẫn chạy và biết ngay chỗ hỏng. Kèm phát triển song song và kiểm thử riêng từng phần.
Sai lầm phổ biến nhất trong quản lý trạng thái?
Mỗi thành phần giữ ý niệm riêng về trạng thái robot. Chúng lệch nhau và hành vi trở nên khó đoán. Cần một nơi duy nhất giữ trạng thái tổng thể.
Cách ghi dữ liệu hiệu quả nhất là gì?
Ghi vòng — luôn giữ vài phút gần nhất trong bộ nhớ, khi có sự cố thì lưu ra đĩa. Được dữ liệu quanh thời điểm quan trọng mà không tốn dung lượng.
Mọi thành phần phải chịu được điều gì?
Đầu vào cũ hoặc thiếu. Dữ liệu không tới thì phải hành xử an toàn, không đơ và không dùng giá trị cũ như thể nó vẫn mới.
Đọc thêm trong Vật liệu & kết cấu và Cơ cấu kẹp & gripper.