สารบัญ:

Robo-Technician: 8 ขั้นตอน
Robo-Technician: 8 ขั้นตอน

วีดีโอ: Robo-Technician: 8 ขั้นตอน

วีดีโอ: Robo-Technician: 8 ขั้นตอน
วีดีโอ: 5 เทคนิค เอาตัวรอด ตอนสัมภาษณ์งาน เวลาเจอคำถาม ที่เราไม่รู้คำตอบ และตอบไม่ได้ 2024, พฤศจิกายน
Anonim
Robo-ช่างเทคนิค
Robo-ช่างเทคนิค

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

Robo-Technician เพื่อช่วยชีวิต

โดยพื้นฐานแล้ว โค้ดนี้ควบคุม Robo-Technician เนื่องจากเดินตามเส้นทางสีอ่อนบนพื้น มันจะไปตามเส้นทางนี้จนกว่าจะพบทางแยกในเส้นทางหรือทางเลี้ยว ซึ่งจะกระตุ้นให้ถ่ายภาพเพื่อประมวลผลภาพเพื่อให้ช่างเทคนิค Robo ตัดสินใจว่าจะไปที่ใดต่อไป เซ็นเซอร์กันกระแทกและกันกระแทกทำงานเพื่อปกป้อง Robo-Technician จากความเสียหาย และเซ็นเซอร์ตรวจจับการกระแทกจะควบคุมว่าจะถ่ายภาพการวินิจฉัยเมื่อใด เมื่อรวมกันแล้ว Robo-Technician ได้รับการออกแบบมาเพื่อซูมไปรอบๆ โมดูลของ Mar ช่วยเพิ่มเวลาให้กับนักบินอวกาศในขณะที่ทำงานพื้นฐานของการตรวจสอบ โดยจะขอให้มนุษย์ป้อนข้อมูลเมื่อพบสิ่งผิดปกติเท่านั้น

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

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

ฮาร์ดแวร์

  • Raspberry Pi (เราใช้รุ่น 3)
  • ไอโรบอท ®
  • อุปกรณ์จับยึดบางชนิดเพื่อให้ Raspberry Pi ต่ออยู่กับ Robo-Technician
  • กล้อง Raspberry Pi (ไม่ว่าจะรุ่นไหน ขอแค่มีออโต้โฟกัสและความละเอียดของภาพที่ดีเท่านั้น)
  • ขาตั้งหรือซองหนังบางชนิดเพื่อให้กล้องหันไปข้างหน้ากับ Robo-Technician
  • วัสดุที่จะใช้เป็นแถบ สีขาว (หรือสีอ่อนมาก) ที่ยึดกับพื้นอย่างแน่นหนา ต้องกว้างกว่าช่องว่างระหว่างเซ็นเซอร์หน้าผาสองตัวด้านหน้าเพียงเล็กน้อย
  • 4 ป้ายที่มีข้อความขนาดใหญ่มาก (โดยพิมพ์คำว่า IMAGE, RIGHT, BACK และ LEFT)
  • แผ่นกระดาษสี (อย่างน้อยสามแผ่นและควรเป็นสีแดง สีเขียว และสีน้ำเงิน)

ซอฟต์แวร์

  • Matlab (2018a และ 2017b ถูกใช้และดูเหมือนจะสร้างความแตกต่างเล็กน้อย)
  • แพ็คเกจรองรับ Raspberry Pi สำหรับ Matlab
  • รหัส Raspberry Pi สำหรับเชื่อมต่อกับ Matlab (ลิงก์ไปยังซอร์สโค้ดที่ให้ไว้ด้านล่าง)
  • กล่องเครื่องมือประมวลผลรูปภาพสำหรับ Matlab (คุณไม่สามารถทำโครงการนี้ได้หากไม่มีกล่องเครื่องมือ)
  • ไม่บังคับ: ติดตั้ง Matlab Mobile บนโทรศัพท์ของคุณแล้ว ซึ่งฉันจะอธิบายในภายหลัง

ขั้นตอนที่ 1: การตั้งค่าฮาร์ดแวร์

ef.engr.utk.edu/ef230-2018-08/projects/roo…

นี่คือลิงค์สำหรับรหัสฐานเพื่อให้แน่ใจว่า iRobot® สามารถสื่อสารกับ Matlab พร้อมกับบทช่วยสอนพื้นฐาน อย่างที่ฉันพูดไปก่อนหน้านี้ ฉันจะไม่พูดถึงส่วนนี้โดยเฉพาะ เนื่องจากการกวดวิชาได้วางไว้อย่างดีแล้ว ฉันจะพูดถึงว่าเมื่อคุณทำตามขั้นตอนในลิงก์แล้ว คุณสามารถใช้คำสั่ง "doc" ของ Matlab เพื่อดูข้อมูลที่รวมอยู่ได้ โดยเฉพาะ:

doc roomba

และอีกจุดที่สำคัญมาก

เมื่อคุณดาวน์โหลดไฟล์จากลิงค์ด้านบน ให้วางไว้ในโฟลเดอร์ที่ฉันอธิบายไว้ด้านบน เนื่องจาก Matlab ต้องการให้ไฟล์ที่ผู้ใช้สร้างขึ้นเพื่อให้อยู่ในโฟลเดอร์การทำงานปัจจุบัน

ให้ออกไปให้พ้นทางไปที่รหัส

ขั้นตอนที่ 2: ค้นหาเซ็นเซอร์เหล่านั้นทั้งหมด

ค้นหาเซ็นเซอร์เหล่านั้นทั้งหมด
ค้นหาเซ็นเซอร์เหล่านั้นทั้งหมด
ค้นหาเซ็นเซอร์เหล่านั้นทั้งหมด
ค้นหาเซ็นเซอร์เหล่านั้นทั้งหมด

ใช้เวลาสักครู่แล้วให้ iRobot® ตรวจสอบ เป็นการดีที่จะรู้ว่าสิ่งเหล่านี้อยู่ที่ไหน เพื่อให้คุณมีความคิดเกี่ยวกับอินพุตที่ Robo-Technician ได้รับ และคุณจะสามารถทราบได้ว่าทำไมสิ่งนั้นถึงหมุนเป็นวงกลมแทนที่จะไปตามเส้นทางที่คุณจะตั้งค่า (ซึ่งอาจ หรืออาจจะไม่เกิดขึ้น) คุณจะเห็นเซ็นเซอร์กันกระแทกขนาดใหญ่ที่ด้านหน้าอย่างเห็นได้ชัด เซ็นเซอร์หน้าผาจะมองเห็นได้ยากขึ้นเล็กน้อย คุณจะต้องพลิกมันแล้วมองหาหน้าต่างพลาสติกใสสี่บานที่อยู่ใกล้ขอบด้านหน้า เซ็นเซอร์ตรวจจับการกระแทกถูกซ่อนไว้มากกว่าเดิม แต่สำหรับตอนนี้ มันก็เพียงพอแล้วที่จะบอกว่าการแสดงสดในแถบสีดำวาววับอยู่รอบๆ ด้านหน้าของ iRobot® ซึ่งอยู่ที่ด้านหน้าของแถบเซ็นเซอร์การกระแทกทางกายภาพ

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

ขั้นตอนที่ 3: การทดสอบเพื่อตั้งค่าพารามิเตอร์

การทดสอบเพื่อตั้งค่าพารามิเตอร์
การทดสอบเพื่อตั้งค่าพารามิเตอร์

ก่อนที่เราจะสามารถส่งช่าง Robo-Technician ออกไปทำงานนั้นได้ เราจำเป็นต้องหาจุดแข็งและช่วงเซ็นเซอร์ของมันก่อน เนื่องจาก iRobot® แต่ละตัวมีความแตกต่างกันเล็กน้อยและเปลี่ยนแปลงตลอดอายุของหุ่นยนต์ เราจึงต้องค้นหาว่าเซ็นเซอร์จะอ่านข้อมูลในพื้นที่ที่มันทำงานอย่างไร วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการตั้งค่าเส้นทางที่มีสีอ่อน (ฉันใช้แถบกระดาษเครื่องพิมพ์สีขาว แต่อะไรก็ได้ที่เป็นสีอ่อน) บนพื้นผิวที่ Robo-Technician ทำงาน

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

ตรวจสอบให้แน่ใจว่าได้เสียบ Raspberry Pi เข้ากับ iRobot® และคอมพิวเตอร์ของคุณเชื่อมต่อกับการเชื่อมต่ออินเทอร์เน็ตเดียวกัน คุณจะใช้เวลาน้อยลงในการดึงผมออกเพื่อพยายามคิดว่าเหตุใด Matlab จึงไม่เชื่อมต่อ

r = roomba (หมายเลขที่คุณตั้งค่า)

ตัวแปร " r " ในกรณีนี้ไม่จำเป็น คุณสามารถเรียกมันว่าอะไรก็ได้ที่คุณต้องการ แต่มันทำให้ชีวิตง่ายขึ้นในการใช้ตัวแปรตัวอักษรเดียว

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

ตอนนี้เริ่มต้นเซ็นเซอร์ทดสอบด้วยคำสั่ง:

r.testSensors

โปรดทราบว่า " r " คือตัวแปรที่คุณกำหนดไว้ก่อนหน้านี้ ดังนั้น หากไม่ใช่ ' r ' ให้เปลี่ยน ' r. กับสิ่งที่คุณตัดสินใจ สิ่งนี้จะแสดงหน้าจอเซ็นเซอร์ทดสอบพร้อมข้อมูลมากมาย

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

ขั้นตอนที่ 4: การเริ่มต้นรหัส

ก่อนอื่นคุณจะต้องสร้างฟังก์ชัน ฉันเรียกมันว่า "เส้นทาง" แต่อีกครั้ง ไม่จำเป็นต้องใช้ชื่อนี้ แต่ฉันจะเรียกมันว่า "เส้นทาง" ต่อจากนี้ไป

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

รายการ = {'แดง', 'น้ำเงิน', 'เขียว'}

problist = {'Casualty, Save Image', 'Component Out of Place, Save Image', 'Expected, Continue'} pathcolor = listdlg ('PromptString', 'Select a Path Color', … 'SelectionMode', 'single', 'ListString', รายการ) ปัญหา = 0; ไดรฟ์ = ;

ต้องประกาศตัวแปร "prob" และ "driv" ที่นี่ เนื่องจากจะใช้ภายใน main while loop ของฟังก์ชัน แต่อีกครั้ง ถ้าคุณต้องการเปลี่ยนชื่อตัวแปรเหล่านี้หรือเปลี่ยนการเลือกรายการ ก็ไม่เป็นไร คุณมีความสอดคล้องในส่วนที่เหลือของรหัส

ขั้นตอนที่ 5: ด้านบนของวงในขณะที่: เซ็นเซอร์การกระแทกทางกายภาพ

ด้านบนของลูป while มีลอจิกเซ็นเซอร์การชนทางกายภาพ โดยพื้นฐานแล้วเมื่อ Robo-Technician ชนกับบางอย่างจะหยุด (หรือสำหรับเซ็นเซอร์กันกระแทกด้านหน้าจะสำรองไว้ 0.1 เมตร) จากนั้นจะจัดตำแหน่งตัวเองเพื่อถ่ายภาพ ให้ครอบคลุมส่วนควบคุมความเร็วและตำแหน่งก่อน

หากคุณทดสอบเซ็นเซอร์ทั้งหมดกับ Robo-Technician ในขั้นตอนก่อนหน้านี้ คุณจะรู้ว่าเซ็นเซอร์กันกระแทกมีค่าตรรกะ (0 หรือ 1) โดยมีค่าศูนย์ซึ่งแสดงถึงตำแหน่งปกติที่ไม่ได้กดของเซ็นเซอร์ เก็บไว้ในใจสำหรับรหัส

ในขณะที่ true %main ในขณะที่ลูป % รับข้อมูลบัมเปอร์ S = r.getBumpers ถ้า S.left ~= 0 r.stop elseif S.right ~= 0 r.stop elseif S.front ~= 0 r.stop end

นี่เป็นส่วนพื้นฐาน "ถ้ามันกระทบอะไรหยุด" หากเซ็นเซอร์ตรวจจับการชนกัน เซ็นเซอร์จะเคลื่อนไปยังส่วนถัดไปของรหัส ซึ่งจะปรับตำแหน่งของ Robo-Technician ใหม่เพื่อให้ได้ภาพถ่าย

ถ้า S.left ~= 0 % ถ้าลูปใช้ข้อมูลบัมเปอร์และจัดตำแหน่งกล้องสำหรับรูปภาพ r.turnAngle(5) หยุดชั่วคราว (0.5) img = r.getImage % ถ่ายภาพและแสดงภาพ (img) % กล่องโต้ตอบ prob = listdlg(' PromptString', 'พบอุปสรรคที่ไม่คาดคิด โปรดระบุ'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r getImage image(img) prob = listdlg('PromptString', 'Found an Unexpected Obstacle โปรดระบุ'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) หยุดชั่วคราว (0.5) img = r.getImage image (img) prob = listdlg('PromptString', 'พบอุปสรรคที่ไม่คาดคิด โปรดระบุ'…, 'SelectionMode', 'single', 'ListString', problist) สิ้นสุด

โดยพื้นฐานแล้ว เมื่อถ่ายภาพแล้ว กล่องโต้ตอบอื่นจะปรากฏขึ้นพร้อมสามตัวเลือก สองตัวเลือกแรกจะบันทึกรูปภาพลงในโฟลเดอร์ที่ระบุ ซึ่งฉันจะกล่าวถึงในภายหลัง ในขณะที่ตัวเลือกที่สามเพียงแค่ปิดกล่องโต้ตอบและดำเนินการต่อผ่านลูป หากคุณจำตัวเลือกไม่ได้ ให้ดูที่ขั้นตอนก่อนหน้า

ตอนนี้ฉันแทรกส่วนโค้ดไว้ระหว่างส่วนเซ็นเซอร์กันกระแทกและส่วนการบันทึกรูปภาพ สิ่งนี้ใช้ค่า lightBumper และตั้งค่าความเร็วของไดรฟ์เป็น 0.025 เมตร/วินาที (ช้ามาก) ซึ่งไม่จำเป็นจริงๆ แต่จะช่วยลดการกระแทกของ Robo-Technician และทำให้เซ็นเซอร์การกระแทกทางกายภาพเสื่อมสภาพในที่สุด

L = r.getLightBumpers ถ้า L.left > 100 || L.leftFront >100 || L.rightFront >100 || L.right >100 driv = 0.025 r.setDriveVelocity(0.025) อื่น driv = 0.1 สิ้นสุด

นี่จะเป็นส่วนหนึ่งที่ค่าที่คุณสังเกตเห็น (และหวังว่าจะเขียนลงไป) ก่อนหน้านี้เข้ามาเล่น

"L.(ด้านข้างและทิศทางของเซนเซอร์) > 100" ขึ้นอยู่กับค่าที่ฉันสังเกต ดังนั้นหากการสังเกตของคุณแตกต่างกัน ให้เปลี่ยนตัวเลขเหล่านี้ แนวคิดก็คือถ้าช่างเทคนิคหุ่นยนต์สัมผัสได้ถึงบางสิ่งที่อยู่ข้างหน้ามันสักสองสามเซนติเมตร มันจะช้าลง มากกว่านั้นก็ไม่จำเป็น

ส่วนต่อไปเป็นที่ที่บันทึกรูปภาพไว้ใช้ในภายหลัง

% หากเลือกตัวเลือกแรกหรือตัวเลือกที่สองในกล่องโต้ตอบ prob ให้บันทึกรูปภาพหาก prob == 1 % ถ้าลูปสร้างข้อมูลไฟล์สำหรับรูปภาพ เขียนด้วยการประทับเวลา t = นาฬิกา; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); โฟลเดอร์ = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile (โฟลเดอร์ ชื่อฐาน); imwrite(img, fullFileName) ปิด รูปที่ 1 หยุดชั่วคราว (2) elseif prob == 2 t = นาฬิกา; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); โฟลเดอร์ = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile (โฟลเดอร์ ชื่อฐาน); imwrite(img, fullFileName) ปิด รูปที่ 1 หยุดชั่วคราว (2) สิ้นสุด

ชื่อไฟล์และตำแหน่งทั้งหมดที่บันทึกรูปภาพนั้นเป็นทางเลือก ฉันเลือกโฟลเดอร์ที่ซ้อนอยู่ในโฟลเดอร์ roomba ที่ฉันสร้างในขั้นตอนการแนะนำตัว แต่จะอยู่ที่ใดก็ได้ที่คุณเลือก นอกจากนี้ รูปถ่ายจะถูกบันทึกด้วยการประทับเวลา แต่นั่นก็ไม่จำเป็นอย่างยิ่ง (แม้ว่าจะมีประโยชน์ตามสมมุติฐานสำหรับภารกิจของดาวอังคาร)

เมื่อปิดเซ็นเซอร์กันกระแทกแล้ว เราสามารถเคลื่อนไปยังเซ็นเซอร์หน้าผาและเส้นทางต่อไปได้

ขั้นตอนที่ 6: ตามเส้นทาง

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

ก่อนที่เราจะไปที่รหัสเซ็นเซอร์หน้าผา มีส่วนรหัสสั้น ๆ ที่ฉันแทรกเพื่อล้างข้อมูลที่ไม่จำเป็นบางส่วนจาก Matlab ส่วนนี้ไม่จำเป็น แต่ฉันใช้มันเพื่อลดพื้นที่เก็บข้อมูลที่จำเป็นสำหรับการรันโปรแกรม

ล้าง img ล้าง t ล้างชื่อฐาน ล้าง fullFileName ล้างโฟลเดอร์

ส่วนรหัสถัดไปคือเนื้อของโครงการ ช่วยให้ Robo-Technician เดินตามเส้นทางสีอ่อนที่วางไว้บนพื้น โดยสรุป มันพยายามบังคับตัวเองเพื่อให้เซ็นเซอร์หน้าผาสองตัวด้านหน้าอยู่เหนือเกณฑ์ โดยอิงจากค่าที่สังเกตได้ของคุณ และช่วยให้โปรแกรมเริ่มขั้นตอนการประมวลผลภาพในภายหลังได้เล็กน้อย

C = r.getCliffSensors % ถ้าลูปตามแถบสี (สีขาว) ถ้า C.leftFront > 2000 && C.rightFront >2000 %เส้นบอกแนวตรง r.setDriveVelocity(driv) elseif C.leftFront 2000 % เลี้ยวขวาถ้าหุ่นยนต์ไปไกลเกินไป left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000%turns left if robot left ifrobot to right too far right r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront >100 || L.rightFront >100 || L.right >100 img = r.getImage end %checks to see if there are a bend in path if C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) วางตำแหน่ง % สิ้นสุดสำหรับการแสดงการรู้จำภาพเส้นทาง ('รับภาพ') สิ้นสุดปลายทาง

โปรดจำไว้ว่าชื่อตัวแปรที่ฉันเลือกนั้นเป็นทางเลือก แต่ฉันคิดว่ามันทำให้ชีวิตง่ายขึ้นที่จะใช้ตัวแปรตัวอักษรเดี่ยวเมื่อเป็นไปได้

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

เมื่อถ่ายภาพแล้ว ระบบจะใช้การจดจำภาพเพื่อค้นหาว่าต้องทำอย่างไร มีตัวยึดตำแหน่งในส่วนนี้ของรหัสเช่นกัน:

% ตัวยึดตำแหน่งสำหรับการรับรู้ภาพเส้นทาง ('GETTING IMAGE')

ฉันใช้สิ่งนี้ชั่วคราวเพราะฉันต้องการพูดเฉพาะเกี่ยวกับการประมวลผลข้อความและสีที่เกิดขึ้น ซึ่งอยู่ในขั้นตอนต่อไป

ขั้นตอนที่ 7: การประมวลผลภาพ

การประมวลผลภาพมีสองส่วน อย่างแรกคือการรู้จำสี ซึ่งจะคำนวณความเข้มของสีในรูปภาพเพื่อตัดสินใจว่าจะใช้การจดจำข้อความต่อไปหรือไม่ การคำนวณสีขึ้นอยู่กับตัวเลือกที่ทำในกล่องโต้ตอบแรกนั้นในตอนเริ่มต้น (ฉันใช้สีแดง น้ำเงิน เขียว แต่คุณสามารถเลือกสีใดก็ได้ที่คุณต้องการ ตราบใดที่ค่าเฉลี่ยสำหรับความเข้มของสีสามารถรับรู้ได้โดย กล้อง Raspberry Pi)

img = r.getImage img = imcrop(img, [0 30 512 354]) imgb =imcrop(img, [0 30 512 354]) imgt = imcrop(img, [0 30 512 354]) red = mean(mean() imgb(:,:, 1))); g = ค่าเฉลี่ย(หมายถึง(imgb(:,:, 2))); b = ค่าเฉลี่ย(หมายถึง(imgb(:,:, 3)));

นี่คือการตรวจสอบความเข้ม จะใช้ในส่วนถัดไปเพื่อตัดสินใจว่าต้องการทำอะไร

if red > g && red >b if pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == IMAGE || R. Words{2} == IMAGE || R. Words{3} ==IMAGE t = นาฬิกา; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); โฟลเดอร์ = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile (โฟลเดอร์ ชื่อฐาน); imwrite(img, fullFileName) หยุดชั่วคราว(2) elseif R. Words{1} == RIGHT || R. Words{2} == ขวา || R. Words{3} ==RIGHT r.turnAngle(-75) elseif R. Words{1} == LEFT || R. Words{2} == ซ้าย || R. Words{3} == ซ้าย r.turnAngle(75) elseif R. Words{1} == BACK || R. Words{2} == ย้อนกลับ || R. Words{3} ==BACK r.turnAngle(110) end else r.turnAngle(110) end end

ส่วนนี้กำหนดว่าสีที่เลือกในกล่องโต้ตอบแรกตรงกับสีที่กล้องเห็นหรือไม่ ถ้ามันรันจะรันการจดจำข้อความ ดูเหมือนว่าจะเห็นว่าคำใด (IMAGE, BACK, RIGHT หรือ LEFT) ปรากฏขึ้นจากนั้นจึงเลี้ยว (สำหรับขวาและซ้าย) หมุนไปรอบ ๆ (สำหรับด้านหลัง) หรือถ่ายภาพและบันทึกในลักษณะเดียวกับก่อนหน้านี้

ฉันได้ให้รหัสเพียงส่วนเดียวสำหรับสีที่ต่างกัน

เพื่อให้โค้ดรู้จักสีน้ำเงินและสีเขียว เพียงคัดลอกโค้ดแล้วเปลี่ยนการตรวจสอบลอจิกที่ด้านบนของเซ็กเมนต์และตั้งค่า " pathcolor == (number) " ให้สอดคล้องกับการเลือกสีจากกล่องโต้ตอบด้านบน (สำหรับ รหัสตามที่แสดง สีน้ำเงินจะเป็น 2 และสีเขียวจะเป็น 3)

ขั้นตอนที่ 8: ผลิตภัณฑ์สำเร็จรูป

ผลิตภัณฑ์สำเร็จรูป
ผลิตภัณฑ์สำเร็จรูป

ตอนนี้ Robo-Technician ควรซูมไปรอบๆ โมดูลภารกิจของ Mars และรายงานกลับไปยังนักบินอวกาศเมื่อมีสิ่งผิดปกติเกิดขึ้น

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

หวังว่าคุณจะสนุกกับการสร้างผู้ช่วยตัวน้อยสำหรับภารกิจ Mars และสนุกกับการสร้าง

แนะนำ: