สารบัญ:
- ขั้นตอนที่ 1: สร้างแชสซี
- ขั้นตอนที่ 2: อิเล็กทรอนิกส์และการเดินสายไฟ
- ขั้นตอนที่ 3: โครงสร้างพื้นฐานซอฟต์แวร์
- ขั้นตอนที่ 4: ส่วนต่อประสานผู้ใช้
- ขั้นตอนที่ 5: การเขียนโปรแกรมแพลตฟอร์มหุ่นยนต์
- ขั้นตอนที่ 6: การปรับเทียบเซ็นเซอร์
- ขั้นตอนที่ 7: การออกแบบทางเลือก
- ขั้นตอนที่ 8: การประมวลผลภาพ
- ขั้นตอนที่ 9: ขั้นตอนต่อไป…
วีดีโอ: Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์: 9 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:02
ฉันเป็นวิศวกรซอฟต์แวร์ฝังตัวในบริษัทยานยนต์ของเยอรมนี ฉันเริ่มโครงการนี้เป็นแพลตฟอร์มการเรียนรู้สำหรับระบบฝังตัว โครงการถูกยกเลิกก่อนกำหนด แต่ฉันสนุกกับมันมากจนฉันทำต่อในเวลาว่าง นี่คือผลลัพธ์…
ฉันมีข้อกำหนดดังต่อไปนี้:
- ฮาร์ดแวร์อย่างง่าย (โฟกัสคือซอฟต์แวร์)
- ฮาร์ดแวร์ราคาถูก (ประมาณ 100 €)
- ขยายได้ (บางตัวเลือกเป็นส่วนหนึ่งของคำอธิบายแล้ว)
- การจ่ายแรงดันไฟสำหรับส่วนประกอบทั้งหมดจากแหล่งจ่ายไฟ 5V เดียว (พาวเวอร์แบงค์)
จริงๆแล้วไม่มีเป้าหมายนอกเหนือจากการเรียนรู้ แพลตฟอร์มนี้สามารถใช้สำหรับการเรียนรู้ การเฝ้าระวัง การแข่งขันหุ่นยนต์ …
มันไม่ใช่กวดวิชาเริ่มต้น คุณต้องการความรู้พื้นฐานเกี่ยวกับ:
- การเขียนโปรแกรม (Python)
- อุปกรณ์อิเล็กทรอนิกส์พื้นฐาน (เพื่อเชื่อมต่อโมดูลเข้าด้วยกันด้วยแรงดันไฟฟ้าที่เหมาะสม)
- ทฤษฎีการควบคุมพื้นฐาน (PID)
ในที่สุดคุณอาจจะประสบปัญหาเหมือนฉัน ด้วยความอยากรู้และความอดทน คุณจะต้องผ่านโครงการและแก้ปัญหาท้าทายต่างๆ รหัสของฉันเรียบง่ายที่สุดและมีการแสดงความคิดเห็นบรรทัดรหัสที่สำคัญเพื่อให้คำแนะนำ
ดูซอร์สโค้ดและไฟล์ทั้งหมดได้ที่นี่:
เสบียง:
กลศาสตร์
- 1x แผ่นไม้อัด (ขนาด A4 หนา 4 มม.)
- 3x M4 x 80 สกรูและน็อต
- มอเตอร์เกียร์ 2x พร้อมเพลาส่งออกรองสำหรับตัวเข้ารหัส ล้อ.
- 1x ล้อฟรี
1x การติดตั้งกล้องแพนและเอียง (อุปกรณ์เสริม)
อิเล็กทรอนิกส์
- 1x Raspberry Pi Zero พร้อมส่วนหัวและกล้อง
- 1x PCA 9685 การควบคุมเซอร์โว
- 2x วงล้อและวงจรเข้ารหัสออปติคัล
- 1x สายจัมเปอร์หญิง
- 1x USB พาวเวอร์แบงค์
- 1x DRV8833 ไดรเวอร์มอเตอร์คู่
- 2x Micro servos SG90 สำหรับการแพนและเอียงกล้อง (อุปกรณ์เสริม)
- 1x MPU9250 IMU (อุปกรณ์เสริม)
- 1x HC-SR04 เซ็นเซอร์ระยะอัลตราโซนิก (อุปกรณ์เสริม)
- 1x บอร์ดเจาะรูและลวดบัดกรี ส่วนหัว …
ขั้นตอนที่ 1: สร้างแชสซี
ฉันไม่ใช่นักออกแบบเครื่องกลที่ดี นอกจากนี้ เป้าหมายของโครงการไม่ได้ใช้เวลามากเกินไปในแชสซี อย่างไรก็ตาม ฉันได้กำหนดข้อกำหนดดังต่อไปนี้:
- วัสดุราคาถูก
- ประกอบและถอดประกอบได้อย่างรวดเร็ว
- ขยายได้ (เช่น พื้นที่สำหรับเพิ่มเซ็นเซอร์)
- วัสดุเบาเพื่อประหยัดพลังงานสำหรับอุปกรณ์อิเล็กทรอนิกส์
แชสซีที่ง่ายและราคาถูกสามารถทำจากไม้อัดได้ ง่ายต่อการตัดเฉือนด้วย fretsaw และสว่านมือ คุณสามารถติดชิ้นส่วนไม้ขนาดเล็กเพื่อสร้างตัวยึดสำหรับเซ็นเซอร์และมอเตอร์
ลองนึกถึงการเปลี่ยนส่วนประกอบที่บกพร่องหรือการดีบักทางไฟฟ้า ชิ้นส่วนหลักควรยึดด้วยสกรูเพื่อเปลี่ยน ปืนกาวร้อนอาจดูเรียบง่าย แต่อาจไม่ใช่วิธีที่ดีที่สุดในการสร้างแชสซี… ฉันต้องใช้เวลามากในการคิดแนวคิดง่ายๆ ในการถอดแยกชิ้นส่วนได้อย่างง่ายดาย การพิมพ์ 3 มิติเป็นทางเลือกที่ดี แต่อาจมีราคาแพงหรือใช้เวลานาน
ในที่สุดล้ออิสระก็เบามากและติดตั้งได้ง่าย ทางเลือกทั้งหมดหนักหรือเต็มไปด้วยแรงเสียดทาน (ฉันลองสองสามตัวก่อนที่จะหาอันสุดท้าย) ฉันต้องตัดไม้เว้นวรรคเพื่อปรับระดับล้อที่ไม่มีหางหลังจากติดตั้งล้อหลัก
คุณสมบัติของล้อ (สำหรับการคำนวณซอฟต์แวร์)
เส้นรอบวง: 21, 5 ซม. พัลส์: 20 พัลส์/รอบ ความละเอียด: 1, 075 ซม. (สุดท้าย 1 พัลส์จะอยู่ที่ประมาณ 1 ซม. ซึ่งง่ายสำหรับการคำนวณซอฟต์แวร์)
ขั้นตอนที่ 2: อิเล็กทรอนิกส์และการเดินสายไฟ
โครงการนี้ใช้โมดูลต่างๆ ตามที่แสดงในแผนภาพ
Raspberry Pi Zero เป็นตัวควบคุมหลัก กำลังอ่านเซ็นเซอร์และควบคุมมอเตอร์ด้วยสัญญาณ PWM มันเชื่อมต่อกับพีซีระยะไกลด้วย wifi
DRV8833 เป็นสะพาน H แบบมอเตอร์คู่ มันให้กระแสไฟเพียงพอกับมอเตอร์ (ซึ่ง Raspberry Pi ไม่สามารถทำได้เนื่องจากเอาต์พุตสามารถส่ง mA ได้เพียงบางส่วนเท่านั้น)
ตัวเข้ารหัสแบบออปติคัลจะให้สัญญาณรูปสี่เหลี่ยมทุกครั้งที่แสงผ่านล้อตัวเข้ารหัส เราจะใช้การขัดจังหวะ HW ของ Raspberry Pi เพื่อรับข้อมูลทุกครั้งที่มีการสลับสัญญาณ
pca9695 เป็นบอร์ดควบคุมเซอร์โว มันกำลังสื่อสารด้วยบัสอนุกรม I2C บอร์ดนี้ให้สัญญาณ PWM และแรงดันไฟฟ้าที่ควบคุมเซอร์โวสำหรับการแพนและเอียงของลูกเบี้ยว
MPU9265 เป็นการเร่งความเร็ว 3 แกน ความเร็วการหมุนเชิงมุม 3 แกน และเซ็นเซอร์ฟลักซ์แม่เหล็ก 3 แกน เราจะใช้เป็นหลักในการบอกทิศทางของเข็มทิศ
โมดูลต่าง ๆ ทั้งหมดเชื่อมต่อกันด้วยสายจัมเปอร์ เขียงหั่นขนมทำหน้าที่เป็นผู้มอบหมายงานและให้แรงดันไฟฟ้า (5V และ 3.3V) และกราวด์ การเชื่อมต่อทั้งหมดอธิบายไว้ในตารางการเชื่อมต่อ (ดูเอกสารแนบ) การเชื่อมต่อ 5V กับอินพุต 3.3V อาจทำลายชิปของคุณ ดูแลและตรวจสอบสายไฟทั้งหมดของคุณสองครั้งก่อนที่จะจัดหา (ที่นี่ต้องคำนึงถึงตัวเข้ารหัสเป็นพิเศษ) คุณควรวัดแรงดันไฟหลักบนบอร์ดจ่ายไฟด้วยมัลติมิเตอร์ก่อนเชื่อมต่อบอร์ดทั้งหมด โมดูลได้รับการแก้ไขด้วยสกรูไนลอนในแชสซี นอกจากนี้ฉันยินดีที่จะแก้ไข แต่ยังถอดออกได้ในกรณีที่เกิดความผิดปกติ
ในที่สุดการบัดกรีเพียงอย่างเดียวคือมอเตอร์และเขียงหั่นขนมและส่วนหัว พูดตามตรงฉันชอบสายจัมเปอร์ แต่อาจทำให้การเชื่อมต่อหลวมได้ ในบางสถานการณ์ การตรวจสอบซอฟต์แวร์บางอย่างอาจสนับสนุนคุณในการวิเคราะห์การเชื่อมต่อ
ขั้นตอนที่ 3: โครงสร้างพื้นฐานซอฟต์แวร์
หลังจากบรรลุกลไก เราจะตั้งค่าโครงสร้างพื้นฐานซอฟต์แวร์บางอย่างเพื่อให้มีเงื่อนไขการพัฒนาที่สะดวกสบาย
Git
นี่เป็นระบบควบคุมเวอร์ชันโอเพ่นซอร์สฟรี มันถูกใช้เพื่อจัดการโครงการขนาดใหญ่เช่น Linux แต่ยังสามารถใช้สำหรับโครงการขนาดเล็กได้อย่างง่ายดาย (ดู Github และ Bitbucket)
การเปลี่ยนแปลงโปรเจ็กต์สามารถติดตามได้ภายในเครื่องและยังส่งไปยังเซิร์ฟเวอร์ระยะไกลเพื่อแบ่งปันซอฟต์แวร์กับชุมชน
คำสั่งที่ใช้หลักคือ:
git clone https://github.com/makerobotics/RPIbot.git [รับซอร์สโค้ดและการกำหนดค่า git]
git pull origin master [รับข้อมูลล่าสุดจากที่เก็บระยะไกล]
git status [รับสถานะของที่เก็บในเครื่อง มีการเปลี่ยนแปลงไฟล์หรือไม่] git log [get the list of commits] git add [เพิ่มไฟล์ที่เปลี่ยนแปลงทั้งหมดไปยังพื้นที่งานเพื่อพิจารณาสำหรับการคอมมิตครั้งต่อไป] git commit -m "comment for commit" [commit the changes to the local repository]git push origin master [push all commit to the remote repository]
การบันทึก
Python มีฟังก์ชั่นการบันทึกในตัว โครงสร้างซอฟต์แวร์ควรกำหนดกรอบการบันทึกทั้งหมดแล้วก่อนที่จะเริ่มการพัฒนาต่อไป
ตัวบันทึกสามารถกำหนดค่าให้บันทึกด้วยรูปแบบที่กำหนดไว้ในเทอร์มินัลหรือในไฟล์บันทึก ในตัวอย่างของเรา ตัวบันทึกถูกกำหนดค่าโดยคลาสเว็บเซิร์ฟเวอร์ แต่เราสามารถทำได้ด้วยตัวเอง ที่นี่เราตั้งค่าระดับการบันทึกเป็น DEBUG เท่านั้น:
คนตัดไม้ = logging.getLogger (_name_)
logger.setLevel (การบันทึก DEBUG)
การวัดและการพล็อต
ในการวิเคราะห์สัญญาณเมื่อเวลาผ่านไป วิธีที่ดีที่สุดคือการลงจุดในแผนภูมิ เนื่องจาก Raspberry Pi มีคอนโซลเทอร์มินัลเท่านั้น เราจะติดตามข้อมูลในไฟล์ csv ที่คั่นด้วยเครื่องหมายอัฒภาคและพล็อตจากพีซีระยะไกล
ไฟล์การติดตามที่คั่นด้วยเครื่องหมายอัฒภาคสร้างขึ้นโดยรหัสไพ ธ อนหลักของเราและต้องมีส่วนหัวดังนี้:
timestamp;yawCorr;encoderR;I_L;odoDistance;ax;encoderL;I_R;yaw;eSpeedR;eSpeedL;pwmL;speedL;CycleTimeControl;wz;pwmR;speedR;Iyaw;hdg;m_y;m_x;eYaw;cycleTimeSense;
1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;
คอลัมน์แรกมีการประทับเวลา คอลัมน์ต่อไปนี้ฟรี สคริปต์การลงจุดถูกเรียกพร้อมรายการคอลัมน์ที่จะลงจุด:
remote@pc:~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR
สคริปต์พล็อตมีอยู่ในโฟลเดอร์เครื่องมือ:https://github.com/makerobotics/RPIbot/tree/master/t…
พล็อตเตอร์ใช้ mathplotlib ใน Python คุณต้องคัดลอกลงในพีซีของคุณ
เพื่อความสะดวกยิ่งขึ้น สคริปต์ python จะถูกเรียกโดย bash script (plot.sh) ซึ่งใช้ในการคัดลอกไฟล์การติดตาม Raspberry Pi ไปยังพีซีระยะไกลและเรียกพล็อตเตอร์ด้วยการเลือกสัญญาณ สคริปต์ทุบตี "plot.sh" ถาม หากต้องคัดลอกไฟล์ สะดวกกว่าสำหรับฉันแทนที่จะคัดลอกด้วยตนเองในแต่ละครั้ง "sshpass" ใช้เพื่อคัดลอกไฟล์จาก Raspberry Pi ไปยังพีซีระยะไกลผ่าน scp มันสามารถคัดลอกไฟล์โดยไม่ต้องถามรหัสผ่าน (มันถูกส่งผ่านเป็นพารามิเตอร์)
ในที่สุดหน้าต่างก็เปิดขึ้นพร้อมกับพล็อตตามที่แสดงในภาพ
การสื่อสารทางไกล
อินเทอร์เฟซการพัฒนา Raspberry Pi คือ SSH ไฟล์สามารถแก้ไขได้โดยตรงบนเป้าหมายหรือคัดลอกโดย scp
ในการควบคุมหุ่นยนต์ เว็บเซิร์ฟเวอร์กำลังทำงานบน Pi โดยให้การควบคุมผ่าน Websockets อินเทอร์เฟซนี้มีอธิบายไว้ในขั้นตอนต่อไป
ตั้งค่า Raspberry Pi
มีไฟล์อธิบายการตั้งค่า Raspberry Pi ในโฟลเดอร์ "doc" ของซอร์สโค้ด (setup_rpi.txt) ไม่มีคำอธิบายมากมาย แต่มีคำสั่งและลิงก์ที่มีประโยชน์มากมาย
ขั้นตอนที่ 4: ส่วนต่อประสานผู้ใช้
เราใช้เว็บเซิร์ฟเวอร์ Tornado น้ำหนักเบาเพื่อโฮสต์ส่วนต่อประสานผู้ใช้ เป็นโมดูล Python ที่เราเรียกเมื่อเราเริ่มซอฟต์แวร์ควบคุมหุ่นยนต์
สถาปัตยกรรมซอฟต์แวร์
อินเทอร์เฟซผู้ใช้สร้างขึ้นโดยไฟล์ต่อไปนี้: gui.html [อธิบายการควบคุมหน้าเว็บและเลย์เอาต์] gui.js [ประกอบด้วยโค้ดจาวาสคริปต์เพื่อจัดการการควบคุมและเปิดการเชื่อมต่อ websocket กับหุ่นยนต์ของเรา] gui.css [ประกอบด้วยสไตล์ของ การควบคุม html ตำแหน่งของการควบคุมถูกกำหนดไว้ที่นี่]
การสื่อสารผ่านเว็บซ็อคเก็ต
อินเทอร์เฟซผู้ใช้ไม่ได้ยอดเยี่ยมที่สุด แต่ทำงานได้ดี ฉันมุ่งเน้นไปที่เทคโนโลยีที่ใหม่สำหรับฉันเช่น Websockets
เว็บไซต์กำลังสื่อสารกับเว็บเซิร์ฟเวอร์หุ่นยนต์โดย Websockets นี่คือช่องทางการสื่อสารแบบสองทิศทางซึ่งจะยังคงเปิดอยู่เมื่อการเชื่อมต่อเริ่มต้นขึ้น เราส่งคำสั่งของหุ่นยนต์ผ่าน Websocket ไปยัง Raspberry Pi และรับข้อมูล (ความเร็ว ตำแหน่ง สตรีมของกล้อง) กลับมาแสดงผล
เค้าโครงอินเทอร์เฟซ
อินเทอร์เฟซผู้ใช้มีอินพุตด้วยตนเองสำหรับคำสั่ง สิ่งนี้ถูกใช้ในตอนเริ่มต้นเพื่อส่งคำสั่งไปยังหุ่นยนต์ ช่องทำเครื่องหมายคือการเปิดและปิดสตรีมของกล้อง แถบเลื่อนสองตัวกำลังควบคุมการแพนและเอียงกล้อง ส่วนด้านบนขวาของอินเทอร์เฟซผู้ใช้คือการควบคุมการเคลื่อนไหวของหุ่นยนต์ คุณสามารถควบคุมความเร็วและระยะทางเป้าหมาย ข้อมูลพื้นฐานทางไกลจะแสดงในรูปวาดหุ่นยนต์
ขั้นตอนที่ 5: การเขียนโปรแกรมแพลตฟอร์มหุ่นยนต์
ส่วนนี้เป็นเป้าหมายหลักของโครงการ ฉันปรับโครงสร้างซอฟต์แวร์จำนวนมากในขณะที่แนะนำแชสซีใหม่กับมอเตอร์กระแสตรง ฉันใช้ Python เป็นภาษาการเขียนโปรแกรมด้วยเหตุผลที่แตกต่างกัน:
- มันเป็นภาษาหลักของ Raspberry Pi
- เป็นภาษาระดับสูงที่มีคุณสมบัติและส่วนขยายในตัวมากมาย
- เป็นวัตถุเชิงวัตถุ แต่ยังสามารถใช้สำหรับการเขียนโปรแกรมตามลำดับ
- ไม่จำเป็นต้องมีการรวบรวมหรือห่วงโซ่เครื่องมือ แก้ไขรหัสและเรียกใช้
สถาปัตยกรรมซอฟต์แวร์หลัก
ซอฟต์แวร์เป็นแบบออบเจ็กต์ แบ่งเป็นสองสามออบเจ็กต์ ความคิดของฉันคือแบ่งรหัสออกเป็น 3 ช่วงการทำงาน:
Sense Think Actuate
Sense.py
การรับและประมวลผลเซ็นเซอร์หลัก ข้อมูลจะถูกเก็บไว้ในพจนานุกรมเพื่อใช้ในขั้นตอนต่อไปนี้
Control.py
คลาสย่อยของการกระตุ้นคือการควบคุมมอเตอร์และเซอร์โวหลังจากการแยกออก วัตถุควบคุมหลักคือการจัดการคำสั่งระดับสูงและอัลกอริธึมการควบคุม (PID) สำหรับมอเตอร์ด้วย
rpibot.py
ออบเจ็กต์หลักนี้คือการจัดการเว็บเซิร์ฟเวอร์ Tornado และสร้างตัวอย่างความรู้สึกและคลาสการควบคุมในเธรดที่แยกจากกัน
แต่ละโมดูลสามารถทำงานคนเดียวหรือเป็นส่วนหนึ่งของโครงการทั้งหมดได้ คุณสามารถสัมผัสได้เท่านั้นและพิมพ์ข้อมูลเซ็นเซอร์เพื่อตรวจสอบว่าเซ็นเซอร์เชื่อมต่ออย่างถูกต้องและส่งข้อมูลที่ถูกต้อง
การควบคุม PID
งานแรกคือค้นหาสิ่งที่เราต้องการควบคุม ฉันเริ่มต้นด้วยการพยายามควบคุมตำแหน่ง ซึ่งซับซ้อนมากและไม่ได้ช่วยอะไรมาก
สุดท้าย เราต้องการควบคุมความเร็วล้อแต่ละล้อและทิศทางของหุ่นยนต์ด้วย ในการทำเช่นนั้น เราต้องเรียงลอจิกควบคุมสองแบบ
เพื่อเพิ่มความซับซ้อนทีละขั้นตอน หุ่นยนต์ควรได้รับการควบคุม:
วงเปิด (ด้วยกำลังคงที่)
pm = K
จากนั้นเพิ่มอัลกอริธึมลูปปิด
pwm = Kp.speedError+Ki. Integration (speedError)
และสุดท้ายเพิ่มการควบคุมทิศทางเป็นขั้นตอนสุดท้าย
สำหรับการควบคุมความเร็ว ฉันใช้การควบคุม "PI" และ "P" สำหรับการหันเหเท่านั้น ฉันตั้งค่าพารามิเตอร์ด้วยตนเองโดยการทดลอง อาจใช้พารามิเตอร์ที่ดีกว่ามากที่นี่ เป้าหมายของฉันเป็นเพียงเส้นตรงและฉันเกือบจะได้มันแล้ว ฉันสร้างอินเทอร์เฟซในซอฟต์แวร์เพื่อเขียนตัวแปรบางตัวโดยใช้อินเทอร์เฟซผู้ใช้ การตั้งค่าพารามิเตอร์ Kp เป็น 1.0 จำเป็นต้องมีคำสั่งต่อไปนี้ในส่วนต่อประสานผู้ใช้:
SET;Kp;1.0
ฉันสามารถตั้งค่าพารามิเตอร์ P ให้ต่ำพอที่จะหลีกเลี่ยงการโอเวอร์ช็อต ข้อผิดพลาดที่เหลือได้รับการแก้ไขโดยพารามิเตอร์ I (ข้อผิดพลาดแบบรวม)
เป็นการยากสำหรับฉันที่จะหาวิธีลดระดับการควบคุมทั้งสอง วิธีแก้ปัญหานั้นง่าย แต่ก่อนหน้านี้ฉันได้ลองวิธีอื่นๆ มากมายแล้ว… ในที่สุดฉันก็เปลี่ยนเป้าหมายความเร็วของล้อให้หมุนไปในทิศทางใดทิศทางหนึ่ง การเปลี่ยนเอาต์พุตการควบคุมความเร็วโดยตรงถือเป็นข้อผิดพลาดเนื่องจากการควบคุมความเร็วพยายามขจัดสิ่งรบกวนนี้
มีการแนบไดอะแกรมควบคุมที่ใช้แล้ว มันแสดงให้เห็นเฉพาะด้านซ้ายของการควบคุมหุ่นยนต์
ขั้นตอนที่ 6: การปรับเทียบเซ็นเซอร์
สิ่งแรกที่ต้องพิจารณาคือ IMU ทั้งหมดต้องทำงานอย่างถูกต้อง ฉันสั่งชิ้นส่วน 3 ชิ้นแล้วส่งกลับจนกว่าเซ็นเซอร์จะใช้งานได้เต็มประสิทธิภาพ เซ็นเซอร์ก่อนหน้านี้แต่ละตัวมีบางส่วนของเซ็นเซอร์ทำงานไม่ถูกต้องหรือไม่ทำงานเลย ฉันใช้สคริปต์ตัวอย่างเพื่อทดสอบพื้นฐานก่อนที่จะติดตั้งในหุ่นยนต์
จำเป็นต้องปรับเทียบสัญญาณเซ็นเซอร์ IMU ก่อนใช้งาน สัญญาณเซ็นเซอร์บางตัวขึ้นอยู่กับมุมและตำแหน่งการติดตั้ง
การสอบเทียบอัตราเร่งและความเร็วรอบ
การสอบเทียบที่ง่ายที่สุดคือการเร่งความเร็วตามยาว (A_x) เมื่อหยุดนิ่ง ควรอยู่ที่ประมาณ 0 ม./วินาที² หากคุณหมุนเซ็นเซอร์อย่างถูกต้อง คุณสามารถวัดแรงโน้มถ่วงได้ (ประมาณ 9, 8 ม./วินาที²) ในการปรับเทียบ a_x คุณเพียงแค่ติดตั้งอย่างถูกต้อง จากนั้นกำหนดออฟเซ็ตเพื่อให้ได้ 0 ม./วินาที² เมื่อหยุดนิ่ง ตอนนี้ปรับเทียบ A_x แล้ว คุณสามารถรับค่าชดเชยสำหรับความเร็วในการหมุนได้ในลักษณะเดียวกันเมื่อหยุดนิ่ง
การปรับเทียบแมกนิโทมิเตอร์สำหรับเข็มทิศ
จำเป็นต้องมีการสอบเทียบที่ซับซ้อนมากขึ้นสำหรับเซ็นเซอร์สนามแม่เหล็ก เราจะใช้ m_x และ m_y เพื่อให้ได้สนามแม่เหล็กในระดับแนวนอน การมี m_x และ m_y จะทำให้เราสามารถคำนวณส่วนหัวของเข็มทิศได้
เพื่อจุดประสงค์ง่ายๆ เราจะปรับเทียบส่วนเบี่ยงเบนของเหล็กแข็งเท่านั้น ต้องดำเนินการนี้เนื่องจากเซ็นเซอร์อยู่ในตำแหน่งสุดท้าย เนื่องจากขึ้นอยู่กับการรบกวนของสนามแม่เหล็ก
เราบันทึก m_x และ m_y ขณะที่เราหมุนหุ่นยนต์ไปรอบๆ แกน z เราพล็อต m_x กับ m_y ในแผนภูมิ XY ส่งผลให้มีจุดไข่ปลาตามที่แสดงในภาพ จุดไข่ปลาจะต้องอยู่กึ่งกลางที่จุดกำเนิด ที่นี่เราพิจารณาค่าสูงสุดและต่ำสุดของ m_x และ m_y เพื่อรับออฟเซ็ตในทั้งสองทิศทาง สุดท้ายเราตรวจสอบการปรับเทียบและดูว่าจุดไข่ปลาอยู่ตรงกลาง
การปรับเทียบเหล็กอ่อนหมายความว่าเราเปลี่ยนรูปภาพจากจุดไข่ปลาเป็นวงกลม สามารถทำได้โดยการเพิ่มปัจจัยในแต่ละค่าซีเนียร์
ตอนนี้สามารถเข้ารหัสรูทีนการทดสอบเพื่อสอบเทียบใหม่หรืออย่างน้อยก็เพื่อตรวจสอบว่าเซ็นเซอร์ยังคงสอบเทียบอยู่หรือไม่
หัวเข็มทิศ
ข้อมูลสนามแม่เหล็กจะถูกนำมาใช้ในการคำนวณทิศทางของเข็มทิศ สำหรับสิ่งนี้ เราต้องแปลงสัญญาณ m_x และ m_y เป็นมุม Python ให้บริการฟังก์ชัน math.atan2 โดยตรงซึ่งมีเป้าหมายนี้ การคำนวณที่สมบูรณ์ถูกกำหนดไว้ในไฟล์ mpu9250_i2c.py ("calcHeading(mx, my, mz)")
ขั้นตอนที่ 7: การออกแบบทางเลือก
โครงการใช้เวลานานเนื่องจากการออกแบบเปิดอย่างสมบูรณ์ สำหรับแต่ละองค์ประกอบ ฉันได้ใช้งานต้นแบบและพบกับข้อจำกัดของระบบ
หัวข้อที่ซับซ้อนที่สุดคือตัวเข้ารหัสล้อ ฉันทดสอบ 3 ตัวเลือกที่แตกต่างกันก่อนที่จะค้นหาตัวเข้ารหัสออปติคัลที่ใช้อยู่ในปัจจุบัน ฉันคิดว่าวิธีแก้ปัญหาที่ถูกยกเลิกก็น่าสนใจมากในโครงการดังกล่าว มันเกี่ยวข้องกับส่วนที่ฉันเรียนรู้มากที่สุด
เซอร์โวหมุนต่อเนื่องที่เชื่อมต่อกับ pca 9695
เพื่อหลีกเลี่ยง H-bridge เพิ่มเติมสำหรับมอเตอร์ DC ฉันเริ่มต้นด้วยเซอร์โวหมุนอย่างต่อเนื่อง สิ่งเหล่านี้ถูกขับเคลื่อนโดยไดรเวอร์เซอร์โว pca 9695 ที่มีอยู่แล้ว กลไกการขับเคลื่อนและอุปกรณ์อิเล็กทรอนิกส์ของนักข่าวนั้นง่ายกว่ามาก การออกแบบนี้มีข้อเสียสองประการ:
- ช่วงการควบคุมที่แย่ของเซอร์โว
- ตำแหน่งการถือตัวเข้ารหัสที่หายไป
เซอร์โวเริ่มเคลื่อนที่ด้วย 50% pwm และมีความเร็วเต็มที่ประมาณ 55% นี่เป็นช่วงการควบคุมที่แย่มาก
หากไม่มีการถือตัวเข้ารหัส การค้นหาตัวเข้ารหัสที่พร้อมใช้งานนั้นยากมาก ฉันทดสอบตัวเข้ารหัสการสะท้อนแสง 3 แบบซึ่งติดตั้งอยู่บนแชสซี ฉันติดเทปล้อเข้ารหัสที่สร้างขึ้นเองที่ด้านนอกของวงล้อด้วยส่วนขาวดำ ฉันใช้เซ็นเซอร์ QTR-1RC ซึ่งต้องการการประมวลผลสัญญาณจำนวนมากเพื่อรับสัญญาณที่ถูกต้อง Raspberry Pi ไม่สามารถประมวลผลแบบเรียลไทม์แบบนั้นได้ ดังนั้นฉันจึงตัดสินใจเพิ่ม NodeMCU D1 mini เป็นตัวควบคุมแบบเรียลไทม์ให้กับหุ่นยนต์ มันถูกเชื่อมต่อกับราสเบอร์รี่ Pi โดย UART อนุกรมเพื่อส่งข้อมูลเซ็นเซอร์ที่ประมวลผล NodeMCU ก็จัดการเซ็นเซอร์ HC-SR04 เช่นกัน กลไกนั้นยากและไม่แข็งแรงมาก สายอนุกรมได้รับเสียงรบกวนจากสาย I2C และมอเตอร์ ดังนั้นในที่สุดฉันก็สร้างแชสซีรุ่นที่สองด้วยมอเตอร์ DC แบบเกียร์ธรรมดาที่ขับเคลื่อนด้วย สะพาน H มอเตอร์เหล่านี้มีเพลาเอาท์พุตรองเพื่อวางตัวเข้ารหัสแบบออปติคัล
ขั้นตอนที่ 8: การประมวลผลภาพ
เพื่อปรับปรุงการขับขี่อัตโนมัติ เราสามารถประมวลผลภาพบางส่วนได้
ไลบรารี opencv เป็นข้อมูลอ้างอิงสำหรับสิ่งนั้น Python สามารถใช้เพื่อดำเนินการตรวจจับสิ่งกีดขวางได้อย่างรวดเร็ว
เราจับภาพและใช้งานการประมวลผลภาพบางอย่าง:
การทดสอบครั้งแรกเกิดขึ้นจากการแปลงร่างของ Canny และ Sobel Canny สามารถเป็นผู้สมัครที่ดีได้ แต่ยังไม่มีเหตุผลเพียงพอ Sobel มีเหตุผลเกินไป (ตรวจพบวัตถุมากเกินไป)
ในที่สุดฉันก็สร้างตัวกรองของตัวเองเพื่อผสมการไล่ระดับสีในแนวนอนและแนวตั้งทั้งหมด (ตรวจจับเฟอร์นิเจอร์):
- แปลงภาพสีเป็นภาพระดับสีเทา
- เบลอภาพเพื่อขจัดสัญญาณรบกวนเล็กน้อย
- กำหนดภาพให้เป็นภาพขาวดำ
- ตอนนี้เราตรวจจับการไล่ระดับสีในแนวนอนและแนวตั้งเพื่อตรวจจับวัตถุที่เป็นผนังและเฟอร์นิเจอร์
- เรากรองเฉพาะรูปทรงที่เหลือขนาดใหญ่ (ดูรูปทรงสีในภาพ)
ตอนนี้เราสามารถใช้ข้อมูลใหม่นี้เพื่อตรวจจับสิ่งกีดขวาง…
ขั้นตอนที่ 9: ขั้นตอนต่อไป…
ตอนนี้ เรามีแพลตฟอร์มหุ่นยนต์ที่เรียบง่ายพร้อมเซ็นเซอร์ แอคทูเอเตอร์ และกล้อง เป้าหมายของฉันคือการเคลื่อนตัวโดยอัตโนมัติและกลับไปที่สถานีโดยไม่เพิ่มเซ็นเซอร์ใดๆ อีก สำหรับสิ่งนี้ฉันจะต้องทำตามขั้นตอนต่อไปนี้:
- การรวมเซ็นเซอร์ของสัญญาณการหันเหและสัญญาณทิศทางแม่เหล็ก
- การประมวลผลภาพของกล้อง (มีเฉพาะ CPU ต่ำเท่านั้น)
- การตรวจจับการชนกัน (ระยะอัลตราโซนิกและกล้อง)
- การสร้างแผนที่หรือการวางแนว
ตอนนี้ไปและสร้างความท้าทายหรือเป้าหมายของคุณเอง …
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง