
מהנדסת בנתה אוקטוקופטר מאפס ולימדה אותו לעוף עם RL
קרולינה דובייל בנתה אוקטוקופטר מאפס בלי ניסיון בחומרה: מהרעיון ועד טיסה ראשונה בשבועיים וחצי, וטיסה בשליטת RL בפחות משמונה. המדיניות שרדה גם שלושה וארבעה מנועים מתים.
מהנדסת התוכנה קרולינה דובייל, שמעולם לא עבדה על פרויקט חומרה של ממש, תכננה, עיבדה במכונה, הלחימה והטיסה אוקטוקופטר משלה — ואז אימנה מדיניות למידת חיזוק ששומרת עליו באוויר אחרי כשל מנועים. לדבריה, מהרעיון ועד טיסה ללא RL עברו שבועיים וחצי, ועד טיסה בשליטת RL — פחות משמונה שבועות; הפרויקט הושלם.
מ-Fusion 360 לשלד שנבנה ביד
השלד תוכנן ב-Fusion 360 ונחתך ב-CNC: זרועות מפיברגלס G10 ולוחות גוף מסיבי פחמן בעובי 5 מ״מ, כשהזרועות משתלבות במרכז לחיזוק. זו הייתה הפעם הראשונה שלה בבית מלאכה, והיא נאלצה לחתוך את הזרועות מחדש לאחר שהזינה את המכונה מהר מדי. אחר כך באו ארבעה שלבים: הרכבה, חיבור האלקטרוניקה וטיסה כאוקטוקופטר רגיל, אימון מדיניות לטיסה רגילה ולכשל של שני מנועים, ולבסוף המעבר מסימולציה למציאות.
רשת בת 43,000 פרמטרים ב-50 הרץ
הבקר הסופי קטן: רשת MLP עם שתי שכבות נסתרות של 128 יחידות — כ-43,000 פרמטרים — שרצה ב-50 הרץ על בקר הטיסה של הרחפן עצמו, מהודרת ל-C++ של ArduPilot ברמת ערבוב המנועים, בלי מחשב נלווה ובלי כיוונון עדין אחרי הסימולציה. היא קוראת עשרה פריימים אחרונים של מצב, כ-0.2 שניות היסטוריה: כיוון, מהירויות זוויתיות, מיקום, מהירות וערוץ בעל שמונה ערכים שנותן את רמת הדחף של כל מנוע, כשמנועים כשלים מאופסים בכוח. ביציאה מתקבלות שמונה פקודות — התאמות קטנות סביב ריחוף.
האימון נערך כולו בסימולציה — MuJoCo עם PPO דרך PufferLib — על תערובת קבועה של פרקים עם אפס, מנוע אחד או שניים מתים (משקלים 0.1, 0.2 ו-0.7), בקוריקולום שמגביר אקראיות תחום מהנומינלי למלא: מסה, אינרציה, דחף, קבוע הזמן של המנוע, השהיית הלולאה וצלילת סוללה. תחבולה ארכיטקטונית אחת היא ראש ממוצע-סימטריה: הרשת מריצה את משקולותיה פעמיים — על המצב האמיתי ועל אותו מצב המתויג מחדש בסיבוב של 180° של השלד — וממצעת ביניהם, כך שהמדיניות שוות-סימטריה בדיוק לסיבוב הזה בלי פרמטרים נוספים.
מה זה שרד — ולקח על שיחוד תגמולים
למרות שאומנה רק על אפס, אחד או שניים מנועים מתים, המדיניות שמרה על עמידה בכלי האמיתי גם בכשל משולש ואף מרובע. הכותבת מודה בגלוי שהגרסה הקודמת הייתה דוגמה קלאסית לשיחוד תגמולים: כשהתגמול תלוי בתנוחה בלבד, ריחוף על ארבעה מנועים קיבל אותו ניקוד כמו על שמונה, ולכן הסוכן כיבה מנועים בריאים וטס כקוודקופטר. הוספת תגמול על שימוש בכל מנוע זמין הניבה אימון מחדש שהחזיק את כל שמונת המנועים ב-20 מתוך 20 פרקים, בדיוק ריחוף נמוך ב-3.6%, ושרידות טובה בהרבה בכשלים מחוץ לתחום האימון: 99% לעומת 90% בשלושה מנועים מתים ו-85% לעומת 64% בארבעה.
באגים ששווה לקרוא עליהם
יומן הבנייה מתעד גם שלושה באגים בזיהוי המערכת שהפכו את כל נתוני העמידות בכשלים לקוים: אורך הזרוע ממרכז המסה למנוע היה מקודד כ-35.20 מ״מ במקום 181.938 מ״מ האמיתיים; בנוסחת האינרציה הופיע 8π² במקום 4π²; ופריסת המנועים הודלתה כמבנה „+“ בעוד השלד האמיתי הוא „X“, בסטייה של 22.5° מצירי הגוף. יחד הם הותירו לרחפן המדומה כ-2.6 פחות סמכות שליטה מזו של האמיתי. אחרי התיקונים עלתה שרידות בכשל כפול תחת אקראיות תחום מלאה מ-71.7% ל-95.8%, ובזוגות הקשים של סבסוב בלתי מפוצה מ-41.2% ל-94.6%.
האוקטוקופטר נבחר בכוונה: קוודקופטר שמאבד מנוע חייב לוותר לחלוטין על סמכות הסבסוב כדי להישאר באוויר, בעוד עודף של שמונה מנועים מכסה את רוב הכשלים הכפולים — למעט שני מנועים המרוחקים 90° ומסתובבים באותו כיוון. פרמטר אחד כמעט חיסל את הדגמת הכשלים: MOT_SPIN_MIN נשאר בערך ברירת המחדל 0.15, כך שמנוע „מושבת“ רק האט בכ-130 מיקרו-שניות PWM במקום לעצור.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.