Robot phải làm nhiều việc theo thứ tự, xử lý lỗi ở mỗi bước, và phản ứng với sự kiện bên ngoài. Viết logic đó bằng điều kiện lồng nhau thì sau hai tháng không ai đọc nổi.
Máy trạng thái là gì
Ý tưởng. Robot ở đúng một trạng thái tại mỗi thời điểm. Mỗi trạng thái có hành vi riêng. Sự kiện gây chuyển sang trạng thái khác theo quy tắc đã định.
Ví dụ cho robot giao đồ. Chờ nhiệm vụ, đi tới điểm lấy, chờ nhận hàng, đi tới điểm giao, chờ người lấy hàng, quay về, đi sạc.
Vì sao rõ ràng hơn điều kiện lồng nhau. Danh sách trạng thái và danh sách chuyển đổi vẽ ra được. Nhìn sơ đồ là hiểu toàn bộ hành vi.
Vì sao dễ gỡ lỗi. Ghi lại chuỗi trạng thái đã đi qua thì biết ngay robot đã làm gì và kẹt ở đâu.
Vì sao dễ mở rộng. Thêm hành vi mới là thêm trạng thái và các chuyển đổi tới nó, không phải sửa logic cũ.
Quy tắc quan trọng. Chuyển đổi không nằm trong danh sách cho phép thì bị từ chối và ghi cảnh báo. Ngăn được nhiều hành vi kỳ lạ.
Thiết kế trạng thái
Mỗi trạng thái làm một việc rõ ràng. Nếu mô tả một trạng thái cần dùng chữ và thì có lẽ nên tách thành hai.
Điều kiện vào và ra. Ghi rõ trạng thái bắt đầu khi nào và kết thúc khi nào.
Hành động khi vào và khi ra. Việc làm một lần lúc chuyển vào hoặc chuyển ra, tách khỏi việc lặp lại trong lúc ở trạng thái đó.
Thời gian tối đa. Mỗi trạng thái nên có giới hạn thời gian. Quá lâu thì chuyển sang trạng thái lỗi. Ngăn được việc robot kẹt vô hạn — lỗi phổ biến nhất trong hệ thống không có cơ chế này.
Trạng thái lỗi. Không nên có một trạng thái lỗi chung cho mọi thứ. Phân loại theo cách xử lý — lỗi thử lại được, lỗi cần người, lỗi phải dừng hẳn.
Đường thoát khỏi lỗi. Mọi trạng thái lỗi phải có cách ra. Không có đường ra nghĩa là phải khởi động lại robot.
Trạng thái dừng an toàn. Vào được từ mọi trạng thái khác. Đây là đích của nút dừng khẩn và của mọi lỗi nghiêm trọng.
Xử lý sự kiện và ưu tiên
Sự kiện từ đâu. Hoàn thành một việc, phát hiện lỗi, lệnh từ người dùng, hết thời gian, thay đổi trạng thái phần cứng.
Sự kiện có ưu tiên. Dừng khẩn cấp phải được xử lý ngay bất kể đang ở trạng thái nào và đang làm gì.
Cách tổ chức. Kiểm các sự kiện ưu tiên cao trước, ở mọi trạng thái. Rồi mới xử lý sự kiện thuộc trạng thái hiện tại.
Sự kiện đến trong lúc đang chuyển. Cần hàng đợi hoặc khoá để không mất sự kiện và không xử lý hai lần.
Sự kiện không hợp lệ. Nhận lệnh bắt đầu nhiệm vụ mới trong lúc đang làm nhiệm vụ khác. Từ chối rõ ràng và báo lý do, không im lặng bỏ qua.
Huỷ nhiệm vụ đang chạy. Cần thiết và hay bị quên. Robot phải dừng được giữa chừng một cách an toàn — nhả vật đang cầm ở chỗ hợp lý, không để lại trạng thái dở dang.
Ghi mọi sự kiện và chuyển đổi. Đây là nhật ký quan trọng nhất khi chẩn đoán hành vi lạ.
Khi máy trạng thái không đủ
Triệu chứng. Số trạng thái tăng nhanh vì mỗi tổ hợp điều kiện thành một trạng thái riêng. Sơ đồ trở nên rối như mạng nhện.
Nguyên nhân thường gặp. Cố nhồi nhiều chiều thông tin vào một máy trạng thái phẳng.
Giải pháp một — máy trạng thái phân cấp. Trạng thái chứa máy trạng thái con. Trạng thái đang giao hàng chứa các trạng thái con là đi tới, chờ, quay về. Chuyển đổi ở cấp trên áp dụng cho mọi trạng thái con.
Giải pháp hai — nhiều máy trạng thái song song. Một cho nhiệm vụ, một cho quản lý pin, một cho tương tác người dùng. Chúng chạy độc lập và trao đổi qua sự kiện.
Giải pháp ba — cây hành vi. Cấu trúc cây với các nút điều khiển luồng. Linh hoạt hơn và dễ tổ hợp lại. Được dùng nhiều trong robot hiện đại.
Ưu điểm của cây hành vi. Thêm hành vi mới không cần sửa các nhánh khác. Dễ tái sử dụng các nhánh con.
Nhược điểm. Khó hình dung luồng thực thi hơn máy trạng thái. Với logic đơn giản thì máy trạng thái rõ ràng hơn.
Lời khuyên. Bắt đầu bằng máy trạng thái phẳng. Chuyển sang phân cấp khi vượt khoảng mười trạng thái. Cân nhắc cây hành vi khi cần tổ hợp nhiều hành vi linh hoạt.
Kiểm thử logic hành vi
Liệt kê mọi chuyển đổi. Và kiểm từng cái. Nhiều lỗi nằm ở các chuyển đổi hiếm gặp mà không ai thử.
Thử các trường hợp bất thường. Huỷ giữa chừng. Lỗi ngay khi vừa bắt đầu. Hai lệnh tới cùng lúc. Mất kết nối trong lúc đang chờ.
Thử hết thời gian. Ép mỗi trạng thái vào tình huống quá thời gian và xem robot xử lý thế nào.
Kiểm thử tự động. Logic hành vi tách khỏi phần cứng thì kiểm thử được bằng phần mềm. Đây là lý do nên tách.
Kiểm thử trong mô phỏng. Chạy các kịch bản đầy đủ với thời gian và sự kiện thật.
Vẽ sơ đồ và đối chiếu với mã. Sơ đồ và mã lệch nhau là chuyện thường sau vài tháng sửa. Sinh sơ đồ tự động từ mã là cách tốt nhất nếu làm được.
Và quan sát ở hiện trường. Robot gặp những chuỗi sự kiện mà không ai nghĩ tới. Nhật ký chuyển trạng thái từ vận hành thật là nguồn phát hiện lỗi logic tốt nhất.
Câu hỏi thường gặp
Vì sao máy trạng thái rõ ràng hơn điều kiện lồng nhau?
Vì danh sách trạng thái và chuyển đổi vẽ ra được thành sơ đồ, ghi lại chuỗi trạng thái là biết robot đã làm gì, và thêm hành vi mới không phải sửa logic cũ.
Vì sao mỗi trạng thái nên có giới hạn thời gian?
Để ngăn robot kẹt vô hạn — lỗi phổ biến nhất trong hệ thống không có cơ chế này. Quá thời gian thì chuyển sang trạng thái lỗi.
Khi nào máy trạng thái phẳng không còn đủ?
Khi số trạng thái tăng nhanh vì mỗi tổ hợp điều kiện thành một trạng thái riêng. Khoảng mười trạng thái là lúc nên chuyển sang phân cấp.
Nguồn phát hiện lỗi logic tốt nhất là gì?
Nhật ký chuyển trạng thái từ vận hành thật, vì robot ở hiện trường gặp những chuỗi sự kiện mà không ai nghĩ tới khi thiết kế.
Đọc thêm trong ROS 2 thực hành và Thiết kế cơ khí.