ฉันควรใช้อัลกอริธึมอะไรในการเขียนโปรแกรมหุ่นยนต์ทำความสะอาดห้องพัก


25

สำหรับคำถามนี้สมมติว่าไม่ทราบสิ่งต่อไปนี้:

  • ขนาดและรูปร่างของห้อง
  • ตำแหน่งของหุ่นยนต์
  • การปรากฏตัวของอุปสรรคใด ๆ

นอกจากนี้สมมติว่าสิ่งต่อไปนี้คงที่:

  • ขนาดและรูปร่างของห้อง
  • จำนวนรูปร่างและที่ตั้งของสิ่งกีดขวาง (ถ้ามี) ทั้งหมด

และสมมติว่าหุ่นยนต์มีคุณสมบัติดังต่อไปนี้:

  • สามารถเคลื่อนที่ไปข้างหน้าด้วยการเพิ่มหน่วยสัมบูรณ์และหมุนเป็นองศาเท่านั้น นอกจากนี้การดำเนินการที่ย้ายจะกลับเป็นจริงถ้าสำเร็จหรือเท็จหากไม่สามารถย้ายได้เนื่องจากมีสิ่งกีดขวาง
  • แหล่งพลังงานที่ไม่ จำกัด อย่างสมเหตุสมผล (สมมติว่ามันเป็นหุ่นยนต์พลังงานแสงอาทิตย์วางบนสถานีอวกาศที่หันหน้าไปทางดวงอาทิตย์ตลอดเวลาโดยไม่มีเพดาน)
  • ทุกการเคลื่อนไหวและการหมุนจะดำเนินการอย่างแม่นยำทุกครั้ง (ไม่ต้องกังวลกับข้อมูลที่ไม่น่าเชื่อถือ

สุดท้ายโปรดพิจารณาคุณสมบัติต่อไปนี้ของสภาพแวดล้อมของหุ่นยนต์:

  • การอยู่บนสถานีอวกาศที่มีเพดานน้อยห้องพักมีความปลอดภัย แต่อยู่ใกล้กับดาวหางที่ผ่านมาอย่างน่าหงุดหงิดดังนั้นฝุ่น (และน้ำแข็ง) จึงถูกทิ้งร้างอย่างต่อเนื่อง

ฉันถูกถามคำถามแบบนี้ง่ายกว่ามาก (ห้องเป็นรูปสี่เหลี่ยมผืนผ้าและไม่มีสิ่งกีดขวางคุณจะเคลื่อนไหวอย่างไรเพื่อให้แน่ใจว่าคุณสามารถผ่านทุกส่วนอย่างน้อยหนึ่งครั้ง) และหลังจากฉันเริ่มสงสัยว่าคุณจะเข้าใกล้เรื่องนี้อย่างไรถ้าคุณไม่สามารถ ไม่รับประกันรูปร่างหรือการมีสิ่งกีดขวาง ฉันเริ่มดูสิ่งนี้ด้วยอัลกอริธึมของ Dijkstraแต่ฉันรู้สึกทึ่งที่ได้ยินว่าคนอื่นเข้าหาวิธีนี้ได้อย่างไร (หรือถ้ามีคำตอบที่ยอมรับได้ดีในเรื่องนี้ (Roomba ทำเช่นนั้นได้อย่างไร)


แท็กเช่น + ขั้นตอนวิธีการและทฤษฎี + จะช่วยให้คำถามเช่นนี้ แต่ผมไม่ได้มีชื่อเสียงที่จะเพิ่มพวกเขายัง
เจสัน Sperske

มีบางอย่างที่ดีกว่า Roomba
Octopus

น่าสนใจ ฉันมี bobsweep และเป็นโปรแกรมที่สมบูรณ์แบบเพียงแค่momblogsociety.com/meet-newest-addition-family-bobsweepฉันขอแนะนำให้ทุกคน ทักทาย!

1
นี่คือโฆษณาหรือไม่ ถ้าไม่ใช่คุณอาจต้องการโพสต์ข้อมูลแทนที่จะเป็นเพียงลิงก์อธิบายว่าหุ่นยนต์มีพฤติกรรมอย่างไรและทำไมมันถึงสมบูรณ์แบบ
Shahbaz

คำตอบ:


18

เท่าที่ฉันรู้ปัญหานี้ยังไม่ได้รับการแก้ไข

นี่เป็นปัญหาออนไลน์อย่างเป็นทางการ ความครอบคลุมเนื่องจากเราต้องครอบคลุมแต่ละจุดบนพื้นและออนไลน์เพราะเราไม่สามารถเข้าถึงแผนที่แบบออฟไลน์ หากคุณสนใจผลลัพธ์ล่าสุดฉันขอแนะนำให้คุณค้นหา " อัลกอริทึมการครอบคลุมออนไลน์ของหุ่นยนต์ " บางทีใน Google Scholar (มีผลลัพธ์ที่ยอดเยี่ยมมากมายและมากมาย ) นอกจากการโพสต์ที่มีสีสันมาก (อีกครั้ง) ของ @ embedded.kyle แล้วฉันจะเพิ่มรายละเอียด (ฉันจะพยายามค้นหาผลลัพธ์ง่ายๆบางอย่างได้อย่างรวดเร็ว):

  • Dijkstra ของคุณจะได้รับเส้นทาง แต่ไม่จำเป็นต้องครอบคลุม ตัวอย่างเช่นคุณจะระบุถึง Dijkstra ได้อย่างไรว่าคุณต้องไปแต่ละจุดในกราฟแทนที่จะไปที่จุดใดจุดหนึ่งโดยเร็วที่สุด คุณสามารถเรียกใช้เส้นทางที่สั้นที่สุดของทุกคู่ได้ แต่ประเด็นคืออะไร คุณไม่มีแผนที่

  • อัลกอริธึมออนไลน์เช่นนี้มักเรียกว่า "บั๊ก" อัลกอริธึมเพราะพวกมันมักจะดูเหมือนว่าแมลงหลงไปทั่วพื้นที่ชนเข้ากับอะไรบางอย่างจากนั้นก็เดินไปรอบ ๆ

  • โดยไม่มีสิ่งกีดขวางและห้องสี่เหลี่ยมและสมมติว่าคุณจะเริ่มต้นในเขตแดน boustrophedon (ที่ทางของวัว) เส้นทางที่ดีที่สุด ป้อนคำอธิบายรูปภาพที่นี่

ตลกที่เกษตรกรทำเช่นนี้ตลอดไปใช่ไหม http://en.wikipedia.org/wiki/Boustrophedon สิ่งนี้สามารถขยายไปยังห้องที่มีสิ่งกีดขวางได้โดยการค้นหาพื้นที่สี่เหลี่ยมมุมฉากซึ่งปราศจากสิ่งกีดขวาง โฮวี่โชเซ็ตทำงานในบิตนี้

  • πd2d
  • นี่เป็นพื้นที่ขนาดใหญ่ที่น่าหลงใหล ฉันขอโทษฉันไม่สามารถให้บทสรุปที่ดีกว่านี้ได้!

ปัญหาที่ใหญ่ที่สุดคือคุณไม่มีแผนที่ หากไม่มีแผนที่คุณจะถูก จำกัด ให้ดำเนินการอย่างง่ายเช่นติดตามรอบ ๆ และเคลื่อนที่ไปตามเส้นทาง (เช่นเกลียวที่ระบุ) ดังนั้นจึงมีหุ่นยนต์บางตัวที่สร้างแผนที่จริง ๆ ในขณะที่ทำความสะอาดย่อยสลายพื้นที่ที่แมปออกเป็นรูปร่างแล้วจึงครอบคลุมแต่ละรูปร่างเพื่อให้แน่ใจว่าครอบคลุม ดู: http://mintcleaner.com/


9

Roomba เริ่มเป็นเกลียวจนกระทั่งมันกระทบอะไรบางอย่างจากนั้นก็กวาดรอบนอก จากนั้นมันก็เด้งไปมา Roomba เป็นมาตรฐานอย่างแท้จริงในเครื่องทำความสะอาดสูญญากาศในครัวเรือนหุ่นยนต์ฉันคิดว่าคุณสามารถเรียกมันว่า "ทางออกที่ยอมรับ" แต่จากประสบการณ์ส่วนตัว (ฉันเป็นเจ้าของสองคน) มีที่ว่างสำหรับการปรับปรุงอย่างแน่นอน

จากการทำงานของ Stuff :

ขั้นตอนวิธี

จากการสัมภาษณ์กับ Nancy Dussault Smith รองประธานฝ่ายสื่อสารการตลาดที่ iRobot:

เมื่อเริ่มต้นคุณจะสังเกตเห็นลวดลายเกลียวมันจะหมุนวนไปทั่วพื้นที่ที่ใหญ่กว่าและใหญ่กว่าจนกระทั่งมันชนกับวัตถุ เมื่อพบวัตถุมันจะตามไปตามขอบของวัตถุนั้นเป็นระยะเวลาหนึ่งจากนั้นมันจะเริ่มข้ามที่คมชัดพยายามคิดหาระยะทางที่ใหญ่ที่สุดที่มันสามารถไปได้โดยไม่ต้องชนวัตถุอื่นและช่วยให้มันคิด พื้นที่ใหญ่แค่ไหน แต่ถ้ามันใช้เวลานานเกินไปโดยไม่ชนกำแพงมันจะเริ่มหมุนวนอีกครั้งเพราะมันอยู่ในที่โล่งกว้างและมันคำนวณและหาข้างนอกอยู่ตลอดเวลา

มันคล้ายกับเซ็นเซอร์จับสิ่งสกปรกใต้เมื่อเซ็นเซอร์ตัวใดตัวหนึ่งได้รับการสะดุดมันจะเปลี่ยนพฤติกรรมเพื่อให้ครอบคลุมพื้นที่นั้น มันจะดับลงเพื่อค้นหาพื้นที่สกปรกอื่นในเส้นทางตรง วิธีการที่รูปแบบที่แตกต่างกันเหล่านี้ซ้อนกันเมื่อเราไปเรารู้ว่านั่นเป็นวิธีที่มีประสิทธิภาพที่สุดในการปกปิดห้อง

รูปแบบที่เราเลือกและวิธีการพัฒนาอัลกอริทึมนั้นมาจากพื้นฐานของอัลกอริธึมตามพฤติกรรมที่เกิดจาก MIT ศึกษาสัตว์และวิธีที่พวกเขาไปค้นหาพื้นที่สำหรับอาหาร เมื่อคุณดูว่ามดและผึ้งออกไปได้อย่างไรและพวกมันค้นหาพื้นที่การครอบคลุมและการจำแนกสิ่งเหล่านี้ทั้งหมดมาจากการวิจัย เห็นได้ชัดว่าฉันไม่ได้บอกว่าเราเป็นผึ้ง แต่เป็นความเข้าใจในการค้นหาพื้นที่ในธรรมชาติที่เป็นพื้นฐานเบื้องหลังการพัฒนาเทคโนโลยีการปรับตัวของเรา

ภาพการเปิดรับแสงนานของ Roombas ที่มีไฟ LED แสดงให้เห็นว่ามันทำงานอย่างไรในทางปฏิบัติ:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


นี่เป็นเนื้อหาคัดลอกวางจากลิงค์หรือไม่
Josh Vander Hook

@Josh เนื้อหาที่เกี่ยวข้องเพื่อตอบคำถามถูกคัดลอกมาจากไซต์ที่เชื่อมโยงและวางไว้ในบล็อกโควตเพื่อป้องกันการเน่าลิงก์
embedded.kyle

7

Neato ใช้วิธีการจัดระเบียบ การใช้ SLAM และกันชนจะทำการแมปห้อง 'ปัจจุบัน' รอบนอกก่อนจากนั้นจึงใช้อัลกอริทึมในการทำความสะอาดอย่างมีประสิทธิภาพที่สุด ฉันไม่เคยเป็นเจ้าของ Roomba แต่ให้สิ่งที่ฉันได้อ่านเกี่ยวกับอัลกอริทึมฉันจะไม่เปลี่ยนจากเรียบร้อย

เครื่องมือค้นหาระยะเลเซอร์ในประณีตนั้นมักจะไม่สามารถปรับให้เหมาะกับหุ่นยนต์ได้เนื่องจากเป็นเซ็นเซอร์ที่คุ้มค่าสำหรับอัลกอริทึม SLAM

ถ้าฉันได้รับงานของคุณอันดับแรกฉันจะหาการใช้SLAMที่เหมาะสมโดยยึดตามฮาร์ดแวร์ที่ฉันมี

จากนั้นฉันก็จะใช้อัลกอริทึมการวางแผนการเคลื่อนไหวของ ISLAND CNC ประสบการณ์ของฉันคือพวกเขามีแนวโน้มที่จะมีประสิทธิภาพมากที่ครอบคลุมพื้นที่โดยพลการกับการเคลื่อนไหวน้อยที่สุด


SLAM ไม่ค่อยเหมาะสมสำหรับปัญหานี้เพราะเป็นการจำลองสถานการณ์ที่ไม่มีความไม่แน่นอนในการวางตำแหน่ง สำหรับหุ่นยนต์ตัวจริงคุณคิดถูกแล้ว
เอียน

ฉันพลาดนั่น (ถ้ามี) จริงๆแล้วมันบอกว่าสิ่งต่อไปนี้ไม่เป็นที่รู้จัก ตำแหน่งของหุ่นยนต์
Spiked3

ฉันคิดว่าสถานที่ตั้งเริ่มเป็นที่รู้จัก แต่เมื่อรูปร่างของห้องถูกสร้างขึ้นมันอาจกลายเป็นที่รู้จัก
Jason Sperske

นี่เป็นหนึ่งในปัญหาทางวิชาการที่แปลก ๆ เนื่องจากคุณไม่มีแผนที่ไม่มีตำแหน่งเริ่มต้นการวางตำแหน่งที่สมบูรณ์แบบและไม่มีหน่วยงานภายนอกที่จะประสานงานด้วยตำแหน่งที่แน่นอนจึงไม่เกี่ยวข้อง คุณตัดสินใจโดยพลการว่า (0,0) เป็นสถานที่เริ่มต้นของคุณจากนั้นสร้างแผนที่ของคุณเทียบกับจุดนั้น สิ่งนี้ไม่ได้ใช้งานได้จริงในโลกแห่งความเป็นจริง แต่ให้การฝึกฝนกับอัลกอริธึมการครอบคลุม
เอียน

คำตอบของคุณดีจากมุมมองของระบบ อย่างไรก็ตามฉันเชื่อว่าคำถามนี้เป็นคำถามทฤษฎี / อัลกอริทึมที่ดีกว่า
Josh Vander Hook

6

สิ่งแรกที่คุณต้องสร้างคือเป้าหมายของหุ่นยนต์ - ไม่ชัดเจนจากคำถามของคุณ มีภารกิจหลักสองประการที่หุ่นยนต์ของคุณต้องทำให้สำเร็จคือการค้นพบรูปร่างของพื้นที่ที่สามารถทำความสะอาดได้จากนั้นทำความสะอาด

แต่ปริมาณของสิ่งสกปรกคงที่หรือไม่? มีการเพิ่มสิ่งสกปรกอย่างต่อเนื่องหรือไม่? เป็นเป้าหมายของคุณหรือไม่ที่จะลดเวลาเฉลี่ยที่สิ่งสกปรกตกค้างบนพื้นหรือเวลาเฉลี่ย? เป้าหมายของการทำความสะอาดพื้นอย่างเท่าเทียมกันคืออะไร? หรือเป็นเพียงการทำความสะอาดเพียงครั้งเดียวโดยเร็วที่สุด? มีรูปแบบในการสะสมของสิ่งสกปรกที่คุณสามารถวัดและใช้เพื่อประโยชน์ของคุณในการบรรลุเป้าหมายของคุณหรือไม่

คำตอบสำหรับคำถามเหล่านี้จะช่วยแนะนำอัลกอริทึมที่คุณเลือก ในกรณีของหุ่นยนต์ Roomba อาจไม่มีจุดเรียนรู้รูปแบบที่แน่นอนของห้องเพราะเฟอร์นิเจอร์ (เช่นเก้าอี้รอบโต๊ะ) ผู้คนและอุปสรรคอื่น ๆ ย้ายบ่อยมาก อย่างไรก็ตามในกรณีของคุณอาจเป็นการดีกว่าที่จะสำรวจพื้นที่เพื่อสร้างแผนที่ที่สมบูรณ์ (การรวมกันของรูปแบบการตัดหญ้ากับการค้นหาขอบ) จากนั้นใช้แผนที่นั้นเพื่อคำนวณเส้นทางที่สั้นที่สุดผ่านช่องว่าง (คำว่า "ครอบคลุม" และมีหลายวิธีที่จะทำเช่นอัลกอริธึมการขยายต้นไม้ )

อีกสิ่งหนึ่งที่คุณต้องกังวลคือการแยกพื้นที่ที่คุณอยู่ออกไปเพราะคุณสามารถเคลื่อนที่ไปในทิศทางใดก็ได้ - ถึงแม้จะมีจำนวนเต็มจำนวนองศาและจำนวนเต็มของระยะทาง - ตำแหน่ง X และ Y ของคุณอาจเป็นเศษส่วน ค่า คุณจะต้องตัดสินใจว่าจะเป็นตัวแทนของอุปสรรคบนแผนที่นั้นอย่างไรโดยไม่ต้องเพิ่มเป็นจำนวนจุดข้อมูลที่ไม่ จำกัด


เพราะฉันทำคำถามสัมภาษณ์อย่างหนักในตัวฉันเองฉันคิดว่าฉันสามารถหาข้อมูลเพิ่มเติมได้ ผมชอบจุดที่คุณมีการระดม :)
เจสัน Sperske

2

ฉันไม่แน่ใจว่าคุณยังต้องการมันหรือไม่ แต่สำหรับผู้ที่เกิดขึ้นกับ google สำหรับหัวข้อนี้ฉันได้สร้างอัลกอริทึมรุ่นง่าย ๆ

โดยพื้นฐานแล้วมันจะพยายามสร้างแผนที่ของพื้นที่ในขณะที่มันทำความสะอาดและมันจะใช้แผนที่เพื่อค้นหาโหนดที่ไม่มีการป้องกันที่ใกล้ที่สุด (ส่วนหนึ่งของห้อง) เมื่อไม่พบสิ่งใดนั่นหมายความว่าห้องนั้นได้รับการทำความสะอาดแล้ว (หรือส่วนที่ไม่สะอาดซึ่งหุ่นยนต์ไม่สามารถเข้าถึงได้)

อาจช้ากว่าอัลกอริธึมอื่น ๆ แต่สามารถรับประกันความครอบคลุมโดยไม่คำนึงถึงตำแหน่งเริ่มต้นทิศทางและอุปสรรค

https://github.com/dungba88/cleaner_robot

UPDATE: ฉันได้ทำการสาธิตที่นี่และเปรียบเทียบกับ DFS backtracking ดังนั้นแม้ว่าอัลกอริทึมของฉันคือ O (N ^ 2) แต่ก็มีการปรับให้เหมาะสมมากขึ้นในแง่ของจำนวนการเคลื่อนไหวและการเลี้ยว

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


น่าสนใจดังนั้นมันจึงแบ่งห้องออกเป็นตารางสองมิติฉันยังคงอ่านโค้ดของคุณคุณใช้วิธีการค้นหาเส้นทางแบบใดเพื่อไปยังภูมิภาคที่ไม่สะอาดของคุณ Dijkstra?
Jason Sperske

ฉันใช้ BFS เพื่อค้นหาตำแหน่งที่ไม่สะอาดที่สุด
Anh DũngBùi

-1

ดูปัญหาที่ง่ายกว่าที่คุณถูกถาม - ห้องรูปสี่เหลี่ยมผืนผ้าไม่มีสิ่งกีดขวางและทำความสะอาดทุกส่วนอย่างน้อยหนึ่งครั้ง

ทางออกคือการหามุมห้องและการหามุมจะไม่เป็นปัญหาใหญ่ เมื่อทำสำเร็จแล้วให้ไปตามเส้นทางเกลียวไปยังศูนย์กลางของห้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.