สารบัญ:

Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์: 9 ขั้นตอน
Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์: 9 ขั้นตอน

วีดีโอ: Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์: 9 ขั้นตอน

วีดีโอ: Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์: 9 ขั้นตอน
วีดีโอ: พาลูกไปเรียน AI Robotics และ Coding ผ่านหุ่นยนต์ที่ RobotLAB Thailand 2024, พฤศจิกายน
Anonim
Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์
Rpibot - เกี่ยวกับการเรียนรู้วิทยาการหุ่นยนต์

ฉันเป็นวิศวกรซอฟต์แวร์ฝังตัวในบริษัทยานยนต์ของเยอรมนี ฉันเริ่มโครงการนี้เป็นแพลตฟอร์มการเรียนรู้สำหรับระบบฝังตัว โครงการถูกยกเลิกก่อนกำหนด แต่ฉันสนุกกับมันมากจนฉันทำต่อในเวลาว่าง นี่คือผลลัพธ์…

ฉันมีข้อกำหนดดังต่อไปนี้:

  • ฮาร์ดแวร์อย่างง่าย (โฟกัสคือซอฟต์แวร์)
  • ฮาร์ดแวร์ราคาถูก (ประมาณ 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 ต่ำเท่านั้น)
  • การตรวจจับการชนกัน (ระยะอัลตราโซนิกและกล้อง)
  • การสร้างแผนที่หรือการวางแนว

ตอนนี้ไปและสร้างความท้าทายหรือเป้าหมายของคุณเอง …

แนะนำ: