Mobot#

บทความโดย Cosku Acay, Edwin Cho, Kenneth Li และ Nishant Pol PDF

คำอธิบายโครงการ#

ในการแข่งขัน Mobot ของ Carnegie Mellon หุ่นยนต์ต้องผ่านชุดประตู 14 ประตูที่วางอยู่เหนือเส้นสีขาวโค้งยาว 255 ฟุตบนทางเท้ากลางแจ้ง เส้นทางประกอบด้วยทางลาดชันสองทางและพื้นที่จุดตัดสินใจที่หุ่นยนต์ต้องเลือกเส้นทางที่ถูกต้องเพื่อผ่านประตู 14 ประตูตามลำดับ เนื่องจากเส้นอยู่กลางแจ้งและอยู่ภายใต้สภาพอากาศของ Pittsburgh หุ่นยนต์จึงต้องทำงานได้ในสภาพที่หลากหลาย ปีนี้วันแข่งขันฝนตกและมีลมแรง ข้อมูลเพิ่มเติมสามารถหาได้ที่ http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

โซลูชันด้วย CMUcam4#

เราเลือกที่จะเข้าถึงงานการตามเส้นโดยใช้ CMUcam4 เพราะมันต้องการฮาร์ดแวร์น้อยที่สุดและมีอินเทอร์เฟซที่เหมาะสมอย่างยิ่งสำหรับการติดตามเส้น

Mobot hardware Mobot hardware (full size)

CMUcam4 จับภาพของเส้นที่ 30 เฟรมต่อวินาทีและป้อนภาพการติดตามสีให้กับ Arduino Mega ผ่านหนึ่งในสามสาย Serial จากนั้น Arduino Mega จะประมวลผลภาพนี้ (โปรดดูคำอธิบายซอฟต์แวร์ด้านล่าง) และส่งคำสั่งความเร็วมอเตอร์และการเลี้ยวไปยังตัวควบคุม PID ผ่านอีกสาย Serial หนึ่ง ในทางกลับกันตัวควบคุม PID จะให้ค่านับเอนโค้ดเดอร์แก่ Arduino Mega สำหรับทั้งล้อขวาและซ้าย ซึ่งช่วยให้เราติดตามตำแหน่งและทิศทางของเราเทียบกับประตู 0 ได้

ตัวควบคุม PID (MD-25) ผลิตโดย Robot-Electronics ในสหราชอาณาจักร มันขับเคลื่อนมอเตอร์แปรงกระแสตรงแบบมีเกียร์สองตัวพร้อมเอนโค้ดเดอร์แม่เหล็กที่แกนมอเตอร์ หน้าจอ LCD มีไว้เพื่อวัตถุประสงค์ในการดีบัก เรามีรางจ่ายไฟสองราง 12V สำหรับมอเตอร์และ 5V สำหรับลอจิก โดยใช้กราวด์เดียวกันและทั้งคู่มาจากแบตเตอรี่ชาร์จได้ 12V ก้อนเดียว

ในตอนแรกเราวางแผนที่จะทำต้นแบบจากฐานไม้เพื่อให้เราเข้าสู่ระยะการเขียนโปรแกรมได้อย่างรวดเร็ว จากนั้นจึงทำงานกับฐานที่เร็วกว่าและเชื่อถือได้มากกว่าเช่นรถ RC อย่างไรก็ตาม เราพบว่าต้นแบบนั้นเชื่อถือได้มากและทำงานด้วยง่าย เราจึงเก็บมันไว้สำหรับการออกแบบขั้นสุดท้าย การกันน้ำสำหรับตัวเครื่องประกอบด้วยชั้นของแผ่นเซลโลเฟนใต้ชั้นของเทปบรรจุภัณฑ์ อย่างไรก็ตามฝนรั่วซึมผ่านเทปบรรจุภัณฑ์แต่โชคดีที่ไม่ผ่านแผ่นเซลโลเฟน กล้องถูกคลุมด้วยพลาสติกรูปสี่เหลี่ยมจากถุง Ziploc เนื่องจากเราพบว่า "ฟิลเตอร์" นี้ปรับปรุงความสามารถของกล้องในการเพิกเฉยต่อรอยเล็ก ๆ ของเส้นที่สำหรับกล้องแล้วดูเหมือนพื้นคอนกรีตพื้นหลัง

คำอธิบายอัลกอริทึม#

ความเป็นมา#

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

การเดินตามเส้น#

CMUcam4 ให้ภาพไบนารีขนาด 80 คูณ 60 แก่ชิป Arduino ของเรา เราสุ่มตัวอย่าง 10 แถวของพิกเซลที่เว้นระยะเท่ากันจากภาพและคำนวณจุดเซนทรอยด์ของพิกเซล "เปิด" (ดูที่นี่: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points) จากนั้นเราสมมติว่าเส้นอยู่บนจุดเซนทรอยด์ โดยการทำเช่นนี้ใน 10 แถวที่แตกต่างกันในภาพ เราจะได้การประมาณค่าเส้นที่ดีโดยการเชื่อมต่อจุด จากนั้นเราสามารถใช้ข้อมูลนี้ได้โดยการหาว่าแต่ละจุดบนเส้นอยู่ห่างจากเส้นแนวตั้งที่อยู่ตรงกลางภาพเท่าใด เพื่อให้ได้ค่าที่แสดงถึงความโค้งของเส้น สิ่งนี้สามารถมองได้เหมือนการหาพื้นที่ระหว่างเส้นสัมผัสและเส้นโค้ง และใช้พื้นที่นั้นเพื่อกำหนดว่าเราต้องเลี้ยวเท่าใด เครื่องหมายกำหนดว่าเลี้ยวซ้ายหรือขวา ในขณะที่ขนาดกำหนดว่าเราต้องเลี้ยวเท่าใดเพื่อตามเส้น อย่างที่คุณคาดหวัง หากเราวัดพื้นที่เป็นศูนย์ เส้นก็จะอยู่ตรงหน้าหุ่นยนต์พอดีและเป็นเส้นตรง หากขนาดของพื้นที่มีขนาดใหญ่ หุ่นยนต์ก็ต้องเลี้ยวเพื่อพยายามลดขนาดของพื้นที่นี้ให้น้อยที่สุด

จุดตัดสินใจ#

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

โปรดไปที่ https://github.com/cacay/Mobot เพื่อดูเวอร์ชันที่ทำให้ง่ายขึ้นของโค้ดของเรา หรือ ที่นี่ สำหรับสำเนาในเครื่อง