Parameter Estimation ในวิชา Basic control


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

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

ส่วนหัวข้อที่จะพูดถึงก็จะมีประมาณนี้

Overview
Mathematic Modelling Dynamic DC Motor
การเก็บข้อมูล
การทำ Parameter Estimate ใน matlab

Overview

ทำไมเราถึงต้องทำ Parameter Estimation? ถ้าหากเราต้องการทำ Simulation ระบบซักอย่าง การที่เรารู้แค่ model mathermatic คงยังไม่พอ เพราะว่า motor ของเรานั้นไม่ได้ทำงานเหมือนกันทั้งหมดซะทีเดียว และอีกอย่างเจ้าของบล็อกก็คิดว่าสะดวกดี ที่ว่าเราไม่จำเป็นต้องรู้ Spec ของ motor ละเอียด เราก็สามารถสร้าง Simulation ที่ใกล้เคียงกับระบบจริงได้ โดยที่สิ่งที่เราต้องรู้ก็คือ Behavior หรือพฤติกรรมของ motor เมื่อเราใส่ input ใด ๆ เข้าไป

โดยหลักการของการ Estimation จะขออ้างอิงจาก diagram นี้



จากทางซ้าย y ก็คือ Output ที่ได้จาก Log data ซึ่งเป็น Output ที่เกิดจาก Motor ของเรา สิ่งที่เราต้องทำก็คือใช้ Matlab ประมาณค่า Parameter และมาใช้กับ Math model ของเรา เพื่อให้ y ที่ได้จากการ Estimate ใกล้เคียงกับ y ของ motor โดยระบบจะปรับค่า parameter ไปเรื่อย จนกว่าจะได้ค่า y ที่ใกล้เคียง  y motor มากที่สุด 


Mathematics Modelling Dynamic DC Motor

จากรูปด้านบน คือวงจรที่ต่อ DC Motor จะเห็นว่ามีทั้งฝั่งที่เป็น Circuit และที่เป็น mechanical โดย Math model ที่ได้จากวงจรนี้คือ

ในส่วนของ Circuit Math แรงดันที่ตกคร่อมตัว L ในการทำงานจริง จะเกิดการเปลี่ยนแปลงน้อยมาก ๆ จนสามารถตัดออกให้เป็น 0 ได้เลย ฝั่ง Circuit Math ก็เลย re-design ออกมาใหม่ได้เป็น


จากนี้คือเราสามารถเอา i ในสมการ ไปแทนในสมการส่วนของ mechanical ได้เลย สุดท้ายแล้วเราจะได้ออกมาเป็น 


จริง ๆ แล้ว เราสามารถ Group รวมค่าคงที่ได้อีก ก็จะเหลือแค่ตามด้านล่างก็ได้เช่นกัน


สุดท้ายเราก็แปลงเป็น State Space


ในส่วนของ Output เราต้องรู้ว่าเราต้องการจะหาอะไร ให้สอดคล้องกับ Math Model ของเราด้วย ของเจ้าของบล็อกเลือกใช้ theta ถ้าสมมติให้อัตราทดเฟืองเป็น 1:1 เจ้าของบล็อกก็สามารถใช้ theta อะไรก็ได้จะฝั่ง input หรือ output ของ motor

ตอนนี้ก็เก็บ State Space ไว้ก่อน หรือจะข้ามไปทำส่วนของ Estimate parameter ได้เลยก็ได้ แต่สุดท้ายก็จะต้องมี Log data ไว้เป็น Reference อยู่ดี เพราะงั้นในส่วนถัดไป ก็คือ การเก็บ Log data นั่นเอง

Logged Data

ในส่วนของการเก็บข้อมูล โดยหลัก ๆ แล้ว สิ่งที่เราเก็บจะมีอยู่ด้วยกัน 3 อย่าง คือ Time , Input , Output ในการเก็บข้อมูลเราจะทดสอบ Motor แบบ Open loop เราจ่าย Signal Input เข้าไปแล้วดู Behavior ของ Motor ว่าจะออกมาเป็นอย่างไร ในส่วนนี้เราจะใช้ Encoder เพื่อดูว่า Motor ของเรามีการทำงานออกมายังไงนั่นเองง


ส่วนนี้น่าจะเป็นส่วนที่ยุ่งยากนิดนึงจากทั้งหมดที่ต้องทำ ส่วนสำคัญในการเก็บข้อมูลก็คือ ความถี่ในการเก็บข้อมูล หรือ Sampling time นั่นเอง ทำไมถึงสำคัญ? ลองนึกดูว่า ถ้าหากเราเขียน MCU Sampling ใน loop ธรรมดา สิ่งที่เกิดขึ้นคือ เราไม่รู้ว่าข้อมูล time ที่เราเก็บ กับ time ที่มัน sampling แต่ละครั้งมันเท่ากันหรือเปล่า
" Timer Interrupt "
 Timer Interrupt คือพระเอกของเราในงานนี้ เพราะถ้าหากเรา sampling อยู่ใน Interrupt เราสามารถมั่นใจได้เลยว่า time ของเราถูกต้องแน่นอนเพราะว่ามันไปอ้างอิงกับ Clock โดยตรงเลย แต่ก็อย่าลืมว่ามันก็ไม่ได้ Perfect ไปซะทั้งหมด เพราะ Clock ที่ได้มันก็ Gen ออกมาจาก Crytal อีกที แล้ว Crytal ตอนที่ผลิดออกมาก็ใช่ว่าจะไม่มี % error แต่มันก็ไม่มีอะไรดีไปกว่า Timer Interrupt แล้วละ

ทีนี้เรามาพูดถึง Signal Input ที่จะป้อนให้กับ Motor บ้างดีกว่า Signal ที่เจ้าของบล็อกจะใช้ก็คือ Chirp sine ลักษณะของ Input ชนิดนี้ก็คือ sine wave ที่เพิ่มความถี่ขึ้นเรื่อย ๆ ตามเวลา เจ้าของบล็อกก็ดูสมการจาก เว็บนี้ แล้วก็มาปรับ ๆ จนเหลือสมการที่ใช้ตามด้านล่าง





ทุกอย่างจะเป็น Constant ยกเว้นแค่ t ที่ขึ้นอยู่กับเวลาของเราเอง แล้วสมการก้อนนี้ทั้งหมดก็เอาไปแปลงจากแรงดันไปเป็น PWM (Pulse with modulation) ได้เลย เพื่อเอาไปคุม motor ต่อ



เวลาจะเอาไปใช้งานก็จะประมาณนี้



ซึ่งตัวอย่างคร่าว ๆ ดูได้จาก ที่นี่ เป็น Code program ที่อยุ่ใน PIC เขียนด้วยภาษา c ในตัวอย่างนี้มีแค่ส่วนที่ใช้ timer interrupt การส่งข้อมูลทั้ง 3 ข้อมูล time , input , output เพื่อพอให้มองเห็น form ของ program แต่ถ้าอยากควบคุม motor ต้องลองประยุกต์ใช้จาก code นี้ได้เลย

การเก็บ log data ลง File มีหลายวิธี อย่างแรกคือเขียน Python แล้ว read Serial มาได้เลย แต่ใน code python ก็อย่าลืมให้ set rts กับ dtr เป็น False ด้วย สำหรับคนที่ใช้ board PIC ใน class เรียน

อย่างที่ 2 เราอาจจะเขียนทุกอย่างใน Platform ที่ง่ายอย่าง Arduino แล้ว print ข้อมูลออกมาผ่านทาง Serial monitor แล้วเราก็เอาค่าที่ได้ save เป็น file.csv

หรืออยากจะลองวิธีอื่นนอกจากนี้ก็ได้เช่นกัน เพราะมันก็ใช้ได้หลายวิธีเหลือเกิน


การทำ Parameter Estimate ใน matlab

(file matlab ตอนนี้ขอยังไม่เผยแพร่นะครับ)
สำหรับ นศ ไฟล์ Parameter Estimation จะอยู่ใน Lab0 ของรายวิชา basic control



ในส่วนนี้ก็คือ เราจะโหลด log file ที่เราได้จากก่อนหน้านี้ จะสังเกตุว่าใน matlab จะใช้ csvread นั่นหมายความว่า เราต้อง save file ให้อยู่ใน form ของ csv ด้วยนะ

ด้านล่างคือเราจะเอา State Space ที่เราได้ก่อนหน้านี้มาไว้ตรงนี้นี่แหละ



ในส่วนต่อมาก็ setup ค่าไว้แบบด้านล่าง





แล้วเราก็ลอง run เพื่อดูผลลัพธ์กัน



ฝั่งซ้ายบนคือ Signal Input ที่เราใส่เข้าไปให้กับ Motor แล้ว Graph ฝั่งซ้ายล่างคือสิ่งที่ Motor response กลับมา และฝั่งขวา ก็ส่วนที่มัน Estimate มาเพื่อให้ใกล้เคียงกับค่า Y ที่ได้จาก motor มากที่สุด จากการทดสอบ มีความใกล้เคียงถึง 86.07 % 

ในบทความนี้ก็จะประมาณนี้ หลังจากจบเทอมนี้เจ้าของบล็อกจะมา update บทความนี้ใหม่ เพื่อให้เป็น open source สำหรับใช้ศึกษาต่อไป

ชุดตัวอย่าง code matlab จากอาจารย์ Thanacha Choopojcharoen

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]