Vòng điều khiển là đoạn mã ngắn nhất trong dự án robot và cũng là đoạn nhạy cảm nhất. Vài dòng sai chỗ làm robot rung, vọt quá, hoặc lao đi mất kiểm soát.
Cấu trúc một vòng
Bước một — đọc trạng thái. Vị trí hiện tại từ cảm biến. Kiểm tính hợp lệ trước khi dùng.
Bước hai — lấy mục tiêu. Vị trí mong muốn tại thời điểm này.
Bước ba — tính sai lệch. Mục tiêu trừ hiện tại. Với góc thì phải xử lý việc quấn vòng — sai lệch giữa ba trăm năm mươi độ và mười độ là hai mươi độ, không phải ba trăm bốn mươi.
Bước bốn — tính lệnh điều khiển. Áp dụng luật điều khiển lên sai lệch.
Bước năm — giới hạn lệnh. Cắt về dải mà phần cứng chấp nhận được.
Bước sáu — xuất lệnh.
Bước bảy — chờ tới nhịp kế tiếp. Dùng cơ chế định thời, không dùng lệnh nghỉ một khoảng cố định — nếu không thì chu kỳ thực tế bằng thời gian tính toán cộng thời gian nghỉ, và nó thay đổi.
Chi tiết quan trọng. Chu kỳ phải đều. Luật điều khiển giả định khoảng thời gian giữa hai lần gọi là hằng số. Chu kỳ dao động làm các thành phần tích luỹ và vi phân tính sai.
Xử lý thời gian cho đúng
Đo chu kỳ thật. Đừng giả định. Ghi lại khoảng cách giữa các lần chạy và kiểm phân bố.
Dùng thời gian thật trong công thức. Nếu chu kỳ không đều thì dùng khoảng thời gian đo được thay vì hằng số. Bù được phần nào.
Nhưng đừng dựa vào việc bù. Chu kỳ dao động mạnh nghĩa là có vấn đề cần sửa ở chỗ khác.
Nguyên nhân chu kỳ không đều. Hệ điều hành không thời gian thực. Tiến trình khác chiếm tài nguyên. Chờ dữ liệu mạng trong vòng lặp. Ghi nhật ký ra đĩa trong vòng lặp.
Đừng làm việc chậm trong vòng điều khiển. Ghi tệp, gửi mạng, cấp phát bộ nhớ, xử lý ảnh. Đẩy chúng sang luồng khác.
Đo thời gian thực thi. Vòng lặp mất bao lâu để chạy. Nếu gần bằng chu kỳ thì không còn dư địa.
Xử lý khi trễ. Nếu một chu kỳ bị bỏ lỡ thì làm gì. Bỏ qua và tiếp tục thường tốt hơn cố chạy bù, vì chạy bù tạo lệnh lớn bất thường.
Giới hạn và bảo vệ
Giới hạn lệnh đầu ra. Bắt buộc. Lệnh vượt khả năng phần cứng thì phần cứng cắt, và hệ điều khiển không biết điều đó.
Vấn đề tích luỹ khi bão hoà. Khi lệnh bị cắt mà sai lệch vẫn còn, thành phần tích phân cứ dồn lên. Khi hệ thoát khỏi bão hoà, lượng dồn đó gây vọt quá lớn.
Cách xử lý. Ngừng tích luỹ khi đầu ra đang bị cắt, hoặc giới hạn giá trị tích luỹ. Đây là chi tiết bắt buộc, không phải tuỳ chọn.
Giới hạn tốc độ thay đổi lệnh. Lệnh nhảy đột ngột gây giật cơ khí. Làm mượt bằng cách giới hạn mức thay đổi mỗi chu kỳ.
Giới hạn vùng làm việc. Kiểm mục tiêu có nằm trong giới hạn khớp không trước khi thực hiện.
Kiểm sai lệch quá lớn. Sai lệch bất thường nghĩa là có gì đó sai — cảm biến hỏng, cơ khí kẹt, mục tiêu vô lý. Nên dừng thay vì cố đuổi theo.
Kiểm dữ liệu cảm biến hợp lệ. Ngoài dải, không đổi quá lâu, hoặc nhảy quá nhanh. Dùng dữ liệu hỏng để tính lệnh động cơ là cách gây tai nạn.
Chỉnh tham số có phương pháp
Chuẩn bị trước. Có cách dừng khẩn cấp trong tầm tay. Giới hạn lệnh đặt bảo thủ. Robot ở tư thế mà mất kiểm soát không gây hư hỏng.
Ghi dữ liệu để nhìn. Vẽ đồ thị mục tiêu và giá trị thực theo thời gian. Chỉnh mà không nhìn đồ thị là mò mẫm.
Dùng lệnh nhảy bậc để thử. Cho mục tiêu nhảy một bước rồi quan sát đáp ứng. Dạng đáp ứng cho biết cần chỉnh gì.
Đọc dạng đáp ứng. Chậm và không tới đích thì thiếu độ mạnh. Vọt quá rồi dao động tắt dần thì quá mạnh hoặc thiếu giảm chấn. Dao động không tắt thì quá mạnh nhiều. Tới gần rồi dừng lại lệch một chút thì cần thành phần tích luỹ.
Chỉnh từng thành phần một. Đổi nhiều thứ cùng lúc thì không biết cái nào có tác dụng.
Thử ở nhiều điều kiện. Tải nhẹ và tải nặng, tư thế duỗi và tư thế co. Tham số tốt ở một điều kiện có thể tệ ở điều kiện khác.
Ghi lại tham số cuối cùng. Kèm điều kiện đã thử. Sáu tháng sau sẽ cần và sẽ không nhớ.
Lỗi lập trình hay gặp
Nhầm đơn vị. Độ và radian, milimet và mét, vòng mỗi phút và radian mỗi giây. Nguồn lỗi số một. Quy ước dùng đơn vị chuẩn trong toàn bộ mã và chỉ đổi ở chỗ giao tiếp với phần cứng.
Nhầm dấu. Chiều dương của khớp không như mong đợi. Triệu chứng là robot chạy ngược hướng hoặc mất ổn định ngay lập tức.
Không xử lý quấn vòng góc. Robot quay gần hết vòng thay vì quay một chút.
Chia cho không. Khi chu kỳ đo được bằng không do lỗi thời gian.
Biến chia sẻ không an toàn. Vòng điều khiển đọc mục tiêu trong khi luồng khác đang ghi. Đọc được giá trị lai.
Trạng thái không khởi tạo. Thành phần tích luỹ hoặc giá trị trước đó chứa rác ở lần chạy đầu, gây cú giật khi khởi động.
Không đặt lại khi bật lại. Robot dừng rồi chạy lại mà không xoá trạng thái cũ. Lệnh đầu tiên rất lớn.
Cách phòng chung. Kiểm mọi giá trị trước khi dùng, khởi tạo tường minh, và luôn thử lần đầu ở tốc độ rất thấp.
Câu hỏi thường gặp
Vì sao không dùng lệnh nghỉ cố định để tạo nhịp vòng lặp?
Vì chu kỳ thực tế sẽ bằng thời gian tính toán cộng thời gian nghỉ, và nó thay đổi. Luật điều khiển giả định khoảng thời gian giữa hai lần gọi là hằng số.
Vấn đề tích luỹ khi bão hoà là gì?
Khi lệnh bị cắt mà sai lệch vẫn còn, thành phần tích phân cứ dồn lên, và khi hệ thoát khỏi bão hoà thì lượng dồn đó gây vọt quá lớn. Phải ngừng tích luỹ khi đầu ra đang bị cắt.
Cách đọc dạng đáp ứng khi chỉnh tham số?
Chậm và không tới đích thì thiếu độ mạnh; vọt quá rồi dao động tắt dần thì quá mạnh hoặc thiếu giảm chấn; tới gần rồi dừng lệch một chút thì cần thành phần tích luỹ.
Lỗi lập trình số một trong điều khiển robot?
Nhầm đơn vị — độ với radian, milimet với mét. Nên quy ước dùng đơn vị chuẩn trong toàn bộ mã và chỉ đổi ở chỗ giao tiếp với phần cứng.
Đọc thêm trong Hiệu chỉnh & căn chỉnh và Điện & đấu nối.