Làm cách nào tôi có thể sử dụng thư viện Arduino PID để điều khiển robot theo đường thẳng?


19

Tôi muốn tạo ra một robot dựa trên Arduino với 2 bánh xe, bộ mã hóa cầu phương trên mỗi bánh xe, chip điều khiển cầu H (hoặc bộ điều khiển động cơ) và một caster. Tôi muốn sử dụng thư viện PID để đảm bảo tốc độ tỷ lệ thuận với khoảng cách di chuyển.

Ở cấp độ khái niệm, (giả sử các động cơ không phản ứng giống hệt với các mức PWM) làm thế nào tôi có thể thực hiện điều khiển PID để nó di chuyển theo đường thẳng và với tốc độ tỷ lệ thuận với quãng đường còn lại để di chuyển?


Câu hỏi này cũng có vị trí của nó ở đây, vì nó đặc biệt dựa trên thư viện Arduino PID .
Anindo Ghosh

Câu trả lời:


18

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 PIDvà cuối cùng viết ra cả hai giá trị PWM.

Hiện tại SetpointLeftSetpointRightthự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.

Xác định chết

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.


1

Nếu bạn không sử dụng một trục duy nhất để lái cả hai bánh, các giải pháp duy nhất tôi có thể thấy là thêm một gia tốc kế 3 trục hoặc một cảm biến khác để phát hiện hướng của robot và điều chỉnh tín hiệu cho từng động cơ phù hợp.


0

Như đã nói ở trên, bạn bắt đầu bằng cách bảo mỗi bánh xe di chuyển với cùng tốc độ và sau đó PID đảm bảo chúng đang chạy ở tốc độ đó. Nhưng điều này sẽ KHÔNG hoàn hảo. Bạn cần tiếp tục kiểm tra và sửa lỗi (1) định kỳ đọc và so sánh số lượng bộ mã hóa hai bánh xe và làm cho một bánh xe đi nhanh hơn một chút nếu cần để có được số đếm bằng nhau. và (2) bộ mã hóa KHÔNG BAO GIỜ là hoàn hảo, bạn cần một gia tốc kế và la bàn.

Bạn đang xem một bộ lọc Kalman. nếu bạn muốn kết hợp dữ liệu mã hóa, la bàn và gia tốc kế để cung cấp cho bạn tiêu đề.


0

Liên kết này đưa ra một ví dụ tốt mà không cần hai phép tính PID. Ngoài ra, bạn có thể thực hiện imu / la bàn để đo đường thẳng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.