דלג לתוכן הראשי

לוקליזציית רובוט עם MegaTag2

הוצג ב-2024, Megatag2 הוא מאתר מדויק וחד-משמעי מבוסס AprilTag לרובוטים ניידים. הוא נבנה עם המטרות הבאות:

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

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

int[] validIDs = {3,4};
LimelightHelpers.SetFiducialIDFiltersOverride("limelight", validIDs);

בניגוד ל-MT1, MT2 מניח שאתה יודע את כיוון הרובוט שלך (yaw). באופן אופציונלי, Megatag2 מקבל אוריינטציית רובוט מלאה ומהירויות זוויתיות.

דרישות:

  • תנוחת מרחב-הרובוט של ה-Limelight שלך הוגדרה ב-webUI או דרך ה-API
  • מפת שדה (.fmap) הועלתה
  • LimelightHelpers.SetRobotOrientation(robotYawInDegrees,0,0,0,0,0) נקרא בכל פריים בקוד צד-הרובוט
  • SetRobotOrientation מניח מקור ממורכז (ראה את מחולל המפות) או מקור בפינה הכחולה. חיובי נגד כיוון השעון, 0 מעלות -> פונה לקיר הברית האדומה ב-FRC.

מפתחות NetworkTables:

  • botpose_orb_wpiblue
  • botpose_orb_wpired
  • botpose_orb

מפתחות JSON:

  • botpose_orb_wpiblue
  • botpose_orb_wpired
  • botpose_orb
  • (לכל מטרת fiducial) t6r_fs_orb - תנוחת רובוט במרחב השדה באמצעות megatag2 מבוסס על תג זה בלבד (ללא multitag)

שימו לב להבדל בין MegaTag2 (רובוט אדום) ל-Megatag (רובוט כחול) במקרה תג-בודד מאוד דו-משמעי זה


  • גליל זהב / רובוט אדום: botpose של Megatag2 לא מסונן
  • גלילים צהובים: botposes של Megatag2 תג-בודד לא מסוננים

  • גליל לבן/רובוט כחול: Botpose של MegaTag1
  • גליל ירוק: תנוחת בוט לכל-תג בנפרד (MT1)
  • גליל כחול: ממוצע של תנוחות בוט לכל-תג בנפרד (MT1)

info

ב-2024, רוב האקוסיסטם של WPILib עבר למערכת קואורדינטות עם מקור יחיד. ב-2023, מקור מערכת הקואורדינטות שלך השתנה בהתאם לצבע הברית שלך.

ל-2024 והלאה, מקור מערכת הקואורדינטות שלך צריך תמיד להיות המקור "הכחול". קבוצות FRC צריכות תמיד להשתמש ב-botpose_orb_wpiblue לפונקציונליות הקשורה לתנוחה

שימוש ב-Pose Estimator של WPILib

  LimelightHelpers.SetRobotOrientation("limelight", m_poseEstimator.getEstimatedPosition().getRotation().getDegrees(), 0, 0, 0, 0, 0);
LimelightHelpers.PoseEstimate mt2 = LimelightHelpers.getBotPoseEstimate_wpiBlue_MegaTag2("limelight");

// אם המהירות הזוויתית שלנו גדולה מ-360 מעלות לשנייה, התעלם מעדכוני ראייה
if(Math.abs(m_gyro.getRate()) > 360)
{
doRejectUpdate = true;
}
if(mt2.tagCount == 0)
{
doRejectUpdate = true;
}
if(!doRejectUpdate)
{
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(.7,.7,9999999));
m_poseEstimator.addVisionMeasurement(
mt2.pose,
mt2.timestampSeconds);
}

הגדרת תנוחת מרחב-הרובוט של ה-Limelight שלך

LL Forward, LL Right, ו-LL Up מייצגים מרחקים לאורך וקטורי הקדימה, ימין ומעלה של הרובוט כאילו אתה מגלם את הרובוט. (במטרים). LL Roll, Pitch, ו-Yaw מייצגים את הסיבוב של ה-Limelight שלך במעלות. אתה יכול לשנות ערכים אלה ולצפות במודל התלת-ממדי של ה-Limelight משתנה בצופה התלת-ממדי. Limelight משתמש בהגדרה זו באופן פנימי כדי לעבור מתנוחת המטרה במרחב המצלמה -> תנוחת רובוט במרחב השדה.

שימוש ב-IMU המובנה של Limelight 4 עם "imumode_set" / SetIMUMode()

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

כדי להשתמש ב-IMU של LL4, כרגע ה-LL שלך חייב להיות מותקן במצב "לרוחב".

הזרימה נראית כך:

  1. קרא ל-SetRobotOrientation() עם ה-IMU ה"חיצוני" שלך כמו Pigeon או NavX. אתה יכול להמשיך לקרוא לשיטה זו כמה שתרצה.
  2. קרא ל-SetIMUMode() כדי להגדיר כיצד ה-Limelight שלך מנצל נתוני IMU מ-IMUs פנימיים וחיצוניים.
  3. באופן כללי, השתמש במצב 1 בזמן שהרובוט שלך ממתין לתחילת תקופת האוטונומי. עבור למצב 2 בזמן שמופעל או בזמן שמופעל ומסתובב.

איפוס / זריעה

  • כדי לאפס את yaw הרובוט הממוזג של ה-IMU הפנימי ל-yaw שהוגש דרך SetRobotOrientation(), הגדר את מצב ה-IMU של ה-Limelight שלך ל-1 עם LimelightHelpers.SetIMUMode().
  • בזמן זריעה, MegaTag2 ימשיך להשתמש בערך ה-yaw שהוגש דרך SetRobotOrientation().

שימוש ב-IMU הפנימי עם MegaTag2

כדי לאפשר ל-LL4 להשתמש ב-IMU הפנימי שלו ללוקליזציית MT2, הגדר את מצב ה-IMU של ה-Limelight שלך ל-2 עם LimelightHelpers.SetIMUMode().

מצבי IMU:

  • 0 - השתמש ב-yaw של IMU חיצוני שהוגש דרך SetRobotOrientation() ללוקליזציית MT2. ה-IMU הפנימי מתעלם לחלוטין.
  • 1 - השתמש ב-yaw של IMU חיצוני שהוגש דרך SetRobotOrientation(), והגדר את ה-yaw הממוזג של ה-IMU הפנימי של LL4 להתאים לערך ה-yaw שהוגש.
  • 2 - השתמש ב-IMU פנימי ללוקליזציית MT2.
  • 3 -