Tôi nên thực hiện thuật toán nào để lập trình robot dọn phòng?


25

Đối với câu hỏi này giả định rằng những điều sau đây là không rõ:

  • Kích thước và hình dạng của căn phòng
  • Vị trí của robot
  • Sự hiện diện của bất kỳ trở ngại

Cũng giả sử rằng những điều sau đây là không đổi:

  • Kích thước và hình dạng của căn phòng
  • Số lượng, hình dạng và vị trí của tất cả (nếu có) chướng ngại vật

Và giả sử rằng robot có các thuộc tính sau:

  • Nó chỉ có thể di chuyển về phía trước theo gia số của các đơn vị tuyệt đối và quay theo độ. Ngoài ra, thao tác di chuyển sẽ trả về đúng nếu thành công hoặc sai nếu không di chuyển do vật cản
  • Một nguồn năng lượng hợp lý không giới hạn (giả sử đó là một robot chạy bằng năng lượng mặt trời được đặt trên một trạm không gian luôn phải đối mặt với mặt trời mà không có trần nhà)
  • Mọi chuyển động và xoay đều được thực hiện với độ chính xác tuyệt đối mọi lúc (đừng lo lắng về dữ liệu không đáng tin cậy)

Cuối cùng, hãy xem xét các thuộc tính sau của môi trường robot:

  • Ở trên một trạm không gian không có trần, căn phòng là một khoảng cách an toàn nhưng gần với các sao chổi đi qua, vì vậy bụi (và băng) liên tục xả rác ra môi trường.

Tôi đã được hỏi một phiên bản đơn giản hơn nhiều của câu hỏi này (phòng là một hình chữ nhật và không có trở ngại, làm thế nào bạn di chuyển qua nó để đảm bảo bạn có thể vượt qua mọi phần ít nhất một lần) và sau khi tôi bắt đầu tự hỏi làm thế nào bạn sẽ tiếp cận điều này nếu bạn không thể 't đảm bảo hình dạng hoặc sự hiện diện của chướng ngại vật. Tôi đã bắt đầu xem xét điều này với thuật toán của Dijkstra , nhưng tôi rất thích nghe người khác tiếp cận vấn đề này như thế nào (hoặc nếu có câu trả lời được chấp nhận tốt cho vấn đề này? (Roomba làm như thế nào?)


các thẻ như + thuật toán và lý thuyết + sẽ giúp một câu hỏi như thế này nhưng tôi chưa có danh tiếng để thêm chúng
Jason Sperske

chắc chắn là thứ gì đó tốt hơn Roomba
Bạch tuộc

Hấp dẫn. Tôi có bobsweep và nó được lập trình hoàn hảo momblogsociety.com/meet-newest-addition-family-bobsweep Tôi đề nghị mọi người. Lời chào hỏi!

1
Đây có phải là một quảng cáo? Nếu không, bạn có thể muốn đăng thông tin, thay vì chỉ liên kết, giải thích cách robot hoạt động và tại sao nó chỉ hoàn hảo.
Shahbaz

Câu trả lời:


18

Theo tôi biết, vấn đề này chưa được "giải quyết".

Chính thức, đây là một vấn đề bảo hiểm trực tuyến. Bảo hiểm, bởi vì chúng tôi phải bao gồm từng điểm trên sàn và trực tuyến vì chúng tôi không có quyền truy cập ngoại tuyến vào bản đồ. Nếu bạn quan tâm đến kết quả gần đây nhất, tôi khuyên bạn nên tra cứu " thuật toán bảo hiểm trực tuyến robot ", có lẽ trong học giả google (có rất nhiều kết quả tuyệt vời). Ngoài bài đăng (re) rất sặc sỡ của @ embed.kyle, tôi sẽ thêm một số chi tiết (Tôi cũng sẽ cố gắng nhanh chóng tìm thấy một vài kết quả đơn giản):

  • Dijkstra sẽ giúp bạn có một con đường, nhưng không nhất thiết là một phạm vi bảo hiểm. Ví dụ: làm thế nào để bạn chỉ định cho Dijkstra rằng bạn phải truy cập từng điểm trong biểu đồ, thay vì truy cập một điểm càng nhanh càng tốt? Bạn có thể chạy tất cả các cặp đường dẫn ngắn nhất, nhưng các điểm là gì? Bạn không có bản đồ.

  • Các thuật toán trực tuyến như thế này thường được gọi là thuật toán "lỗi" vì chúng có xu hướng trông giống như một con bọ lang thang trên một khu vực, va vào một cái gì đó, sau đó đi lang thang xung quanh nó một chút.

  • Không có chướng ngại vật, và một căn phòng hình chữ nhật, và giả sử bạn bắt đầu trên ranh giới, một con đường boustrophedon (cách của con bò) là tối ưu. nhập mô tả hình ảnh ở đây

Thật buồn cười là nông dân đã làm điều này mãi mãi, phải không? http://en.wikipedia.org/wiki/Boustrophedon . Điều này có thể được mở rộng đến các phòng có chướng ngại vật bằng cách tìm khu vực hình chữ nhật không có chướng ngại vật. Howie Choset đã làm việc này một chút .

  • Để bao phủ một khu vực có chu vi không xác định và giả sử bạn không bắt đầu vào chu vi, chiến lược tối ưu là gì? Chà, hãy tưởng tượng bạn rơi vào thế giới và không thể nhìn thấy chu vi. Bạn có thể đi trên một đường thẳng cho đến khi bạn đạt đến chu vi, sau đó làm một âm thanh, phải không? Ngoại trừ bây giờ bạn "lãng phí" thời gian tìm chu vi, bởi vì bạn sẽ bao gồm phần đó hai lần. Đây là lý do tại sao robot có xu hướng xoắn ốc: Vào thời điểm bạn đạt đến một ranh giới, bạn đã bao phủ rất nhiều khu vực ( trong đó là khoảng cách đến ranh giới gần nhất , phải không?). Điều này rất hữu ích: bây giờ bạn được đảm bảo tìm thấy ranh giới gần nhất và có thể tìm ra nó. dπ*d2d
  • Đây là một khu vực rộng lớn, hấp dẫn. Tôi xin lỗi tôi không thể cung cấp một bản tóm tắt tốt hơn!

Vấn đề lớn nhất là bạn không có bản đồ. Không có bản đồ, bạn bị giới hạn trong các hành động đơn giản như chu vi theo sau và di chuyển dọc theo một con đường (như hình xoắn ốc được đề cập). Vì vậy, tồn tại một số robot thực sự xây dựng bản đồ trong khi làm sạch, phân tách khu vực được ánh xạ thành các hình dạng, sau đó che từng hình dạng để đảm bảo phạm vi bảo hiểm. Xem: http://mintcleaner.com/


9

Roomba bắt đầu theo hình xoắn ốc cho đến khi nó chạm vào thứ gì đó, sau đó thực hiện quét chu vi. Sau đó, nó chỉ bị trả lại xung quanh. Roomba là tiêu chuẩn thực tế trong chất tẩy rửa robot gia dụng, tôi đoán bạn có thể gọi nó là "giải pháp được chấp nhận". Nhưng từ kinh nghiệm cá nhân (tôi sở hữu hai), chắc chắn có chỗ để cải thiện.

Từ cách thức hoạt động :

thuật toán

Từ một cuộc phỏng vấn với Nancyaleighault Smith, Phó chủ tịch truyền thông tiếp thị tại iRobot:

Khi nó bắt đầu, bạn sẽ thấy một mô hình xoắn ốc, nó sẽ xoắn ốc trên một khu vực lớn hơn và lớn hơn cho đến khi nó chạm vào một vật thể. Khi tìm thấy một vật thể, nó sẽ đi dọc theo rìa của vật thể đó trong một khoảng thời gian, và sau đó nó sẽ bắt đầu vượt qua, cố gắng tìm ra khoảng cách lớn nhất mà nó có thể đi mà không chạm vào một vật thể khác, và điều đó giúp nó tìm ra không gian rộng bao nhiêu, nhưng nếu nó kéo dài quá lâu mà không va vào tường, nó sẽ bắt đầu xoắn ốc trở lại, bởi vì nó nhìn thấy nó trong một không gian rộng mở, và nó liên tục tính toán và tìm ra điều đó.

Nó tương tự với các cảm biến bụi bẩn bên dưới, khi một trong những cảm biến đó bị vấp, nó thay đổi hành vi của nó để bao phủ khu vực đó. Sau đó nó sẽ đi ra ngoài để tìm kiếm một khu vực bẩn thỉu khác trên một con đường thẳng. Cách mà các mẫu khác nhau chồng chất lên nhau khi chúng đi, chúng tôi biết rằng đó là cách hiệu quả nhất để bao phủ một căn phòng.

Các mô hình mà chúng tôi đã chọn và cách thuật toán được phát triển ban đầu dựa trên các thuật toán dựa trên hành vi được sinh ra từ MIT nghiên cứu động vật và cách chúng tìm kiếm các khu vực tìm kiếm thức ăn. Khi bạn nhìn vào cách kiến ​​và ong đi ra ngoài và chúng tìm kiếm các khu vực, những loại bảo hiểm này và tìm ra tất cả những điều đó xuất phát từ nghiên cứu đó. Rõ ràng là không chính xác, tôi không nói chúng ta là ong mật, nhưng đó là sự hiểu biết về cách tìm kiếm một khu vực trong tự nhiên, đó là nền tảng đằng sau cách công nghệ thích ứng của chúng ta được phát triển.

Một số bức ảnh phơi sáng dài của Roombas với đèn LED trên đó minh họa cách nó hoạt động trong thực tế:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Đây có phải là một nội dung sao chép từ liên kết?
Josh Vander Hook

@Josh Các tài liệu liên quan để trả lời câu hỏi đã được sao chép từ các trang web được liên kết và được đặt trong một blockquote để ngăn ngừa thối liên kết.
embed.kyle

7

Neato sử dụng một cách tiếp cận có tổ chức. Sử dụng SLAM và các bộ đệm, nó sẽ ánh xạ phòng 'hiện tại', chu vi trước, sau đó áp dụng một số thuật toán để làm sạch hiệu quả nhất có thể. Tôi chưa bao giờ sở hữu một Roomba, nhưng với những gì tôi đã đọc về thuật toán của nó, tôi sẽ không bao giờ chuyển từ gọn gàng.

Công cụ tìm phạm vi Laser trong gọn gàng thường không thể điều chỉnh được cho robot, vì nó là một cảm biến hiệu quả về chi phí cho các thuật toán SLAM.

Nếu tôi được giao nhiệm vụ của bạn, Đầu tiên tôi sẽ tìm thấy một triển khai SLAM phù hợp , dựa trên phần cứng tôi có.

Sau đó, tôi sẽ sử dụng thuật toán lập kế hoạch chuyển động CNC ISLAND . Kinh nghiệm của tôi là họ có xu hướng rất hiệu quả trong việc bao phủ một khu vực tùy ý với ít chuyển động nhất.


SLAM không phù hợp cho vấn đề này vì đây là mô phỏng trong đó không có sự không chắc chắn trong định vị. Đối với một robot thực sự, bạn hoàn toàn đúng.
Ian

Tôi đã bỏ lỡ điều đó (nếu nó ở đó). Trên thực tế, nó nói như sau là không rõ; vị trí của robot.
Sp3

Tôi đã nghĩ rằng vị trí bắt đầu là không xác định nhưng như một cấu trúc liên kết của căn phòng được tạo ra, nó có thể được biết đến.
Jason Sperske

Đây là một trong những vấn đề học thuật kỳ quặc mà sự đơn giản hóa tạo ra những hàm ý lạ. Vì bạn không có bản đồ, không có vị trí bắt đầu, vị trí hoàn hảo và không có thực thể bên ngoài để phối hợp, vị trí tuyệt đối là không liên quan. Bạn tự ý quyết định rằng (0,0) là nơi bắt đầu của bạn, sau đó xây dựng bản đồ của bạn so với điểm đó. Điều này không thực sự thiết thực trong thế giới thực, nhưng nó cung cấp cho bạn một số thực hành với các thuật toán bao phủ.
Ian

Câu trả lời của bạn là tốt từ quan điểm hệ thống. Tuy nhiên, tôi tin rằng câu hỏi này là một câu hỏi lý thuyết / thuật toán tốt hơn.
Josh Vander Hook

6

Điều đầu tiên bạn cần thiết lập là mục tiêu của robot - không hoàn toàn rõ ràng từ câu hỏi của bạn. Có hai nhiệm vụ chính mà robot của bạn phải hoàn thành: khám phá hình dạng của khu vực có thể làm sạch, sau đó làm sạch nó.

Nhưng là số lượng bụi bẩn không đổi? Là bụi bẩn được thêm liên tục? Đó có phải là mục tiêu của bạn để giảm thiểu thời gian trung bình mà bụi bẩn vẫn còn trên sàn, hoặc thời gian trung bình? Là mục tiêu để giữ cho sàn sạch như nhau? Hay chỉ là để làm sạch một lần, càng nhanh càng tốt? Có những mô hình trong sự tích tụ của bụi bẩn mà bạn có thể đo lường và sử dụng để lợi thế của bạn trong việc hoàn thành mục tiêu của bạn?

Câu trả lời cho những câu hỏi này sẽ giúp hướng dẫn thuật toán bạn chọn. Trong trường hợp robot của Roomba, có thể không có lý do gì để học cách bố trí chính xác của căn phòng vì đồ đạc (như ghế quanh bàn), con người và các chướng ngại vật khác di chuyển rất thường xuyên. Tuy nhiên, trong trường hợp của bạn, có thể tốt hơn là khám phá không gian để xây dựng một bản đồ hoàn chỉnh (một số kết hợp của mẫu máy cắt cỏ với các cạnh tìm), sau đó sử dụng bản đồ đó để tính đường đi ngắn nhất qua không gian (thuật ngữ là "vùng phủ sóng", và có một số cách để làm điều đó, ví dụ thuật toán cây bao trùm ).

Một điều nữa bạn sẽ cần lo lắng là làm thế nào để phân biệt không gian bạn đang ở. Bởi vì bạn có thể di chuyển theo bất kỳ hướng nào - ngay cả với số lượng độ và đơn vị số nguyên khoảng cách - vị trí X và Y của bạn có thể có phân số các giá trị. Bạn sẽ cần phải quyết định cách thể hiện các chướng ngại vật trên bản đồ đó mà không cần phải tăng lên vô số điểm dữ liệu.


Kể từ khi tôi buồn bã làm cho một câu hỏi phỏng vấn khó hơn về bản thân mình, tôi cho rằng tôi có thể đưa ra một số thông tin thêm. Tôi thích những điểm bạn đang nâng lên :)
Jason Sperske

2

Tôi không chắc nếu bạn vẫn cần nó, nhưng đối với những người tình cờ tìm kiếm chủ đề này, tôi đã tạo ra một phiên bản đơn giản của thuật toán.

Về cơ bản, nó cố gắng xây dựng bản đồ của khu vực trong khi nó dọn dẹp, và nó sử dụng bản đồ để tìm nút không bị chặn gần nhất (một phần của căn phòng). Khi không thể tìm thấy bất kỳ thứ gì, điều đó có nghĩa là căn phòng đã được dọn sạch (hoặc các bộ phận không sạch sẽ không thể truy cập được bởi robot).

Nó có thể chậm hơn các thuật toán khác, nhưng nó có thể đảm bảo phạm vi bảo hiểm bất kể vị trí bắt đầu, hướng và chướng ngại vật.

https://github.com/dungba88/cleaner_robot

CẬP NHẬT: Tôi đã thực hiện một bản demo ở đây và so sánh nó với một DFS quay lại. Vì vậy, mặc dù thuật toán của tôi là O (N ^ 2), nó được tối ưu hóa hơn nhiều về số lần di chuyển và lượt.

http://jenova.dungba.org/cleaner/showdown


Thật thú vị, vì vậy nó phá vỡ căn phòng thành một lưới 2D, tôi vẫn đang đọc mã của bạn, bạn sử dụng phương pháp tìm đường nào để tiếp cận các khu vực ô uế của mình? Dijkstra?
Jason Sperske

Tôi đã sử dụng BFS để tìm vị trí ô uế gần nhất.
Anh Dũng Bùi

-1

Nhìn vào vấn đề đơn giản hơn mà bạn được hỏi - một căn phòng hình chữ nhật, không có chướng ngại vật và làm sạch mọi bộ phận ít nhất một lần.

Giải pháp là tìm một góc phòng và tìm một góc sẽ không phải là vấn đề lớn. Một khi điều đó đã đạt được, sau đó chỉ cần đi theo một con đường xoắn ốc đến trung tâm của căn phò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.