การใช้อัลกอริทึม PID โดยใช้คอมพิวเตอร์วิชั่น


10

ฉันกำลังสร้างตัวแก้เขาวงกตอัตโนมัติและใช้เว็บแคมเพื่อควบคุมเขาวงกต

จากคำแนะนำในฟอรัมอื่นฉันพยายามควบคุมการเคลื่อนที่ของเขาวงกตอย่างน้อยในทิศทางเดียวในขณะนี้ ดังนั้นฉันจึงพยายามควบคุมการเคลื่อนไหวของลูกของฉันระหว่างสองพิกัด 466,288 และ 466,152 อินพุตไปยังบอร์ดควบคุมมอเตอร์สเต็ปเป็นเวลาโดยไม่มีขั้นตอนในการหมุนสำหรับแต่ละแกนเช่น x และ y

บอร์ดควบคุมมอเตอร์ที่ฉันใช้คือบอร์ดควบคุมมอเตอร์บอทไข่: http://www.sparkfun.com/products/10025

ดังนั้นในการเคลื่อนที่ระหว่างสองจุดฉันควรสร้างจำนวนจุดทางระหว่างสองจุดคือ 288 และ 152 (พูด 260 240 230 ... 150) และแก้ไขการเคลื่อนที่ของลูกบอลของฉัน?

อัลกอริทึมการประมวลผลภาพของฉันไม่เร็วพอที่จะติดตามลูกบอลที่ลูกบอลเพิ่งหมุนและตกลงไปในหลุม

บางคนแนะนำว่าฉันใช้เทมเพลตมาตรฐานตามที่แสดงในวิดีโอต่อไปนี้และแก้ไขการเคลื่อนไหวลูกของฉันสำหรับการเบี่ยงเบนในเส้นทาง:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

ฉันยังเจอเครื่องมือประมวลผลภาพที่พวกเขาแก้ปัญหาเดียวกันโดยใช้วิธีชี้คะแนนสำหรับการเคลื่อนที่ของลูกบอล การเห็นวิธีแก้ไขปัญหาเดียวกันมากเกินไปฉันสับสนโดยสิ้นเชิงในการแก้ปัญหา ฉันรู้ว่าฉันควรใช้คอนโทรลเลอร์ PID แต่ฉันจะไปแก้ปัญหาเป็นระยะได้อย่างไร? ฉันติดขัดและท้อแท้ในการค้นหาความเป็นผู้นำในการแก้ปัญหา

การตั้งค่าของฉันมีลักษณะเช่นนี้:

รูปภาพของการตั้งค่า

... และนี่คือภาพหน้าจอของซอฟต์แวร์ของฉัน:

ภาพหน้าจอ

ฉบับที่ 2: ฉันกำลังเผชิญกับปัญหาใหม่ในตอนนี้: ก่อนหน้านี้ฉันควบคุมมอเตอร์ผ่านทางแอปเพล็ต Java พอร์ตอนุกรม Arduino ฉันสามารถขับสเต็ปเปอร์ได้โดยใช้แอปเพล็ต

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

รุ่นที่ 3:

ฉันมีความคืบหน้าบางอย่างเมื่อใช้อัลกอริทึม PID โปรดค้นหาวิดีโอด้านล่าง: http://www.youtube.com/watch?v=MEfp7RqPmqY

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

ความคิดของฉันคือฉันควร จำกัด ค่า PID ด้วยเพดานซึ่งหากค่า PID ที่คำนวณได้มากกว่า 100 ฉันควรส่ง 100 ฉันรอคอยที่จะได้ยินความคิดของคุณเกี่ยวกับเรื่องนี้

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

รุ่นที่ 4:

วิถีกระสุนที่แยกได้

ฉันแยกเส้นทางการเคลื่อนที่ แต่ฉันไม่สามารถค้นหาฟังก์ชันที่ถูกต้องเพื่อพิมพ์พิกัดพิกเซลที่ถูกต้องจากจุดเริ่มต้น ความคิดใด ๆ


1
Re PS: แล้วเพียงแค่โพสต์ลิงค์ไปยังภาพและฉันแน่ใจว่าคนที่จะมาพร้อมและแทนที่ด้วยภาพตัวเอง ...
Majenko

@Matt - แก้ไข! อย่างไรก็ตามฉันต้องการให้ผู้ใช้ระบุข้อความเพื่อไปกับรูปภาพไม่ใช่แค่ลิงก์ไปยังรูปภาพ ฉันไม่แน่ใจว่า @Sai ต้องการอะไรฉันแค่วางไว้ที่ด้านล่าง
Kevin Vermeer

ว้าว .... ผู้คุมเหล่านั้นมีแรงบิดเพียงพอที่จะเคลื่อนย้ายบอร์ดด้วยความเร็วหรือไม่? ฉันหวังว่าจะมีการลดเกียร์ในบางแห่ง
Connor Wolf

@Fake - steppers ไม่ควรมีปัญหากับเรื่องนี้ บอร์ดไม่ได้มีน้ำหนักมากและมีน้ำหนักที่สมดุล ฉันมีนาฬิกาแขวนผนังที่มีมือยาว 40 ซม. และมันถูกควบคุมโดยกลไกขนาดเล็กเช่นเดียวกันกับที่อื่นนั่นก็คือสเต็ป (กลไก 5cmx5cm ดูมีขนาดเล็กเมื่อเทียบกับขนาดเส้นผ่าศูนย์กลาง 80 ซม. ของนาฬิกา)
stevenvh

@Fake: Steve ถูกต้อง ฉันไม่มีปัญหากับ stepper มันคือทั้งหมดที่เกี่ยวกับอัลกอริทึม PID
Sai

คำตอบ:


2

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

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

สำหรับการควบคุมแบบ PID ให้เริ่มจากข้อเท็จจริงที่ว่าคุณต้องการตัวควบคุม PID ที่แยกกันสองตัวตัวหนึ่งสำหรับตัวขับมอเตอร์ตะวันออก - ตะวันตกอีกตัวหนึ่งสำหรับตัวควบคุมทิศตะวันตกเฉียงใต้ หากคุณมีมอเตอร์ที่แน่นอนสองตัวพารามิเตอร์ของพวกเขาจะต้องเท่ากัน

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

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

ดังนั้นก่อนเริ่มการควบคุมคุณควรทำตามรายการตรวจสอบต่อไปนี้ก่อน:

  • ลดความซับซ้อนของอัลกอริทึมการประมวลผลภาพของคุณเพื่อให้ตอบสนองได้เร็วขึ้น
  • สร้างอัลกอริทึมที่สร้างเส้นทางการเคลื่อนที่ของคุณโดยใช้ความเร็วที่กำหนดไว้ล่วงหน้า
  • ในแต่ละเฟรม:
    • คำนวณความแตกต่างระหว่างวิถีและตำแหน่งบอล
    • ส่งส่วนประกอบของเดลต้า -X ไปทาง PID ตะวันออกเฉียงเหนือผ่านเดลต้า -Y ไปทางเหนือ - ใต้พีไอดี

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


1

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

ในการมองเห็นลูกบอลคุณสามารถใช้ LED IR 1 จุดคงที่และฟิลเตอร์แบนด์แบนด์ในกล้อง อัลกอริทึมต้องคำนวณพิกเซลที่สว่างที่สุดและแปล X, Y เป็นจริง X, Y โดยคำนึงถึงขั้นตอนต่างๆดังนี้:

  • ค้นหาพิกเซลที่สว่างที่สุด
  • ใช้มุมสำหรับทั้งสองแกน (อ่านจากเซอร์โว) เพื่อกู้คืนระยะทางจากกล้อง
  • ใช้การประทับเวลาสำหรับการอ่านตำแหน่งแกน
  • ใช้การแก้ไขผ่านเวลาสำหรับการอ่านตำแหน่งหากจำเป็น
  • ใช้การบิดเบือนเลนส์ที่รู้จัก
  • แปล world X, Y ของพิกเซลเป็นมุมของการสะท้อนจากทรงกลมที่สมบูรณ์แบบเพื่อค้นหาจุดศูนย์กลางที่แท้จริงของลูกบอลใน world X, Y
  • เวลาเดลต้าเพื่อกู้คืนเวลาจริงของเฟรม
  • การแก้ไขในช่วงเวลาของตำแหน่งในระนาบบอร์ด X, Y หากจำเป็น
  • ส่งผลลัพธ์ X, Y (t) ไปยังอัลกอริทึม PID
  • ส่งเป้าหมายฟีดที่สอง X, Y (t) จากตัวสร้างวิถี / ลำดับ
  • ให้ PID ตัดสินใจเอาท์พุท
  • รันเอาต์พุต (ขั้นตอนสุดท้ายสามารถทำแบบขนาน)

ไม่ควรใช้การคำนวณอย่างเข้มข้นและส่วนใหญ่ขึ้นอยู่กับค่าสัมบูรณ์สองเท่า

โดยปกติซีพียูขนาดเล็กควรทำด้วยความเร็วของอัตราเฟรม


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

ใช่. ซอฟต์แวร์ควบคุมการเคลื่อนไหวจะต้องมี "เครื่องกำเนิดวิถี" ซึ่งเป็นกิจวัตรการผลิตลำดับ จำกัด ที่เหมาะสมที่สุดของ X, Y (t) สำหรับขั้นตอนใดก็ตาม ลำดับนี้จะถูกป้อนไปยังอินพุตแรกของลูปควบคุมและอินพุตที่สองของลูปควบคุมเป็นลำดับของตำแหน่งจริง ชุดคำสั่งควบคุมต้องคำนวณข้อผิดพลาดตำแหน่ง / ความเร็ว / การเร่งความเร็วและขยาย / สรุปข้อผิดพลาดทั้งหมดตาม PID และสร้างสัญญาณแก้ไขที่เกิดขึ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.