Triển khai thuật toán PID sử dụng thị giác máy tính


10

Tôi đang xây dựng một bộ giải mê cung mê cung tự động và sử dụng webcam để điều khiển mê cung của mình.

Dựa trên các đề xuất trong các diễn đàn khác, tôi đang cố gắng kiểm soát chuyển động bóng của mê cung ít nhất theo một hướng vào lúc này. Vì vậy, tôi đang cố gắng kiểm soát chuyển động bóng của mình giữa hai tọa độ 466,288 và 466,52. Đầu vào của bảng điều khiển động cơ bước là thời gian, không có bước nào để xoay cho mỗi trục tức là x và y.

Bảng điều khiển động cơ bước mà tôi đang sử dụng là bảng điều khiển động cơ bước bot bot: http://www.sparkfun.com/products/10025

Vì vậy, để di chuyển giữa hai điểm, tôi có nên tạo một số điểm cách giữa hai điểm là 288 và 152 (giả sử 260 240 230 ... 150) và điều chỉnh chuyển động bóng của tôi không?

Thuật toán xử lý hình ảnh của tôi không đủ nhanh để theo dõi quả bóng mà quả bóng sẽ chỉ quay và rơi vào một lỗ.

Một số gợi ý rằng tôi sử dụng một mẫu tiêu chuẩn như trong video sau đây và sửa các chuyển động bóng của tôi cho độ lệch trong đường dẫn:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Tôi cũng đã bắt gặp một công cụ xử lý hình ảnh nơi họ giải quyết vấn đề tương tự bằng cách sử dụng các điểm cho chuyển động bóng. Nhìn thấy quá nhiều giải pháp cho cùng một vấn đề, tôi hoàn toàn bối rối trong việc giải quyết vấn đề. Tôi biết rằng tôi nên thực hiện một bộ điều khiển PID. Nhưng làm thế nào tôi nên đi giải quyết các vấn đề trong các giai đoạn? Tôi bế tắc và thất vọng trong việc tìm kiếm một sự khởi đầu trong việc giải quyết vấn đề.

Thiết lập của tôi trông như thế này:

hình ảnh thiết lập

... và đây là ảnh chụp màn hình phần mềm của tôi:

ảnh chụp màn hình

Bản sửa đổi 2: Bây giờ tôi cũng đang phải đối mặt với một vấn đề mới: Trước đó tôi đã điều khiển các động cơ bước thông qua applet Java cổng nối tiếp Arduino. Tôi có thể lái các stepper bằng applet.

Tôi phải đặt lại bảng mỗi lần tôi cố gắng giao tiếp qua cổng nối tiếp. Ngoài ra, động cơ bước tạo năng lượng cho chính nó trong những khoảng thời gian nhỏ khi không có lệnh nào được gửi đến nó. Khi động cơ bước vào chế độ này, tôi không thể điều khiển bảng của mình mà không đặt lại bảng. Bất kỳ trợ giúp sẽ được đánh giá cao.

Sửa đổi 3:

Tôi đã thực hiện một số tiến bộ trong đó tôi đã thực hiện thuật toán PID. Vui lòng tìm video dưới đây: http://www.youtube.com/watch?v=MEfp7RqPmqY

Bây giờ tôi có một vấn đề với tốc độ thực hiện thuật toán PID. Trên thực tế, quá trình xử lý ảnh của tôi kết thúc một chu kỳ trong 200 ms, xác định một quả bóng và gửi các lệnh đến bảng điều khiển động cơ bước. Mặc dù cổng nối tiếp của tôi được gửi lệnh để chuyển hướng, bước của tôi vẫn tiếp tục quay theo cùng hướng. Bạn có thể tìm thấy hành vi kỳ lạ trong video trên.

Tôi nghĩ rằng tôi nên hạn chế các giá trị PID với mức trần trong đó nếu giá trị PID được tính lớn hơn 100, tôi chỉ nên gửi 100. Tôi mong muốn được nghe suy nghĩ của bạn về điều này.

Cách tôi triển khai bộ điều khiển PID là tôi đã xác định điểm bắt đầu của mẫu bằng thuật toán khớp mẫu và xác định bóng bằng thuật toán khớp mẫu khác. Bây giờ, tôi đã làm cho quả bóng di chuyển đến tâm của mẫu điểm bắt đầu. Làm thế nào để tôi làm cho nó đi theo đường thẳng với thuật toán PID?

Sửa đổi 4:

Quỹ đạo Blob bị cô lập

Tôi đã cách ly quỹ đạo nhưng tôi không thể tìm thấy hàm chính xác để in tọa độ pixel chính xác từ điểm bắt đầu. Có suy nghĩ gì không?


1
Re: Sau đó, chỉ cần đăng một liên kết đến hình ảnh và tôi chắc chắn sẽ có người đi cùng và thay thế nó bằng hình ảnh đó ...
Majenko

@Matt - Đã sửa! Tuy nhiên, tôi muốn người dùng cung cấp văn bản đi kèm với hình ảnh, không chỉ các liên kết đến hình ảnh. Tôi không chắc chắn nơi @Sai muốn họ, tôi chỉ đặt họ ở dưới cùng.
Kevin Vermeer

Wow .... Những bước này có bất cứ nơi nào đủ mô-men xoắn để di chuyển bảng với bất kỳ tốc độ nào không? Tôi hy vọng có một số giảm bánh răng ở đó ở đâu đó.
Sói Connor

@Fake - Các bước sẽ không có vấn đề với điều này. Bảng không nặng nhiều và trọng lượng của nó được cân bằng. Tôi có một chiếc đồng hồ treo tường với hai bàn tay dài 40cm và nó được điều khiển bởi cùng một cơ chế nhỏ như mọi thứ khác, đó cũng là một bước. (Cơ chế 5cmx5cm trông nhỏ một cách lố bịch so với đường kính 80cm của đồng hồ)
stevenvh

@Fake: Steve nói đúng. Tôi không có vấn đề với các bước. Đó là tất cả về thuật toán PID
Sai

Câu trả lời:


2

Đầu tiên, vì các bước rất tốt trong việc định vị (không cần phản hồi vị trí), bạn chắc chắn nên hạn chế chuyển động của chúng như bạn đã nói. Tôi không chắc chắn làm thế nào trục động cơ được thiết kế ngay bây giờ, nhưng nếu nó được cố định vào động cơ, để cho nó tiếp tục quay sẽ có nguy cơ làm hỏng thiết bị.

Tiếp theo, độ trễ vận chuyển 200ms trong cảm biến của bạn có thể sẽ quá chậm, nếu không, bạn sẽ cần làm chậm mọi thứ để làm chậm quả bóng. Tương tự như những gì Rocket Surgeon đã nói, bạn nên đơn giản hóa thuật toán xử lý hình ảnh để tính toán đường dẫn chỉ một lần , và sau đó nhanh chóng chỉ tính toán vị trí của quả bóng trong mỗi khung. Nếu bạn muốn nhanh chóng bỏ qua bước này, hãy tìm một quả bóng màu đỏ thay vì quả bóng này và sau đó chỉ kiểm tra thành phần màu đỏ trong ảnh RGB của bạn, cho đến khi bạn tìm thấy thuật toán tốt hơn.

Đối với điều khiển PID, hãy bắt đầu với thực tế là bạn thực sự cần hai bộ điều khiển PID riêng biệt, một cho động cơ đông-tây, một cho động cơ phía bắc-nam. Nếu bạn có hai động cơ chính xác, các thông số của chúng phải bằng nhau.

Để bộ điều khiển PID hoạt động, nó cần biết lỗi : sự khác biệt giữa vị trí mong muốn và vị trí thực tế của quả bóng. Các thành phần X và Y của phần này sẽ là đầu vào cho hai bộ điều khiển PID (một cho mỗi động cơ). Để nhận được lỗi, trước tiên bạn cần phải có vị trí mong muốn trên đường dẫn của mình: một quỹ đạo .

Để có được quỹ đạo, bạn cần xử lý hình ảnh và nhận đường dẫn , cũng như điểm bắt đầu và điểm kết thúc của nó. Tôi không chắc liệu thuật toán của bạn có khả năng phân biệt đường dẫn với phần còn lại của bảng ngay bây giờ không, nhưng nếu không, lưu ý rằng đây là thuật toán của chính nó để xử lý trước khi tiếp tục. Một lần nữa, bạn có thể bỏ qua phần này bằng cách nhập thủ công các điểm giao nhau, nếu bạn muốn thấy một số kết quả nhanh chóng. Trong mọi trường hợp, bạn sẽ có thể xác định tốc độ điểm đặt và để phần mềm của bạn di chuyển vị trí tọa độ mong muốn trên đường dẫn, từ đầu đến cuối. Rõ ràng, bạn sẽ bắt đầu với tốc độ mong muốn thấp.

Vì vậy, trước khi bắt đầu với kiểm soát, bạn nên đi qua danh sách kiểm tra sau:

  • Đơn giản hóa thuật toán xử lý hình ảnh của bạn để nhận được phản hồi nhanh hơn
  • Tạo một thuật toán tạo quỹ đạo trên đường đi của bạn bằng tốc độ được xác định trước
  • Trong mỗi khung:
    • Tính hiệu số giữa quỹ đạo và vị trí bóng
    • Vượt qua thành phần delta-X cho PID phía đông-tây, vượt qua delta-Y cho PID phía bắc-nam

Nó có thể chỉ ra rằng tốt hơn là tạo một quỹ đạo một phân đoạn tại một thời điểm và tiếp tục với phân đoạn tiếp theo khi quả bóng đó kết thúc phân đoạn trước đó. Mặt khác, bạn sẽ cần lưu ý rằng quả bóng không vượt quá quỹ đạo mong muốn (có thể khó thực hiện)


1

Nếu bạn có một vị trí cố định cho máy ảnh và đọc chữ sao cho cả hai trục, thì bạn không cần phải nhận ra đường dẫn, lỗ và tường được sơn trong khung. Nó có thể được thực hiện một lần trong thời gian thiết lập. Trong thời gian chạy, bạn có thể chỉ cần phát hiện vị trí chính xác của quả bóng kim loại sáng bóng duy nhất.

Để phát hiện bóng bạn có thể sử dụng 1 đèn LED hồng ngoại cố định và bộ lọc băng hẹp trên máy ảnh. Thuật toán phải tính toán pixel sáng nhất và dịch X, Y sang X thực, Y có tính đến các bước như:

  • tìm pixel sáng nhất
  • sử dụng góc cho cả hai trục (đọc từ servo) để thu hồi khoảng cách từ camera
  • sử dụng dấu thời gian để đọc vị trí trục
  • áp dụng phép nội suy theo thời gian để đọc vị trí nếu cần
  • sử dụng biến dạng đã biết của ống kính
  • dịch thế giới X, Y của pixel sang góc phản xạ từ quả cầu hoàn hảo để tìm tâm bóng thực sự trong thế giới X, Y
  • thời gian delta để phục hồi thời gian thực của khung
  • nội suy theo thời gian của vị trí trong mặt phẳng bảng X, Y nếu cần
  • gửi kết quả X, Y (t) cho thuật toán PID
  • gửi mục tiêu nguồn cấp thứ hai X, Y (t) từ trình tạo / chuỗi quỹ đạo
  • hãy để PID quyết định đầu ra
  • thực hiện đầu ra (các bước cuối cùng có thể được thực hiện song song)

Nó không nên được tính toán chuyên sâu và chủ yếu phụ thuộc vào vài giá trị tuyệt đối.

Thông thường, CPU nhỏ nên làm điều đó với tốc độ khung hình.


Tôi không chắc chắn rằng tôi hiểu giải pháp của bạn. Tôi thấy giải pháp của bạn thú vị. Làm thế nào để tôi đảm bảo rằng quả bóng của tôi đang đi đúng đường? Tôi có nên đảm bảo rằng tôi có một bộ điểm tham chiếu không?
Sai

Đúng. Phần mềm điều khiển chuyển động phải luôn có một "bộ tạo quỹ đạo", đây là một thói quen tạo ra chuỗi hữu hạn lý tưởng X, Y (t) cho bất kỳ bước nào trong thời gian nhất định. Trình tự này được đưa đến đầu vào đầu tiên của vòng điều khiển, đầu vào thứ hai của vòng điều khiển là chuỗi các vị trí thực. Thói quen điều khiển phải tính toán các lỗi vị trí / vận tốc / gia tốc và khuếch đại / tổng hợp tất cả các lỗi tương ứng với PID và tạo ra các tín hiệu sửa lỗi.
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.