สารบัญ:

ยานยนต์อัตโนมัติ: 7 ขั้นตอน (พร้อมรูปภาพ)
ยานยนต์อัตโนมัติ: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ยานยนต์อัตโนมัติ: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ยานยนต์อัตโนมัติ: 7 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: [spin9] นั่งรถยนต์ไร้คนขับ! อัตโนมัติทุกขั้นตอน ล้ำกว่านี้ไม่มีอีกแล้ว 2024, พฤศจิกายน
Anonim
รถยนต์ขับเคลื่อนอัตโนมัติ
รถยนต์ขับเคลื่อนอัตโนมัติ
รถยนต์ขับเคลื่อนอัตโนมัติ
รถยนต์ขับเคลื่อนอัตโนมัติ

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

หุ่นยนต์จะเคลื่อนที่ด้วยล้อขับเคลื่อนด้วยมอเตอร์กระแสตรงสองล้อและล้อเลื่อนสองล้อ มอเตอร์จะติดอยู่ที่ด้านล่างของแท่นกลม มอเตอร์จะถูกควบคุมโดยตัวขับมอเตอร์สองตัว ไดรเวอร์มอเตอร์จะได้รับคำสั่ง PWM จาก Zynq Processor ตัวเข้ารหัสบนมอเตอร์แต่ละตัวทั้งหมดใช้เพื่อติดตามตำแหน่งและทิศทางของยานพาหนะ ทั้งระบบจะใช้แบตเตอรี่ LiPo

ขั้นตอนที่ 1: การประกอบยานพาหนะ

การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์
การประกอบรถยนต์

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

มอเตอร์ที่เลือกคือมอเตอร์ DC Port Escap 12V ที่มีตัวเข้ารหัสในตัว มอเตอร์นี้สามารถซื้อได้บนอีเบย์ในราคาที่สมเหตุสมผล (ดู Bill of Materials) ค้นหาคำสำคัญ “12V Escap 16 Coreless Geared DC Motor with Encoders” บน ebay เพื่อค้นหามอเตอร์ มักจะมีผู้ขายจำนวนมากให้เลือก ข้อมูลจำเพาะและพินเอาต์ของมอเตอร์แสดงอยู่ในไดอะแกรมด้านล่าง

การประกอบหุ่นยนต์เริ่มต้นด้วยแบบจำลอง CAD การออกแบบแชสซี โมเดลด้านล่างแสดงมุมมองด้านบนของโปรไฟล์รูปร่าง 2 มิติที่ออกแบบมาสำหรับแชสซี

ขอแนะนำว่าแชสซีได้รับการออกแบบให้เป็น 2Dprofile เพื่อให้สามารถผลิตได้ง่าย เราตัดแผ่นอลูมิเนียมขนาด 12”X12” ให้เป็นรูปร่างของโครงเครื่องโดยใช้เครื่องตัดแบบวอเตอร์เจ็ท แพลตฟอร์มแชสซียังสามารถตัดด้วยเลื่อยวงเดือน

ขั้นตอนที่ 2: การติดตั้งมอเตอร์

ติดตั้งมอเตอร์
ติดตั้งมอเตอร์
ติดตั้งมอเตอร์
ติดตั้งมอเตอร์

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

รู M2 ของมอเตอร์และอีกด้านสามารถยึดเข้ากับแท่นได้ ต้องเจาะรูเข้าไปในแท่นยึดมอเตอร์เพื่อใช้สกรูยึดมอเตอร์เข้ากับแท่นยึดมอเตอร์และแท่นยึดมอเตอร์เข้ากับแท่น ตัวยึดมอเตอร์สามารถเห็นได้ในรูปด้านบน

ถัดไป วาง Pololu Motor Hub (ดู Bill of Materials) บนเพลามอเตอร์และขันให้แน่นด้วยสกรูที่ให้มาและประแจอัลเลน รูปแบบรูของศูนย์กลางมอเตอร์ Pololu ไม่ตรงกับรูปแบบรูของล้อ VEX จึงต้องสร้างข้อต่อกลางแบบกำหนดเอง ขอแนะนำให้ใช้เศษเหล็กแผ่น อลูมิเนียม ที่ใช้ทำแท่นแชสซีเพื่อใช้ทำข้อต่อ รูปแบบรูและขนาดของคู่นี้แสดงในรูปด้านล่าง เส้นผ่านศูนย์กลางและรูปร่างภายนอก (ไม่จำเป็นต้องเป็นวงกลม) ของตัวต่ออะลูมิเนียมแบบกำหนดเองนั้นไม่สำคัญตราบใดที่รูทั้งหมดพอดีกับชิ้นส่วน

ขั้นตอนที่ 3: การสร้าง Vivado Block Design

การสร้างการออกแบบบล็อก Vivado
การสร้างการออกแบบบล็อก Vivado
การสร้างการออกแบบบล็อก Vivado
การสร้างการออกแบบบล็อก Vivado

- เริ่มต้นด้วยการสร้างโครงการ Vivado ใหม่และเลือก Zybo Zynq 7000 Z010 เป็นอุปกรณ์เป้าหมาย

- คลิกถัดไปที่ สร้างการออกแบบบล็อกใหม่ และเพิ่ม Zynq IP ดับเบิลคลิกที่ Zynq IP และนำเข้าการตั้งค่า XPS ที่ให้ไว้สำหรับ Zynq จากนั้นเปิดใช้งาน UART0 ด้วย MIO 10..11 ภายใต้แท็บการกำหนดค่า MIO และตรวจสอบให้แน่ใจว่าได้เปิดใช้งานตัวจับเวลา 0 และตัวจับเวลา Watchdog

- เพิ่ม AXI GPIOS สองตัวในการออกแบบบล็อก สำหรับ GPIO 0 ให้เปิดใช้งานช่องสัญญาณคู่และตั้งค่าทั้งสองเป็นเอาต์พุตทั้งหมด ตั้งค่าความกว้าง GPIO สำหรับช่อง 1 ถึง 4 บิต และสำหรับช่อง 2 ถึง 12 บิต ช่องเหล่านี้จะใช้เพื่อกำหนดทิศทางของมอเตอร์และส่งจำนวนเห็บที่ตัวเข้ารหัสจะวัดไปยังโปรเซสเซอร์ สำหรับ GPIO 1 ให้ตั้งค่าช่องเดียวสำหรับอินพุตทั้งหมดที่มีความกว้างของช่อง 4 บิต จะใช้เพื่อรับข้อมูลจากตัวเข้ารหัส ทำให้พอร์ต GPIO ทั้งหมดภายนอก

- ถัดไปเพิ่มตัวจับเวลา AXI สองตัว สร้างพอร์ต pwm0 บนตัวจับเวลาทั้งสองภายนอก สิ่งเหล่านี้จะเป็น pwms ที่ควบคุมความเร็วที่มอเตอร์หมุน

- ในที่สุดเรียกใช้บล็อกอัตโนมัติและการเชื่อมต่ออัตโนมัติ ตรวจสอบว่าการออกแบบบล็อกที่คุณมีตรงกับการออกแบบที่ให้มา

ขั้นตอนที่ 4: การสื่อสารกับ LiDAR

LiDAR นี้ใช้โปรโตคอล SCIP 2.0 เพื่อสื่อสารผ่าน UART ไฟล์ที่แนบมานี้อธิบายโปรโตคอลทั้งหมด

ในการสื่อสารกับ LiDAR เราจะใช้ UART0 LiDAR ส่งคืนจุดข้อมูล 682 จุด ซึ่งแต่ละจุดแสดงถึงระยะทางไปยังวัตถุที่มุมนั้น LiDAR สแกนทวนเข็มนาฬิกาจาก -30 องศาถึง 210 องศาด้วยขั้นตอน 0.351 องศา

- การสื่อสารทั้งหมดไปยัง LiDAR ทำได้โดยใช้อักขระ ASCI โปรดดูรูปแบบที่ใช้โปรโตคอล SCIP เราเริ่มต้นด้วยการส่งคำสั่ง QT เพื่อเปิด LiDAR จากนั้น เราจะส่งคำสั่ง GS หลายครั้งเพื่อขอ 18 จุดข้อมูลในแต่ละครั้งเพื่อ ft ใน UARTS 64 ไบต์ FIFO ข้อมูลที่ส่งคืนจาก LiDAR จะถูกแยกวิเคราะห์และจัดเก็บไว้ในอาร์เรย์ส่วนกลางของ SCANdata

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

ในไฟล์ main_av.c คุณจะพบกับฟังก์ชันต่อไปนี้เพื่อสื่อสารกับ LiDAR

sendLIDARcmd(คำสั่ง)

- นี่จะส่งสตริงอินพุตไปยัง LiDAR ผ่าน UART0

recvLIDARdata()

- สิ่งนี้จะได้รับข้อมูลหลังจากส่งคำสั่งไปยัง LiDAR และจัดเก็บข้อมูลใน RECBuffer

ขอข้อมูลระยะทาง()

- ฟังก์ชันนี้จะส่งชุดคำสั่งเพื่อดึงข้อมูลทั้งหมด 682 จุด หลังจากได้รับจุดข้อมูล 18 จุดแต่ละชุดแล้ว parseLIDARinput() จะถูกเรียกให้แยกวิเคราะห์ข้อมูลและจัดเก็บจุดข้อมูลใน SCANdata แบบเพิ่มหน่วย

ขั้นตอนที่ 5: เติมตารางด้วยอุปสรรค

เติมตารางด้วยอุปสรรค
เติมตารางด้วยอุปสรรค
เติมตารางด้วยอุปสรรค
เติมตารางด้วยอุปสรรค

GRID ที่จัดเก็บเป็นอาร์เรย์ 2 มิติโดยมีค่าดัชนีแต่ละค่าแทนตำแหน่ง ข้อมูลที่จัดเก็บในแต่ละดัชนีจะเป็น 0 หรือ 1 ไม่มีสิ่งกีดขวางและอุปสรรคตามลำดับ ระยะตารางเป็นมิลลิเมตรที่แต่ละดัชนีแทนสามารถเปลี่ยนแปลงได้ด้วยคำจำกัดความ GRID_SCALE ในไฟล์ vehicle.h ขนาดของอาร์เรย์ 2 มิติยังสามารถเปลี่ยนแปลงได้เพื่อให้รถสามารถสแกนพื้นที่ที่ใหญ่ขึ้นด้วยการแก้ไขคำจำกัดความ GRID_SIZE

หลังจากสแกนข้อมูลระยะทางชุดใหม่จาก LiDAR updateGrid() จะถูกเรียก การดำเนินการนี้จะวนซ้ำทุกจุดข้อมูลที่จัดเก็บไว้ในอาร์เรย์ SCANdata เพื่อกำหนดว่าดัชนีใดในกริดที่มีอุปสรรค การใช้การวางแนวปัจจุบันของยานพาหนะ เราสามารถกำหนดมุมที่สอดคล้องกับจุดข้อมูลแต่ละจุดได้ ในการพิจารณาว่าคุณมีสิ่งกีดขวางอยู่ที่ใด ให้คูณระยะทางที่สอดคล้องกันด้วยค่า cos/sin ของมุม การเพิ่มค่าทั้งสองนี้ไปยังตำแหน่ง x และ y ปัจจุบันของยานพาหนะจะคืนค่าดัชนีในตารางของสิ่งกีดขวาง การหารระยะทางที่ส่งคืนโดยการดำเนินการนี้ด้วย GRID_SCALE จะทำให้เราสามารถกำหนดระยะห่างของตารางแต่ละดัชนีได้มากน้อยเพียงใด

ภาพด้านบนแสดงสภาพแวดล้อมปัจจุบันของยานพาหนะและผลกริด

ขั้นตอนที่ 6: การสื่อสารกับมอเตอร์

ในการสื่อสารกับมอเตอร์ เราเริ่มต้นด้วยการเริ่มต้น GPIO เพื่อควบคุมคือทิศทางที่มอเตอร์หมุน จากนั้นการเขียนโดยตรงไปยังที่อยู่ฐานของ PWM ใน AXI Timer ช่วยให้เราสามารถตั้งค่าสิ่งต่างๆ เช่น คาบและวัฏจักรหน้าที่ซึ่งควบคุมได้โดยตรง ความเร็วมอเตอร์หมุนที่

ขั้นตอนที่ 7: การวางแผนเส้นทาง

ที่จะดำเนินการในอนาคตอันใกล้นี้

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

แนะนำ: