רובוטראפיק/ניתוח מערכות הבקרה

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

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

תת מערכות בקרה[עריכה]

בשלב ראשון יש להבין איזה תת-מערכות בקרה יש לתכנן על מנת לבקר את המכונית שתתמודד עם כל הדרישות בתחרות.

  • יכולת בלימה על קו עצירה (תמרור עצור)
  • התיחסות לתמרור מעבר חציה
  • התיחסת למצבי הרמזור
  • המנעות מהתנגשות בעצמים בדרך
  • לנוע לאורך המסלול ללא עזיבתו
  • לנוע במהירות מרבית תוך כדי עמידה בכל הכללים שהוגדרו

בקרה שתפקידה לדאוג לנוע לאורך המסלול ללא עזיבתו[עריכה]

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

  • התהליך: הסעת המכונית על הנתיב.
  • המשתנה המבוקר: מיקום מרכז המכונית ביחס לפס השחור שמייצג את הנתיב.
  • ערך מצוי: ההפרש בין סכום שלושת חיישני ההיגוי השמאליים פחות לסכום שלושת חיישני ההיגוי הימניים והתייחסות למצב החיישן המרכזי.
  • ערך רצוי: הערך הרצוי של ההפרש יהיה 0 , כלומר המכונית בדיוק במרכז הנתיב.
  • המשתנה המבקר: מנוע Servo משפיע על כיוון ההגה (מעלות °) והמנוע הראשי ישפיע על מהירות המכונית V ויגרום למכונית לשנות את מיקומה על הנתיב.

ננתח את פונקציית המשוב של המערכת בגיליון הזה:רובוטרפיק פונקצית משוב

הפונקציה שתטפל בהיגוי תקרה ControlSteeringWheel[עריכה]

על מנת להבין כיצד הפונקציה הגיעה למצבה הסופי נראה את כל השלבים. נניח, למען הפשטות, כי המכונית נוסעת במהירת נמוכה. בסוף הפונקציה הערך של המשתנה uiServo אשר משפיעה על ההיגוי צריך להיות בטווח הערכים [1854,3708] כאשר 2781 אומר כי ההיגוי ישר.


שלב 1[עריכה]

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

void ControlSteeringWheel()
{
  double dSetpoint = 0; // Wished Value
  double dCurentPsition = sl3 + sl2 + sl1 - (sr1 + sr2 + sr3) ;
  double dErorre = dSetpoint - dCurentPsition; // measured Erorre
  
  // controller
  double dProportional = -100;
  double dServoSenter = 2781; // put the Steering Wheel Center 
  uiServo = dServoSenter + (dErorre * dProportional); 

  // Checking it in Test permitted range values
  if( uiServo < 1854)
    uiServo = 1854; // Max Left
  else if( 3708 < uiServo )	
    uiServo = 3708; //  Max Right
}

הבעיות של הפונקציה:

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

שלב 2[עריכה]

על מנת לשפר את פונקצית הבקרה/לתקן את הבעיות שנוצרו אנחנו נבדוק היכן נמצא החיישן המרכזי.
במידה והחיישן מעל המסלול (מעל הפס השחור), נשמור לתוך המשתנה bLastDirectionL_R את מצב ההיגוי הנוכחי (ימין או שמאל).
במידה והחיישן מחוץ למסלול, כלומר המכונית התרחקה מהמסלול, נדאג לכך שההיגוי יהיה בזוית הגדולה ביותר לטובת החזרת הרכב למסלול.

  double dCurentPsition = sl3 + sl2 + sl1 - (sr1 + sr2 + sr3) ;
  ...
  // keep last Steering Wheel diraction
  if( TRUE == IsOnBlack(sc)) // center on track, 
  {
     bLastDirectionL_R = (dCurentPsition > 0 ) ? 1  : 0 ;  
  }
  else // center not on track 
  {
    if( 0 == bLastDirectionL_R  )
      dCurentPsition = 0 - 15;
    else
      dCurentPsition = 15;
  }	
  double dErorre = dSetpoint - dCurentPsition; // measured Erorre
  ...