การควบคุมแบบ PID ด้วย TurtleSim
บทคัดย่อ
Move Turtle เป็นสคริปต์ไพทอนของ ROS แบบง่าย ๆ ที่ทำให้เต่าใน TurtleSim ของ ROS เคลื่อนที่ไปยังพิกัด (จุด) ที่กำหนด โครงการนี้เริ่มต้นขึ้นในฐานะโครงการชั้นเรียนสำหรับ CSCI473 ที่ Colorado School of Mines (CSOM) และต่อมาได้พัฒนาเป็นโครงการที่ฉันใช้ช่วยเรียนรู้ว่าระบบวงปิดสามารถสร้างขึ้นได้อย่างไร โดยนำความรู้นี้ไปใช้ช่วยงานของฉันที่ห้องปฏิบัติการ Human Center Robotics (HCR) ของ CSOM
บริบท
เพื่อเป็นข้อมูลพื้นฐาน ROS ย่อมาจาก ระบบปฏิบัติการหุ่นยนต์ ROS เป็นมิดเดิลแวร์หุ่นยนต์แบบโอเพนซอร์ส ซึ่งมักใช้งานคู่กับระบบปฏิบัติการ Ubuntu และใช้เพื่อช่วยจัดการส่วนประกอบ/คลัสเตอร์ซอฟต์แวร์ของระบบหุ่นยนต์ให้ดียิ่งขึ้น คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้ ROS ได้จาก วิกิ อย่างเป็นทางการของ ROS โค้ดที่คุณเขียนใน ROS จะเป็นภาษา C++ หรือ Python
TurtleSim เป็นเครื่องจำลองหุ่นยนต์ 2 มิติแบบง่าย ๆ ที่ใช้เป็นบทนำสู่ ROS และแพ็กเกจ ROS สำหรับผู้ใช้ ROS รายใหม่ สิ่งเดียวที่ TurtleSim ทำคือเปิดหน้าจอแสดงผล 2 มิติแบบง่าย ๆ พร้อมเต่าหนึ่งตัว เต่าตัวนั้นทำหน้าที่เป็น “หุ่นยนต์” และคุณสามารถส่งข้อความไปยัง “หุ่นยนต์” ตัวนั้นเพื่อให้มันเคลื่อนที่และ/หรือเลี้ยวได้ ขณะเคลื่อนที่ TurtleSim จะสร้างข้อผิดพลาดแบบสุ่มขึ้นมาเพื่อจำลองฟิสิกส์ของโลกจริงด้วยวิธีที่เรียบง่าย
เมื่อรู้แล้วว่า ROS และ TurtleSim คืออะไร แล้วเหตุใดฉันจึงใช้สิ่งเหล่านี้? ย้อนกลับไปในช่วงฤดูใบไม้ผลิปี 2020 ฉันกำลังเรียนวิชาที่ชื่อว่า “หุ่นยนต์ที่มีมนุษย์เป็นศูนย์กลาง” ที่ Colorado School of Mines ซึ่งเป็นส่วนหนึ่งของชุดวิชาเรียนระดับปริญญาตรีด้านวิทยาการคอมพิวเตอร์ของฉัน วิชานี้สอนโดย Dr. Hao Zhang วิชานี้ประกอบด้วยสามโครงการ และโครงการแรกประกอบด้วยการติดตั้ง ROS เรียนรู้วิธีใช้ ROS และนำอัลกอริทึมแบบวงเปิดหรือวงปิดมาใช้งาน เพื่อให้เต่าใน TurtleSim วาดตัว M คำอธิบายโครงการฉบับดั้งเดิมสามารถดูได้ที่ นี่
ตอนที่ฉันเรียนวิชานี้ ฉันทำโครงการนี้เสร็จโดยนำอัลกอริทึมแบบวงเปิดมาใช้ วิธีแก้ปัญหานี้ใช้งานได้ แต่แย่มากจริง ๆ และวาดตัว A ที่ “ดีพอใช้” แต่ยังห่างไกลจากคำว่า “ยอดเยี่ยม” หลังจากส่งโครงการในช่วงกลางเดือนกุมภาพันธ์ 2020 ฉันก็ลืมมันไปจนกระทั่งอีกหนึ่งปีต่อมาในช่วงประมาณเดือนกุมภาพันธ์ 2021
ความท้าทาย
ในเดือนกุมภาพันธ์ 2021 ฉันได้รับการว่าจ้างให้เป็นผู้ช่วยวิจัยที่ห้องปฏิบัติการ Human Centered Robotics (HCR) ใน Colorado School of Mines ซึ่งฉันทำงานภายใต้การดูแลของ Dr. Hao Zhang เป้าหมายของห้องปฏิบัติการคือการวิจัยเรื่อง “ความเป็นอิสระแบบทำงานร่วมกันตลอดชีวิต โดยมีเป้าหมายเพื่อให้หุ่นยนต์สามารถทำงานและปรับตัวได้เป็นเวลานาน” ณ วันที่ 9-1-2022 (1 กันยายน 2022) ห้องปฏิบัติการได้ย้ายจาก Colorado School of Mines ไปยัง University of Massachusetts Amherst แล้ว แต่ตอนที่ฉันทำงานที่นั่น ห้องปฏิบัติการยังตั้งอยู่ใน Colorado
ที่ห้องปฏิบัติการ HCR ฉันได้รับมอบหมายให้ทำงานในโครงการ Triton โครงการ Triton ประกอบด้วยหุ่นยนต์หลายตัว หลายสิบตัว ซึ่งเรียกว่า Triton Triton เป็นหุ่นยนต์ภาคพื้นดินแบบ ล้ออเนกประสงค์ รูปสามเหลี่ยมที่มีหน้าตาดังนี้:
นอกจาก Triton แล้ว ยังมีกล้อง อินฟราเรด จำนวนแปดตัวจาก OptiTrack จัดวางในรูปแบบ “แปดเหลี่ยม” สูงจากพื้นไม่กี่ฟุต เมื่อใช้กล้องเหล่านั้น ซอฟต์แวร์ Motive ของ OptiTrack คอมพิวเตอร์ที่ใช้ Windows 10 และ ROS จะสามารถสร้างพื้นที่ขนาด 2 เมตรคูณ 2 เมตรคูณ 2 เมตร (x, y, z) ซึ่งสามารถระบุตำแหน่งจริงที่แน่นอนของวัตถุที่มี มาร์กเกอร์จับการเคลื่อนไหว ได้
งานแรกของฉันในโครงการ Triton คือการสร้างสคริปต์ที่ทำให้หุ่นยนต์ Triton เคลื่อนที่ไปยังตำแหน่งจริงที่เฉพาะเจาะจง ในเวลานั้นฉันยังไม่แน่ใจว่าจะทำให้สำเร็จได้อย่างไร แต่ฉันจำโครงการแรกจาก CSCI473 ได้ว่าแนวคิดของระบบวงปิดเคยถูกแนะนำให้ฉันรู้จัก ดังนั้นฉันจึงเริ่มค้นคว้าเกี่ยวกับระบบวงปิดอย่างจริงจัง และต่อยอดไปสู่ระบบป้อนกลับ
การค้นคว้า
ระหว่างการค้นคว้า ฉันค้นพบวิดีโอยอดเยี่ยมนี้โดย AerospaceControlsLab:
ในวิดีโอนี้ ฉันได้เรียนรู้และได้รับคำอธิบายเกี่ยวกับแนวคิดของระบบ PID ระบบ PID คือระบบวงปิด ระบบวงควบคุม ที่สร้างเอาต์พุตเฉพาะขึ้นโดยอิงจากข้อมูลจากโลกจริง กล่าวโดยพื้นฐานแล้ว มันคือระบบป้อนกลับที่ปรับเอาต์พุตโดยอิงจากความแตกต่างระหว่างค่าที่ต้องการกับค่าที่วัดได้ นี่คือสูตรสำหรับตัวควบคุม PID:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ คือสัญญาณควบคุม
- $K_p$, $K_i$, $K_d$ คืออัตราขยายแบบสัดส่วน แบบอินทิกรัล และแบบอนุพันธ์ตามลำดับ
- $e(t)$ คือสัญญาณความคลาดเคลื่อน (ความแตกต่างระหว่างเอาต์พุตที่ต้องการกับเอาต์พุตจริง)
- $\int e(t) dt$ คืออินทิกรัลของความคลาดเคลื่อนตามเวลา
- $\frac{de(t)}{dt}$ คืออนุพันธ์ของความคลาดเคลื่อน
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ ให้ดู วิดีโอของ AerospaceControlsLab หรือ บทความวิกิพีเดีย ที่ยอดเยี่ยมนี้ ซึ่งเป็นแหล่งที่มาของสูตร
หลังจากค้นคว้า รวมทั้งได้รับความช่วยเหลือจากเพื่อนและอาจารย์ที่เก่งของฉัน ฉันสรุปได้ว่าการใช้ตัวควบคุมแบบสัดส่วน หรือตัวควบคุม P น่าจะเหมาะสมที่สุดสำหรับช่วยให้ Triton ไปถึงพิกัดที่เฉพาะเจาะจง
เนื่องจาก Triton เป็นหุ่นยนต์ภาคพื้นดิน ฉันจึงต้องพิจารณาเพียงพิกัด X และ Y เมื่อรู้อย่างนี้แล้ว ฉันจึงต้องกำหนดว่าค่าใดคือค่าที่ต้องการ และค่าใดคือค่าที่วัดได้ เพื่อวัดและประมวลผลภายในตัวควบคุม P ในการค้นคว้าของฉัน ฉันพบโพสต์ที่ยอดเยี่ยมบนวิกิ ROS ซึ่งเรียกว่า ไปยังเป้าหมาย โดยมุ่งเน้นไปที่ความคลาดเคลื่อนต่อไปนี้:
- ความคลาดเคลื่อนของระยะทาง: ความแตกต่างของระยะทางระหว่างตำแหน่งที่ต้องการ (X, Y) และตำแหน่งปัจจุบัน (X, Y)
- ความคลาดเคลื่อนของ Theta: ความแตกต่างระหว่างทิศทางที่ต้องการกับทิศทางปัจจุบัน
แนวทางแก้ปัญหาที่เสนอ
เมื่อรู้ทั้งหมดนี้แล้ว วิธีแก้ปัญหาในการทำให้ Triton เคลื่อนที่ไปยังพิกัดจริงที่เฉพาะเจาะจง คือการใช้ตัวควบคุมแบบสัดส่วนสำหรับความคลาดเคลื่อนของระยะทางและความคลาดเคลื่อนของ theta ของ Triton โดยพิจารณาจากพิกัดเป้าหมายและพิกัดปัจจุบันของ Triton แต่ก่อนที่จะนำสิ่งนี้ไปใช้กับระบบจริง ฉันต้องการทดสอบแนวคิดนี้ในการจำลอง และในเวลานั้นฉันคิดว่าการใช้ TurtleSim เป็นการจำลองน่าจะเป็นตัวเลือกที่ดีที่สุด
การทดสอบในการจำลอง
เมื่อมีแนวทางแก้ปัญหาเชิงทฤษฎีแล้ว ฉันเลือกตรวจสอบความถูกต้องในเบื้องต้นผ่านการจำลอง แทนที่จะใช้สถานการณ์ในโลกจริง โลกจริงมักเต็มไปด้วยสัญญาณรบกวนที่อาจทำให้ประสิทธิผลของแนวทางแก้ปัญหาคลุมเครือ และนำไปสู่การต้องจัดการกับปัญหาที่ไม่เกี่ยวข้อง เมื่อคำนึงถึงเรื่องนี้ ฉันจึงกลับไปทบทวนโครงการจาก CSCI473 และปรับให้เป็นพื้นที่ทดสอบสำหรับแนวทางแก้ปัญหาเชิงทฤษฎีนี้
หลังจากอัปเดตโค้ดเก่าจากการใช้ ROS Melodic มาเป็น ROS Noetic และปรับปรุงซ้ำหลายรอบ ฉันก็ทำให้แนวทางแก้ปัญหาที่เสนอใช้งานได้ใน TurtleSim การสาธิตการทำงานของมัน พร้อมเส้นทางพิกัดเป้าหมายเจ๋ง ๆ สามารถดูได้ที่ส่วนท้ายของบล็อกโพสต์นี้ โค้ดทั้งหมดสำหรับเรื่องนี้สามารถดูได้ที่ นี่
บทสรุป
โดยสรุปแล้ว จากโครงการนี้ เต่า TurtleSim สามารถนำทางไปยังพิกัดที่กำหนดได้อย่างมีประสิทธิภาพโดยใช้ระบบวงปิด ซึ่งทำงานได้ดีกว่าระบบวงเปิดเริ่มต้นของฉันจากปี 2020 อย่างมาก หลังจากทดสอบจนสำเร็จ ฉันได้นำแนวทางแก้ปัญหานี้ไปใช้กับหุ่นยนต์ Triton แต่สัญญาณรบกวนในโลกจริงทำให้เกิดปัญหาที่ไม่คาดคิด ซึ่งต้องใช้เวลาหลายสัปดาห์ในการแก้ไขข้อบกพร่องและทดสอบในโลกจริง หลังจากผ่านไปหลายสัปดาห์ ในที่สุดฉันก็ทำให้ Triton ไปถึงพิกัดจริงที่เฉพาะเจาะจงได้ โดยใช้แนวทางแก้ปัญหาที่ฉันทดสอบใน TurtleSim ในที่สุด นี่คือการสาธิตการเคลื่อนที่ของ Triton ไปยังพิกัดจริงที่เฉพาะเจาะจง โดยใช้วิธีการที่ทดสอบใน TurtleSim:
เมื่อมองย้อนกลับไป ฉันอยากใช้การจำลองที่จำลองฟิสิกส์ของโลกจริงได้ดีกว่านี้ TurtleSim เหมาะอย่างยิ่งสำหรับการเรียนรู้ แต่ไม่เหมาะสำหรับการทดสอบแนวคิดด้านหุ่นยนต์ในโลกจริง ในเวลานั้นฉันคิดว่ามันน่าจะดีพอสำหรับกรณีการใช้งานง่าย ๆ ของฉัน แต่ภายหลังได้รับการพิสูจน์ว่าไม่เป็นเช่นนั้น
วัตถุประสงค์หลักของบล็อกโพสต์นี้คือการอธิบายการสร้างระบบวงปิดที่ทำให้เต่าใน TurtleSim และต่อมาคือหุ่นยนต์ Triton สามารถนำทางไปยังตำแหน่งเป้าหมายที่กำหนด (X, Y) ได้อย่างแม่นยำ ฉันเชื่อว่าวัตถุประสงค์นี้บรรลุผลแล้ว แต่สิ่งนี้อาจทำให้ผู้คนบางส่วนสนใจงานของฉันที่ห้องปฏิบัติการ HCR เมื่อรู้อย่างนี้แล้ว ฉันมีแผนที่จะเขียนบล็อกโพสต์เพิ่มเติมเกี่ยวกับประสบการณ์การทำงานของฉันที่ห้องปฏิบัติการ HCR…
การสาธิตการเคลื่อนที่ของเต่า (TurtleSim)
วิดีโอนี้ประกอบด้วยการสาธิตต่อไปนี้:
- โหนด Cayley: การออกแบบ โหนด Cayley แบบง่าย ๆ
- วงกลม: การออกแบบที่มีลักษณะคล้ายใยแมงมุม
- วงกลมซ้อนวงกลม: การออกแบบ “วงกลมที่อยู่ภายในวงกลม”
- M: การออกแบบตัว M ที่เรียบง่ายมาก