สารบัญ:

ผู้ช่วยสวน Roomba Bot: 8 ขั้นตอน
ผู้ช่วยสวน Roomba Bot: 8 ขั้นตอน

วีดีโอ: ผู้ช่วยสวน Roomba Bot: 8 ขั้นตอน

วีดีโอ: ผู้ช่วยสวน Roomba Bot: 8 ขั้นตอน
วีดีโอ: iRobot Roomba 880, 780 - Virtual Wall® Lighthouse™ 2024, กรกฎาคม
Anonim
ผู้ช่วยสวน Roomba Bot
ผู้ช่วยสวน Roomba Bot

Kiara Myers, Ahmad Alghadeer และ Madison Tippet

วัตถุประสงค์:

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

คุณสมบัติ:

  • ใช้เซ็นเซอร์วัดแสงเพื่อตรวจจับผนังและเลี้ยวเล็กน้อยเพื่อหลีกเลี่ยงการชนกับผนัง
  • ใช้เซ็นเซอร์ตรวจจับการกระแทกเพื่อทำลายโปรแกรมเมื่อกระทบหินที่ปลายสวน
  • ใช้การประมวลผลภาพเพื่อตรวจจับวงกลมในสวนแล้วกำหนดรัศมี
  • ใช้เซ็นเซอร์หน้าผาเพื่อตรวจจับเทปสีที่บ่งบอกว่ามีผลไม้

ขั้นตอนที่ 1: วัสดุและวัสดุสิ้นเปลือง:

  • แล็ปท็อปหนึ่งเครื่อง
  • MATLAB 2017
  • เครื่องดูดฝุ่น Roomba
  • ราสเบอร์รี่ปี่
  • บล็อกไม้
  • กระดาษสีขาว
  • กระดาษสีดำ
  • เทปสี/แถบกระดาษสีบาง
  • หินขนาดใหญ่

ขั้นตอนที่ 2:

ขั้นตอนที่ 3: รวบรวม "สวน" ของคุณ

การประกอบของคุณ
การประกอบของคุณ
  1. นำกระดาษสีดำของคุณแล้วตัดเป็นวงกลมขนาดต่างๆ
  2. เทปวงกลมสีดำเหล่านี้ลงบนกระดาษสีขาวขนาดใหญ่

    ความคมชัดนี้จะจำเป็นเมื่อตรวจพบผลไม้

  3. ใช้ไม้ของคุณสร้างเส้นทางสวนเหมือนเขาวงกตเพื่อให้หุ่นยนต์ของคุณนำทาง

    เราเลือกทางเดินรูปตัวยูตามภาพด้านบน

  4. ที่ส่วนท้ายของสวนของคุณ ให้เพิ่มหินหรือประตูหรือวัตถุอื่นเพื่อให้หุ่นยนต์ของคุณรู้ว่าเสร็จสิ้นแล้ว
  5. ติดกระดาษสีขาวของคุณเป็นวงกลมบนผนังสวน

    เราใช้ถังติดเทปเพราะผนังของเราสั้นเกินไปสำหรับกล้อง

  6. วางเทปสี/กระดาษสีบางๆ บนพื้นหน้าผลไม้

ขั้นตอนที่ 4: การเขียนโค้ด

การนำทางสวน

การใช้ Bump Sensors: ในการรันโปรแกรม เราวางโค้ดในคำสั่ง while ซึ่งจะวนซ้ำคำสั่ง if ต่างๆ จนกว่าโค้ดจะพัง หากมีการชนกันของบัมเปอร์ จะส่งผลให้ค่าของบัมเปอร์มีค่าเท่ากับ จริง (ซึ่งในบูลีนมีค่าเท่ากับ 1) คำสั่ง if ใช้เพื่อทำลายรหัสเมื่อค่าใดค่าหนึ่งเท่ากับ 1

การใช้ Cliff Sensors: ภายในคำสั่ง while เราใช้คำสั่ง if เพื่อบอก Roomba เมื่อมันมาถึงที่ตั้งของโรงงาน Roomba ตรวจจับเทปสีบนพื้นโดยตรวจสอบธรณีประตูสีแดงที่เซ็นเซอร์หน้าผาหยิบขึ้นมา หากเซ็นเซอร์หน้าผาด้านซ้ายหรือด้านขวาตรวจพบสีที่มีขีดจำกัดมากกว่าสีพื้น หุ่นยนต์จะหยุดทำงานเป็นเวลา 2 วินาที (โดยใช้คำสั่งหยุดชั่วคราว) ในช่วง 2 วินาทีนี้ Roomba จะถ่ายและแสดงภาพผลไม้ ใช้คำสั่ง imfindcircles ที่สร้างมา กำหนดช่วงสำหรับรัศมีของวงกลม จากนั้น Roomba ของคุณจะพบผลไม้ที่เรียกว่าคุณ

การใช้การประมวลผลภาพ: ภายในคำสั่ง if เรารวมคำสั่ง if อื่นที่ระบุว่า: หากรัศมีตรวจพบรัศมี 3 มากกว่าหรือเท่ากับข้อกำหนดขั้นต่ำของเราสำหรับผลสุก r1 (คุณตัดสินใจสิ่งนี้) จากนั้นนับและแสดง Roomba กี่ผลไม้พร้อมแล้วเลี้ยวไปต่อที่สวน ถ้าไม่ก็เลี้ยวต่อไปผ่านสวน หมายเหตุ: คุณอาจต้องปรับมุมที่คุณหมุนเพราะ Roomba ทุกตัวต่างกัน

การใช้กันชนแบบเบา: ในคำสั่ง if อื่น กันชนแบบเบาจะได้รับการวิเคราะห์เพื่อให้แน่ใจว่าไม่มีสิ่งใดที่เกินเกณฑ์ที่เรากำหนด หากกันชนไฟด้านซ้าย ขวา ตรงกลางด้านซ้าย ตรงกลางด้านขวา ด้านหน้าด้านซ้าย หรือด้านหน้าด้านขวาอยู่เหนือธรณีประตู Roomba จะหมุนเล็กน้อยในมุมที่เหมาะสมเพื่อหลีกเลี่ยงไม่ให้ชนกับผนัง ดังนั้นการท่องไปในเขาวงกต

โค้ดที่เหลือใช้เพื่อพล็อตเส้นทางของ Roomba แล้วส่งผลลัพธ์ไปยังอีเมลของคุณ

ขั้นตอนที่ 5: คัดลอกรหัส

% วัตถุประสงค์: ตามขนาด Roomba จะผ่านสวนและแยกแยะผัก/ผลไม้ที่พร้อมจะเก็บได้ % อินพุต: เซ็นเซอร์ Lightbump, เซ็นเซอร์ Cliff, เซ็นเซอร์ Bump, ภาพจากกล้อง % เอาต์พุต: เมื่อใดก็ตามที่เซ็นเซอร์แสงมากกว่าเกณฑ์ roomba จะหมุนและถ่ายภาพ เสียงบี๊บจะดังขึ้นหากรัศมี % ผัก/ผลไม้อยู่ระหว่างช่วงที่กำหนด รหัสจะแตกเมื่อ Roomba ชนกับ % วัตถุ ส่งอีเมลถึงนักบินอวกาศเกี่ยวกับจำนวนผลไม้ที่พร้อมจะเก็บ % และการทำแผนที่การเคลื่อนที่ของ Roomba % การใช้งาน: คำสั่ง if และ while, การพล็อตคำสั่ง, รหัสอีเมลจาก MATLAB

k=0

tic

timerVal=tic

ในขณะที่จริง

วี=.2; % ความเร็ว r.setDriveVelocity(v, v);%roomba ไปข้างหน้า L=r.getLightBumpers; LC=L.leftCenter; Rr=L.ขวา; Lf=L.ซ้าย; RC=L.rightCenter; LF=L.leftด้านหน้า; RF=L.หน้าขวา; ถาม= 75; % เกณฑ์ RTH=30; %สีแดงเกณฑ์สูง RTL=10; % เกณฑ์สีแดงต่ำ B=r.getBumpers S=r.getCliffSensors; r1=24; r3=10; PL1=1800; ถ้า S.leftFront > PL1 || S.rightFront > PL1 %ตรวจพบว่าสีบนพื้นอยู่เหนือเกณฑ์ r.stop pause(2) elapsedTime=toc(timerVal-2) tic timerVal=tic % หยุดชั่วคราวเป็นเวลา 2 วินาที img = r.getImage; % ถ่ายภาพ imshow (img)% แสดงภาพ [centers3, radii3] = imfindcircles (img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9); ชั่วโมง = viscircles(centers3, radii3); % มองหาวงกลมของรัศมีที่มีช่วงที่ระบุในภาพถ้า radii3>=r1 T=1 k=k+1 dist1=0.2.*elapsedTime %หากตรวจพบรัศมีมากกว่าหรือเท่ากับ % ขั้นต่ำที่ต้องการของผลสุก จากนั้น Roomba จะนับผลนี้ elseif radii3<=r3 T=0 else T=0 dist2=0.2.*elapsedTime % ถ้าไม่เช่นนั้น จะไม่นับผลที่สิ้นสุด

if T==1 r.setLEDDigits(num2str(k)) r.beep r.beep r.beep r.turnAngle(78) %หากตรวจพบผลไม้ ให้แสดงตัวเลขบน Roomba % ส่งเสียง แล้วเลี้ยว elseif T==2 r.turnAngle(78) %หากตรวจพบผลไม้ 2 ผล ให้เลี้ยวต่อไปผ่าน %garden อื่น r.turnAngle(78) %หากตรวจไม่พบผลไม้ ให้เลี้ยวต่อไปผ่าน %garden end end if LC >Q r.stop r.turnAngle(-7) elseif RC >Q r.stop r.turnAngle(7) elseif LF >Q r.stop r.turnAngle(-7) elseif RF >Q r.stop r. turnAngle(7)elseif Lf > Q r.stop r.turnAngle(-7)elseif Rr >Q r.stop r.turnAngle(7) สิ้นสุด % หากค่าของกันชนไฟใด ๆ สูงกว่าเกณฑ์แล้ว % the Roomba จะเบี่ยงไปทางขวาเล็กน้อยเพื่อหลีกเลี่ยง %การชนกำแพง

ถ้า B.right ==1 || B.left==1 || B.front==1 dist3=0.2.*elapsedTime r.stop r.beep('F#*2, F#*2, c, F#*2, F#*2') r.turnAngle(360) %หากมี ชนแล้ว Roomba จะเล่นเสียง หมุนไปรอบๆ % และทำลายรหัส

จุดจบ

end scatter(0.533, 0, '^') ถือ scatter(0.533, dist1, '<') ถือ scatter(-dist2, dist1, 'v') ถือ scatter (-dist2, 0, 'd') saveas (gcf, 'การเคลื่อนไหว.png')

kmsg=num2str(k) mail= '[email protected]' password='Srsora123#' host='smtp.gmail.com' port='465'

setpref('อินเทอร์เน็ต', 'อีเมล', อีเมล); setpref ('อินเทอร์เน็ต', 'SMTP_Server', โฮสต์) props = java.lang. System.getProperties; props.setProperty('mail.smtp.user', เมล); props.setProperty('mail.smtp.host', โฮสต์); props.setProperty('mail.smtp.port', พอร์ต); props.setProperty('mail.smtp.starttls.enable', 'true'); props.setProperty('mail.smtp.debug', 'true'); props.setProperty('mail.smtp.auth', 'true'); props.setProperty ('mail.smtp.socketFactory.port', พอร์ต); props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.fallback', 'เท็จ'); sendmail(เมล 'สวัสดีนักบินอวกาศ! มีผลไม้มากมายในสวนนี้', kmsg, {'movement.png'})

แนะนำ: