สารบัญ:

IRobot Create-Mars Expedition Rover Mark I: 4 ขั้นตอน
IRobot Create-Mars Expedition Rover Mark I: 4 ขั้นตอน

วีดีโอ: IRobot Create-Mars Expedition Rover Mark I: 4 ขั้นตอน

วีดีโอ: IRobot Create-Mars Expedition Rover Mark I: 4 ขั้นตอน
วีดีโอ: How I Built a Mars Perseverance Rover Replica - Arduino based Project 2024, มิถุนายน
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

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

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

เสบียง
เสบียง

สำหรับโครงการนี้ คุณจะต้องมี iRobot Create ซึ่งเป็นหุ่นยนต์ดูดฝุ่น Roomba รุ่นที่ตั้งโปรแกรมได้ หุ่นยนต์มาพร้อมกับเซ็นเซอร์ทั้งหมดที่จำเป็นสำหรับโครงการนี้ โดยเฉพาะเซ็นเซอร์กันกระแทก เซ็นเซอร์หน้าผา และเซ็นเซอร์ "Light Bump" คุณจะต้องมี Raspberry Pi และกล้องวิดีโอ ซึ่งใช้สำหรับการสื่อสารแบบไร้สาย การเขียนโปรแกรมแบบสด และฟีดวิดีโอสด สุดท้าย คุณจะต้องมีแท่นพิมพ์ 3 มิติสำหรับ Raspberry Pi และกล้อง

ขั้นตอนที่ 2: พัฒนาการเข้ารหัสเพื่อตอบสนองผลลัพธ์ที่ต้องการ

พัฒนาการเข้ารหัสเพื่อตอบสนองผลลัพธ์ที่ต้องการ
พัฒนาการเข้ารหัสเพื่อตอบสนองผลลัพธ์ที่ต้องการ

เมื่อคุณเชื่อมต่อ Roomba ของคุณแล้ว คุณจะต้องสร้างรหัส Matlab ที่จะให้ผลลัพธ์ที่คุณต้องการหลังจากอินพุตที่คุณต้องการ

รหัสสามารถดูได้ที่นี่:

โครงการ Roomba%Brenten Arnold (barnol15); จูเลียน คอร์น (qdp218); Mike Heal(mheal) %4/11/19 คำอธิบายปัญหา: สร้างยานสำรวจเพื่อช่วยเหลือมนุษย์ในระหว่างการสำรวจ/ที่อยู่อาศัยของดาวอังคาร วิธีแก้ไข: ค้นหาสารอินทรีย์ (สีเขียว) โดยใช้กันชนแสง เซ็นเซอร์หน้าผา และกล้องเพื่อตรวจสอบสารอินทรีย์ อนุญาตให้ %รถแลนด์โรเวอร์สำรวจภูมิประเทศที่ขรุขระโดยใช้กันชน %เซ็นเซอร์หน้าผา และเซ็นเซอร์ความสูงของล้อ ช่วยให้มนุษย์ควบคุมรถแลนด์โรเวอร์จาก %a ในระยะที่ปลอดภัยและค้นหาแร่ธาตุด้วยตนเอง ตัวเลือก = {'LIFE', 'ROUGH TERRAIN', 'User CONTROL'}; % สามตัวเลือกในเมนูโต้ตอบ Setting = menu('', options) if Setting>0 %หากเลือกตัวเลือกนี้ขอให้ผู้ใช้ยืนยันตัวเลือก2 = {'ใช่', 'ไม่'} %สร้างอาร์เรย์เซลล์สำหรับ "ใช่" หรือ "ไม่ใช่" " ตัวเลือกยืนยัน = เมนู (['คุณเลือกโหมด "' ตัวเลือก{การตั้งค่า} '"], ตัวเลือก2) %ยืนยันตัวเลือกการตั้งค่าผู้ใช้ถ้ายืนยัน==1ถ้าการตั้งค่า==1 %ตรวจสอบว่าได้เลือกการตั้งค่า "ชีวิต" i =0 ขณะที่ i==0 r.setLEDDigits(num2str('LIFE')) % แสดง 'LIFE' บน LED สำหรับ i=1:100 r.setDriveVelocity(0.05) %ย้าย roomba ไปข้างหน้าที่ 0.05 m/sy = r.getCliffSensors % ดึงและจัดเก็บค่าเซ็นเซอร์หน้าผาในโครงสร้างเซลล์ "y" l = r.getLightBumpers % ดึงและจัดเก็บค่าการกระแทกของแสงในโครงสร้าง "f" ถ้า l.left>100% ตรวจสอบว่ากันชนด้านซ้ายปิดอยู่หรือไม่ r.moveDistance(-0.05)) % ย้าย roomba ไปข้างหลัง 0.05 เมตร r.turnAngle(20) %หมุน roomba 20 องศา CCW img=r.getImage %รับภาพจากกล้องราสเบอร์รี่พายบน roomba rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย(mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ(ง); end elseif l.leftFront>100 %Check is left/ front light bumper is covered r.moveDistance(-0.05) %Move roomba back 0.05 meters img=r.getImage %รับภาพจากกล้อง rasberry pie บน roomba และเก็บไว้ในตัวแปร 'img ' rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย (mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ(ง); endelseif l.leftCenter>100% ตรวจสอบว่ากันชนไฟซ้าย/กลางปิดอยู่หรือไม่ r.moveDistance(-0.05) %ย้าย roomba ไปข้างหลัง 0.05 เมตร img=r.getImage %รับภาพจากกล้อง rasberry pie บน roomba และเก็บไว้ในตัวแปร 'img ' rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย (mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ (ง); endelseif l.rightCenter>100% ตรวจสอบว่ากันชนไฟขวา/ตรงกลางปิดอยู่หรือไม่ r.moveDistance(-0.05)%ย้าย roomba ไปข้างหลัง 0.05 เมตร img=r.getImage %รับภาพจากกล้อง rasberry pie บน roomba และเก็บไว้ในตัวแปร 'img ' rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย(mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ (ง); endelseif l.rightFront>100 %ตรวจสอบว่าปิดกันชนไฟหน้าขวา/ไฟหน้า r.moveDistance(-0.05)%ย้าย roomba ไปข้างหลัง 0.05 เมตร img=r.getImage %รับภาพจากกล้อง rasberry pie บน roomba และเก็บไว้ในตัวแปร 'img ' rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย (mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ (ง); end elseif l.right>100 %ตรวจสอบว่าครอบกันชนไฟด้านขวาหรือไม่ r.moveDistance(-0.05)%ย้าย roomba ไปข้างหลัง 0.05 เมตร r.turnAngle(-20)%หมุน roomba 20 องศา CW img=r.getImage %รับภาพจาก กล้องพายราสเบอร์รี่บน roomba และเก็บไว้ในตัวแปร 'img' rect = [100 0 150 150]; img = imcrop(img, rect) %crop image to focus on center red = ค่าเฉลี่ย(mean(img(:,:, 1))) % ความเข้มของสีแดง สีเขียว = ค่าเฉลี่ย (mean(img(:,:, 2))) % ความเข้มของสีเขียวเฉลี่ย สีน้ำเงิน = ค่าเฉลี่ย(ค่าเฉลี่ย(img(:,:, 3))) % ความเข้มของสีน้ำเงินเฉลี่ยหากสีเขียว>สีแดง && สีเขียว>สีน้ำเงิน ตรวจสอบว่าพืชอยู่ในภาพหรือไม่ d=msgbox(['พบชีวิต! ']); แสดงกล่องข้อความว่า "พบชีวิต!" รอ(ง); end elseif y.leftFront<1500 %ตรวจสอบว่าส่วนหน้าของ roomba อยู่นอกหน้าผาหรือไม่ r.moveDistance(-0.1, 0.05) %ย้าย roomba ไปข้างหลัง 0.1 เมตร ที่ 0.05 ม./วินาที r.turnAngle(-5) %Rotate roomba 5 องศา CW อื่นถ้า y.rightFront<1500 % ตรวจสอบว่าส่วนขวา/ด้านหน้าของ roomba อยู่นอกหน้าผา r.moveDistance(-0.1, 0.05) %ย้าย roomba ไปข้างหลัง 0.1 เมตร ที่ 0.05 ม./วินาที r.turnAngle(5) %Rotate roomba 5 องศา CCW อื่นถ้า y.left<1000 % ตรวจสอบว่าด้านซ้ายของ roomba อยู่นอกหน้าผา r.moveDistance(-0.05, 0.05) %ย้าย roomba ไปข้างหลัง 0.05 เมตร ที่ 0.05 ม./วินาที r.turnAngle(-10) %Rotate roomba 10 องศา CW elseif y.right0 %เรียกใช้หากกดปุ่มหากดำเนินการต่อ==1 i=0 %ค้นหาชีวิตอื่นต่อไป i=1 %สิ้นสุดโหมดชีวิตสิ้นสุด สิ้นสุดจุดสิ้นสุด elseif การตั้งค่า==2 %ตรวจสอบว่าได้เลือกการตั้งค่า "ROUGH TERRAIN" หรือไม่ i=0 ในขณะที่ i==0 r.setLEDDigits(num2str('RGH')) % แสดงผล 'Rough' บนจอแสดงผล LED สำหรับ i=1:1000 r.setDriveVelocity(0.05) % ตั้งค่าความเร็วของไดรฟ์ roomba เป็น 0.05 m/sx = r.getBumpers % ดึงและจัดเก็บค่าเซ็นเซอร์บัมเปอร์ในโครงสร้าง "x" y = r.get CliffSensors % ดึงและจัดเก็บค่าเซ็นเซอร์หน้าผาในโครงสร้าง "y" ถ้า x.right==1 % ตรวจสอบว่ามีการกดกันชนด้านขวาหรือไม่ r.turnAngle(10) %Rotate roomba 10 องศา CCW elseif x.left==1 %ตรวจสอบว่าซ้าย กันชนถูกกด r.turnAngle(-10) %หมุน roomba 10 องศา CW elseif x.front==1 %ตรวจสอบว่ากดกันชนหน้าหรือไม่ r.turnAngle(20) %Rotate roomba 20 องศา CCW elseif x.rightWheelDrop==1 % ตรวจสอบว่าล้อขวาหลุดหรือไม่ r.turnAngle(-20)%หมุน roomba 20 องศา CW elseif x.leftWheelDrop==1 %ตรวจสอบว่าล้อซ้ายหลุด r.turnAngle(20) %Rotate roomba 20 องศา CCW elseif y.leftFront< 1500 % ตรวจสอบว่าส่วนหน้าซ้ายของ roomba อยู่นอกหน้าผา r.moveDistance(-0.05, 0.05) %ย้าย roomba ไปข้างหลัง 0.05 เมตรที่ 0.05 ม./วินาที r.turnAngle(-5)%หมุน roomba 5 องศา CW อย่างอื่นถ้า y.rightFront< 1500 %ตรวจสอบว่าส่วนหน้าขวาของ roomba อยู่นอกหน้าผา r.moveDistance(-0.05, 0.05)%ย้าย roomba ไปข้างหลัง 0.05 เมตรที่ 0.05 ม./วินาที r.turnAngle(5) %Rotate roomba 5 องศา CCW อย่างอื่นถ้า y.left<1000 %ตรวจสอบว่าส่วนที่เหลือ o f roomba อยู่นอกหน้าผา r.moveDistance(-0.05, 0.05)%ย้าย roomba ไปข้างหลัง 0.05 เมตร ที่ 0.05 ม./วินาที r.turnAngle(-10)%หมุน roomba 10 องศา CW อย่างอื่นถ้า y.right0 ถ้าทำต่อ==1 i=0 % ดำเนินการต่อภูมิประเทศที่ขรุขระ อื่น i=1 % สิ้นสุดภูมิประเทศที่ขรุขระ สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด อื่น % โหมดแมนนวล i=0 r.setLEDDigits(num2str('USER')) % แสดง 'ผู้ใช้' บนจอแสดงผล LED d=msgbox(['ปุ่มลูกศร - เคลื่อนไหว; S - หยุดโรเวอร์; ESC - การควบคุมผู้ใช้ปลายทาง; A - ค้นหาทรัพยากร']); รอ (ง); ในขณะที่ i==0 r.showCamera %เปิดฟีดสดของกล้อง rasberry pie ในหน้าต่างแยกต่างหาก D=getkey(1) %ดึงคีย์ที่ผู้ใช้กด เก็บค่า ASCII เป็นตัวแปร D ถ้า D==30 % ตรวจสอบว่าลูกศร "ขึ้น" มี ถูกกด r.setDriveVelocity(0.1) %ส่ง roomba ไปข้างหน้าที่ 0.2 m/s elseif D==28 % ตรวจสอบว่ามีการกดลูกศร "ซ้าย" หรือไม่ r.setDriveVelocity(0) %หยุด roomba จากการเดินหน้าหรือถอยหลัง r.turnAngle(15, 0.05)%หมุน roomba 45 องศา CCW ที่ 0.05 m/s elseif D==31 % ตรวจสอบว่ามีการกดลูกศร "ลง" หรือไม่ r.setDriveVelocity(-0.1) %ย้าย roomba ไปข้างหลังที่ 0.2 m/s elseif D==29 % ตรวจสอบว่ากดลูกศร "ขวา" หรือไม่ r.setDriveVelocity(0) %หยุด roomba ไม่ให้เคลื่อนที่ไปข้างหน้าหรือข้างหลัง r.turnAngle(-15, 0.05) %Rotate roomba 45 องศา CW ที่ 0.05 m/s elseif D==27 %ตรวจสอบว่า กดปุ่ม "esc" (escape) แล้ว i=1 %เปลี่ยนค่าของตัวแปร "i" เป็น exit loop d=msgbox('Exiting "User Control"') % แจ้งให้ผู้ใช้ทราบว่ากำลังออกจากโหมดแมนนวล elseif D== 115 % ตรวจสอบว่ามีการกดปุ่ม "s" หรือไม่ r.setDriveVelocity(0) %หยุด roomba จาก เดินหน้าหรือถอยหลัง elseif D==97 %ตรวจสอบว่ามีการกด "a" image = r.getImage; imwrite(image, 'image.png') W = Classify(image) K = mode(W) if K == 3 d=msgbox('Resource found') %แสดงถ้าตรวจพบทรัพยากรรูปสี่เหลี่ยมผืนผ้า waitfor(d); %รอให้ผู้ใช้ปิดกล่องข้อความ "d"elseif K == 0 d=msgbox('Not Resource:(') %แสดงถ้าไม่พบทรัพยากรสี่เหลี่ยม waitfor(d); %รอให้ผู้ใช้ปิดกล่องข้อความ "d" end else d=msgbox('ไม่ใช่การป้อนคีย์ที่ถูกต้อง') % แสดงว่าผู้ใช้ปิดเมนู "เลือกการตั้งค่า" waitfor(d); %Wait for user to close message box "d" end waitfor(d); %Wait for ให้ผู้ใช้ปิดกล่องข้อความ "d" end end else d=msgbox('Goodbye') %บอกลาถ้าตัวเลือกถูกปิด end waitfor(d);

ขั้นตอนที่ 3: การทดสอบ

การทดสอบ
การทดสอบ

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

ขั้นตอนที่ 4: สังเกตผลลัพธ์ที่มองเห็นได้

สังเกตผลลัพธ์ที่มองเห็นได้
สังเกตผลลัพธ์ที่มองเห็นได้
สังเกตผลลัพธ์ที่มองเห็นได้
สังเกตผลลัพธ์ที่มองเห็นได้

จะเห็นได้ชัดเจนว่าคุณได้ตั้งโปรแกรม Roomba ของคุณสำเร็จหรือไม่โดยพิจารณาจากการแสดงผลที่มองเห็นได้

ผลลัพธ์รวมถึง:

  • การตรวจจับรูปร่าง: ความสามารถของ Roomba ในการแยกแยะรูปร่างอย่างเหมาะสมเพื่อค้นหาแร่ธาตุที่ถูกต้อง
  • การซ้อมรบภูมิประเทศที่ขรุขระ: หลีกเลี่ยงหน้าผาหรือบริเวณที่มืด
  • โหมดแมนนวล: ฟีดสดและความสามารถในการควบคุม Roomba
  • รูปภาพ: รูปภาพของแร่ธาตุ
  • พบชีวิต!: กล่องข้อความ MatLab ที่ระบุว่าโรงงานของคุณระบุชีวิตอินทรีย์

นั่นคือจุดสิ้นสุดของบทช่วยสอนของเรา ขอให้สนุกกับ Mars Expedition Rover ใหม่ของคุณ!

แนะนำ: