Cụ thể
Nhìn vào ví dụ cơ bản về PID Tôi nghĩ rằng bạn chỉ cần khởi tạo hai bản sao của bộ điều khiển PID, một bản sao cho mỗi bánh xe, bộ mã hóa và pwm:
PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);
Sau đó, trong loop()
tương đương của bạn , bạn chỉ cần đọc cả hai bộ mã hóa, chuyển từng giá trị bộ mã hóa cho giá trị liên quan PID
và cuối cùng viết ra cả hai giá trị PWM.
Hiện tại SetpointLeft
và SetpointRight
thực sự có thể trỏ đến cùng một giá trị, nhưng việc xác định chúng một cách riêng biệt như thế này cho phép bạn thêm khả năng để chuyển sau này.
Các khái niệm
Mặc dù điều này có thể hoạt động cho trường hợp cơ bản, nhưng nó có thực sự đủ hay không phụ thuộc vào mức độ chính xác mà bạn cần đường thẳng của mình.
Cho rằng bạn có bộ mã hóa trên mỗi bánh xe, nếu bạn chạy hai vòng PID và so sánh lỗi sau của từng bánh xe , thì bạn có thể tính được lỗi abbe tối đa của mình trên khoảng cách, giả sử bánh xe của bạn không trượt. Nếu lỗi đó nhỏ hơn yêu cầu của bạn, thì tính toán chết là tất cả những gì bạn cần.
Tuy nhiên, nếu bánh xe của bạn dễ bị trượt, thì bạn có thể đã ẩn lỗi sau mà hệ thống điều khiển của bạn không thể phát hiện và bạn sẽ cần một cách nào đó để phát hiện trượt hoặc tính toán vị trí độc lập với bộ mã hóa bánh xe của bạn và sau đó sử dụng phần mềm cấp cao hơn để sửa yêu cầu vị trí / vận tốc bánh xe để duy trì một đường thẳng.
Xác định vị trí tương đối
Như John gợi ý , bạn có thể sử dụng gia tốc kế để xác định vị trí, nhưng với độ chính xác của chúng và ảnh hưởng của các lỗi tích lũy theo thời gian, bạn có thể sử dụng dữ liệu gia tốc để phát hiện và sửa lỗi trượt bánh xe tốt hơn.
Trong robot di động, kỹ thuật lọc Kalman thường được sử dụng để hợp nhất dữ liệu từ nhiều nguồn, chẳng hạn như gia tốc kế và bộ mã hóa bánh xe để xác định vị trí hiện tại tốt hơn.
Tuy nhiên, bất cứ điều gì bạn làm với xác định vị trí tương đối, theo thời gian, vị trí bạn tin rằng mình sẽ đứng sẽ rời khỏi vị trí thực tế của bạn.
Xác định vị trí tuyệt đối
Cách duy nhất để giải quyết vấn đề này là có một điểm tham chiếu bên ngoài khung tham chiếu phương tiện của bạn.
Ví dụ, một roomba thường sử dụng tính toán chết để di chuyển xung quanh một căn phòng, nhưng bất cứ khi nào nó cần cập bến, nó sẽ tìm kiếm một chùm ánh sáng hồng ngoại được gửi bởi dock sạc. Khi roomba ngẫu nhiên di chuyển qua chùm tia đó, nó phát hiện ra nó, khóa vào chùm tia và theo nó trở về nguồn của nó. Kết hợp với cảm biến va chạm, nó có thể tự định vị chính xác trên các tiếp điểm sạc.
Đối với robot của bạn, nó có thể có một vị trí nhà, nơi nó có thể di chuyển trở lại và phát hiện ra rằng nó đang ở vị trí đã biết. Tại thời điểm đó, nó biết chính xác vị trí của nó và có thể báo cáo vị trí được tính của nó cách vị trí thực tế bao xa.
Một lựa chọn khác, nếu bạn cần robot của mình di chuyển trên một đường thẳng trên hàng trăm mét sẽ là chuyển sang một kỹ thuật khác, chẳng hạn như thêm một lá chắn Arduino GPS .
Một sự kết hợp của các kỹ thuật
Cuối cùng, tùy thuộc vào yêu cầu độ chính xác của bạn, bạn có thể cần phải sử dụng kết hợp các kỹ thuật này.
Nếu một chùm hướng dẫn là có thể, bạn có thể thực hiện những gì bạn muốn rất đơn giản với một kỹ thuật theo dòng vô hình . Nếu bạn cần di chuyển theo bất kỳ đường thẳng tùy ý nào trong một khu vực bị giới hạn, thì giống như roomba, bạn có thể sử dụng một cặp chùm dẫn hướng (ở góc phải với nhau) để cho phép bạn điều chỉnh vị trí tổng hợp của mình theo một trục Cartesian mỗi khi robot vượt qua một trong các chùm tia.
Có rất nhiều lựa chọn ở đây, và những gì bạn chọn sẽ phụ thuộc vào những gì bạn cần.