יום ראשון, 17 בפברואר 2013

עובדים מהר מדי בסביבת MATLAB? אתם עלולים לקבל דו"ח!

אני שמח לארח בבלוג פעם נוספת את רוני פאר, אשר כתב פוסטים רבים עד כה, האחרון שבהם - לפני שלושה חודשים. הפוסט של רוני יעסוק הפעם ביכולות הפקת הדו"חות מתוך סביבת MATLAB.


בעברי כסטודנט מצאתי את עצמי לא מעט פעמים מבצע פעולות העתק+הדבק על מנת לקחת גרפים שהופקו מ-MATLAB ולשתול אותם במסמך שאותו הייתי צריך להגיש. תמיד הנחתי שישנה דרך נוחה יותר לעשות זאת, ושגם בטח יש שיטה יעילה יותר מה-Equation Editor בשביל לשתול את כל הנוסחאות הרלוונטיות. אבל בשעה אחת בלילה, בזמן ששאר חבריי למעונות היו מבלים או ישנים, לא כל כך היה את מי לשאול...

לא הרבה יודעים את זה, אבל מתוך קבצי MATLAB, גרפים, דיאגרמות Simulink וטבלאות Stateflow ניתן להפיק בקלות מסמכי תיאור ודו"חות בפורמטים שונים, כמו:
RTF, XML, PDF, DOC ו-HTML. יכולות אלו עשויות לחסוך לכם לא מעט זמן, בין אם אתם סטודנטים ובין אם אתם חוקרים או מהנדסים בתעשיה.

אז, אם ברצוני לבצע את הפעולות הבאות:

• לייצר נוסחאות הכוללות פקודות LaTeX

• לפרמט את הטקסט והפונטים כך שיכללו הדגשות, קווים נטויים, לינקים וכו'

• להפיק רשימות ממוספרות או עם Bullets

• לתפוס גרפים שהוכנו בעזרת MATLAB ולשלב אותם במסמך חיצוני

יש כמה דרכים לעשות זאת !

הדרך הראשונה היא על ידי שימוש בפקודה "publish" המובנית ב-MATLAB, ורועי התייחס אליה כחלק מהפוסט שלו שנקרא "עולם הפרסום" שפורסם לפני כשלוש שנים. פקודה זו לוקחת קובץ MATLAB, ובהתאם למבנה שלו היא מפיקה ממנו מסמך הכולל קטעי קוד, הערות, גרפים ותמונות שמופקים כתוצאה מהרצת הקוד וכו'. בגרסת R2012b כל היכולות הרלוונטיות שולבו ב-TAB בעל השם PUBLISH, והוא יתגלה לכם כאשר תהיו במצב עריכה של קובץ m:

סרגל PUBLISH בגרסת R2012b

אופציה זו היא שימושית מאוד, בעיקר אם עובדים עם פונקציה או סקריפט בודד, ודוגמה לכך נמצאת בתיקיה מכווצת זו (פשוט בצעו publish לדוגמה מספר 1). באופן אישי, בסמינרים שאני מעביר כיום, אני נעזר בפונקציה הזו בכדי לסנכרן את כל ההדגמות שלי (אני משלב מקטעי תיאור של ההדגמה, מוסיף נוסחאות שמתארות התהליך, לינקים שמעבירים אותי בין קבצים ובין הרצות, וכמובן - כל המסמך הזה יכול להיפתח ב-browser של MATLAB או אחד חיצוני). אבל - השיטה הזו בעייתית כאשר רוצים לייצר מסמכים ממספר קבצים או כשרוצים לפרמט את התוצר הסופי בצורה מסויימת, למשל: אם רוצים לייצר מסמך Word שיהיה בעל עמודים ממוספרים, או אם מעוניינים בגרפים עם כותרות משתנות (כתוצאה מעשרות הרצות), או אם רוצים אפשרות לקבוע שלפעמים כן יופקו גרפים ולפעמים לא
(Conditional Reporting).

השיטה השניה מרחיבה את יכולות האפשרות הראשונה והיא בעלת גמישות גבוהה יותר (אבל - לא מגיעה כחלק מחבילת ה-MATLAB הבסיסית). היא נעזרת בפונקציות המובנות במוצר MATLAB Report Generator לצורך שליטה מירבית על פורמט הדו"ח המתקבל. אני מאד אוהב להשתמש בממשק המשתמש שמגיע יחד עם המוצר הזה, ונפתח על ידי הפעלת הפקודה "report". ממשק זה, כפי שניתן לראות למטה, מורכב מ-3 חלקים: בחלק השמאלי רואים את מבנה הדו"ח שהולך ונבנה, בפורמט היררכי של "עץ". בחלק האמצעי ניתן לראות רשימה של אובייקטים מוכנים, המחולקים לנושאים (אובייקט הוא בעצם פקודה שתשמש לפירמוט הדו"ח, ופקודה שכזו לדוגמא יכולה להיות "פרק חדש", "תת-פרק חדש", "טבלה", "figure" או "לולאת FOR"). בחלק הימני ניתן לראות את התכונות המשוייכות לאובייקט (למשל, עבור תמונה, ניתן לראות את הגודל שלה, האוריינטציה ועוד).

ממשק המשתמש בכלי  MATLAB Report Generator 

כלי זה מאפשר לבנות את ה"Template" לדו"ח שאותו רוצים להפיק, ואז לשתף אותו עם עוד אנשים. בכדי להקל על השימוש בכלי, מספר דוגמאות ודו"חות בסיסיים כבר משולבים כחלק ממנו. באופן אישי, הדרך שלי להפיק את המירב מהכלי הזה היא לרוב על ידי שימוש בו כחלק מסביבת ניסוי, כלומר לצורך ביצוע אנליזת "מונטה-קרלו".

הרעיון בשיטת "מונטה-קרלו" הוא ביצוע בדיקות רבות תוך כדי שינוי חלק מהפרמטרים של המערכת. למשל, אם מפתחים מסנן חדש בעולם עיבוד האותות, או אם רוצים לבדוק כיצד האלגוריתם שלנו מתמודד עם שינוי במסה או אינרציה של מערכת מכנית, מעוניינים לבצע סט של פעולות שלוקחות מספר רב של כניסות, מעבירות אותן דרך המערכת ובודקות מה התוצאה, ואת זה היינו רוצים לבצע עבור הערכים האפשריים השונים של הפרמטר. בתהליך שכזה היינו מעוניינים לבצע כמה פעולות:

• טעינת מידע מתוך קבצים (m, MAT) וביצוע פעולות מקדימות נוספות

• הגדרת פרמטרי הבעיה ומספר ההרצות (או התנאים) לכל פרמטר

• בדיקה בלולאות (לרוב לפחות 2 לולאות עבור לפחות 2 פרמטרים)

   o חישוב תוצאות נקודתיות
   o הצגת גרפים עבור כל מקרה ושמירה לצורך תיעוד

• ריכוז נתונים בטבלה או בגרף מסכם

• פעולות לאחר הריצה – שמירת תוצאות ל-MAT, מחיקת משתנים

את כל הפעולות הללו ניתן לבצע בעזרת פקודת report, ודוגמה לכך נמצאת בתיקיה מכווצת זו (בדוגמה מספר 2 יש קובץ לדוגמה וכן מסמך PDF שנוצר בעקבות הפעלתו).

ולפני סיום, כמה מילים על הפקת דו"חות מסביבת Simulink - אלה מכם שעובדים בסביבת Simulink ישמחו לדעת שה-Simulink Report Generator, שהוא מוצר נוסף, מוסיף לכל היכולות שהוזכרו לעיל אובייקטים מוכנים לבלוקים של Simulink ושל Stateflow, וגם הוא כולל בתוכו טמפלייטים מוכנים של דו"חות. ניתן להיעזר במוצר זה ישירות מתוך תפריט ה-File:

דו"חות אוטומטיים עבור Simulink

לדעתי - אחת מהתכונות הכי משמעותית של המוצר הזה עבור מודלי Simulink היא האפשרות לבצע בעזרתו השוואה בין 2 מודלים שונים. כאשר יש 2 גרסאות שונות של מודל מסויים, ניתן לבצע השוואה גרפית בין 2 המודלים, השוואה בין פרמטרים של בלוקים, השוואה בין ה-configuration parameters, ואפילו השוואה בין פונקציות האתחול. ואם אותר הבדל מסויים, אפשר לבחור האם למחוק אותו או למזג אותו בין המודלים בעזרת כלי גרפי מתאים. דוגמה לכך נמצאת בתיקיה מכווצת זו (בדוגמה מספר 3, הכוללת גם מסמך PDF שנוצר כתוצאה מהתהליך), וצילום מסך מופיע למטה: 
השוואה ומיזוג בין מודלי Simulink

אני בטוח שהמידע לעיל יחסוך לכם שעות של עבודה. השאלה שכמובן נשאלת היא האם הזמן שתחסכו ישמש לצורך בילוי והנאה או לצורך ביצוע בדיקות נוספות והתמקדות באלגוריתמים משופרים וטובים יותר...

האם אתם מפיקים דו"חות רבים במסגרת עבודתכם? האם אתם משתמשים באופציית ה-publish, באופציית ה-report או באף אחת מהן? האם אתם מבצעים סימולציות מונטה-קרלו?
 

יום שלישי, 5 בפברואר 2013

לא רק שואב אבק | דברים ש-MATLAB ו-Simulink יכולים לגרום לרובוט לעשות

כמו לפני שנתיים, גם בסוף החודש שעבר השתתפתי בכנס השנתי של חברת MathWorks לעובדי החברה ומפיצי הכלים שלה. גם השנה התקיימה תערוכה של אפליקציות שפיתחו המהנדסים השונים של החברה באמצעות MATLAB ו-Simulink, ואת תשומת ליבי משכה הדגמה מעניינת במיוחד, במסגרתה רובוט חיקה במהירות תנועות של אדם אשר צולם בעזרת מערכת חישת-התנועה Kinect (המבוססת על טכנולוגיה של חברת פריים-סנס הישראלית). הנה סרטון קצר:

video
ולמי שלא מצליח לראות את הסרטון, הנה רצף תמונות (ניתן ללחוץ כדי להגדיל):
הרובוט המופיע בסרטון ובתמונות הוא NAO, רובוט משוכלל הניתן לתכנות, פרי פיתוח של Aldebaran Robotics, אשר לדברי החברה נמצא בשימוש במאות אוניברסיטאות יוקרתיות ומעבדות מחקר ברחבי העולם. גובהו של הרובוט 57 ס"מ, והוא בעל 25 דרגות חופש, דבר המאפשר לו לבצע תנועות אנושיות. כאמור, בהדגמה שניתן לראות למעלה השתמשו ב-MATLAB ו-Simulink כדי להעביר את המידע שהתקבל ממערכת חישת-התנועה Kinect בתור הוראות לרובוט NAO, במטרה שיחקה במהירות את תנועות האדם אשר ניצב לידו. כיצד עשו זאת?
מודל ה-Simulink אשר שימש לכך מופיע למטה (חלק עליון), והוא עושה שימוש באתר שיתוף הקבצים של MathWorks, בו יש סט של בלוקי Simulink תחת השם Simulink Support for Kinect. אוסף בלוקים זה מאפשר לקחת בקלות את המידע מה- Kinect של מיקרוסופט (או ממערכת Xtion PRO של Asus), להכניסו לתוך Simulink (צד ימין למטה) ולייצר skeleton (צד שמאל למטה), וכל זה קורה בחצי השמאלי של המודל (כלומר בצד שמאל של החלק העליון).
Level-2 MATLAB S-Function (מסומן בחץ ירוק בחצי הימני של המודל) לוקח את ה-skeleton וממיר אותו לזוויות למפרקים הנשלחות כהוראות לרובוט בעזרת ה-API של Aldebaran Robotics.
קשה היה להישאר אדיש מול ההדגמה הזו, ואפילו קליב מולר, ממציא ה-MATLAB, ניסה ללמד את הרובוט מספר תנועות:

מה דעתכם על ההדגמה הזו? האם אי פעם השתמשתם בכלי MathWorks כדי לשלוט על חומרה? ומתי לאחרונה כתבתם S-Function בעצמכם?