מדריך למפתחים של Cloud anchors ל-iOS

ARCore SDK לממשקי iOS עם ARKit. היכולות האלה מספקות יכולות של Cloud anchor, ומאפשרות לשתף עוגנים בין מכשירי iOS ו-Android באותה סביבה.

בקישורים הבאים מוסבר איך להשתמש ב-ARCore Cloud anchor API, או בשירות ARCore Cloud anchor, באפליקציות שלכם.

דרישות מוקדמות

  • Xcode מגרסה 13.0 ואילך
  • Cocoapods 1.4.0 ואילך אם משתמשים ב-Cocoapods
  • מכשיר Apple תואם ל-ARKit עם iOS מגרסה 12.0 ואילך (נדרש יעד פריסה של iOS 12.0 ואילך)

למשתמשים חדשים ב-Cloud anchors:

הפעלת Cloud anchors באפליקציה

כדי להשתמש ב-Cloud anchors API, צריך ליצור GARSessionConfiguration ולהגדיר לו את המאפיין cloudAnchorMode, כפי שמתואר במאמר הגדרת סשן של ARCore ב-iOS. משתמשים ב-setConfiguration:error: (GARSession) כדי לקבוע את ההגדרות.

עליכם גם להפעיל את ARCore API לאפליקציה שלכם.

אירוח וטיפול בעוגנים

אתם יכולים לארח ולפתור עוגנים בענן באמצעות ARCore Cloud anchor API. ה-API כולל שיטות של קריאה חוזרת לפעולות שהושלמו וגם אובייקטים עתידיים שאפשר לדגום.

אירוח עוגן

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

בקשה מהמארח שולחת נתונים חזותיים לשרת של Google, שממפה את המיקום של ARAnchor במערכת קואורדינטות שמייצגת את המרחב הפיזי הנוכחי. כשנשלחת ממארח בקשה מוצלחת מחזירה מזהה חדש של עוגן ב-Cloud, שאפשר לשתף אותו ולהשתמש בו כדי לתקן את העוגן מאוחר יותר.

- (void)addAnchorWithTransform:(matrix_float4x4)transform {
  self.arAnchor = [[ARAnchor alloc] initWithTransform:transform];
  [self.sceneView.session addAnchor:self.arAnchor];

  __weak ExampleViewController *weakSelf = self;
  self.hostFuture = [self.cloudAnchorManager
      hostCloudAnchor:self.arAnchor
           completion:^(NSString *anchorId, GARCloudAnchorState cloudState) {
             [weakSelf handleHostAnchor:anchorId cloudState:cloudState];
           }
                error:nil];
  [self enterState:HelloARStateHosting];
}

תיקון עוגן

פתרון בעיות ב-ARAnchor מאפשר למכשירי Android ו-iOS במרחב פיזי נתון להוסיף עוגנים שמתארחים בעבר לסצנות חדשות.

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

- (void)resolveAnchorWithIdentifier:(NSString *)identifier {
  GARResolveCloudAnchorFuture *garFuture =
      [self.gSession resolveCloudAnchorWithIdentifier:identifier
                                    completionHandler:completion
                                                error:&error];
}

// Pass the ARFRame to the ARCore session every time there is a frame update.
// This returns a GARFrame that contains a list of updated anchors. If your
// anchor's pose or tracking state changed, your anchor will be in the list.
- (void)cloudAnchorManager:(CloudAnchorManager *)manager didUpdateFrame:(GARFrame *)garFrame {
  for (GARAnchor *garAnchor in garFrame.updatedAnchors) {
    if ([garAnchor isEqual:self.garAnchor] && self.resolvedAnchorNode) {
      self.resolvedAnchorNode.simdTransform = garAnchor.transform;
      self.resolvedAnchorNode.hidden = !garAnchor.hasValidTransform;
    }
  }
}

דפוס סקרים אופציונלי של GARSession

אם אתם משתמשים ב-Meta או אם אתם צריכים אפשרות למילוי סקרים, וגם האפליקציה פועלת בקצב של 30fps לפחות, כדאי להשתמש בתבנית הבאה כדי להעביר את הערך ARFrame אל GARSession:

-(void)myOwnPersonalUpdateMethod {
  ARFrame *arFrame = arSession.currentFrame;
  NSError *error = nil;
  GARFrame *garFrame = [garSession update:arFrame error:&error];
  // your update code here
}

מכסות ל-API

ל-ARCore API יש את המכסות הבאות לרוחב הפס של בקשות:

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

בעיות מוכרות ופתרונות אפשריים

יש כמה בעיות ידועות בעבודה עם ARCore SDK ל-iOS.

הגדרות ברירת המחדל של סכמת ברירת המחדל מובילות לקריסת האפליקציה לסירוגין

ההגדרות של GPU Frame Capture ו- Metal API Authentication Scheme מופעלות כברירת מחדל, מה שעלול לגרום לפעמים לקריסת האפליקציה בתוך ה-SDK.

אבחון של קריסה של אפליקציה

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

פתרון עקיף

  1. למעבר אל Product > Scheme > Edit Scheme….

  2. פותחים את הכרטיסייה Run.

  3. לוחצים על הסמל Options כדי להציג את ההגדרות הקיימות.

  4. יש לוודא שהאפשרויות GPU Frame Capture וגם Metal API Validation מושבתות.

  5. פיתוח והרצה של האפליקציה.

בעיות מוכרות נוספות מופיעות בCHANGELOG של Cocoapods.

מגבלות

ARCore SDK ל-iOS לא תומך בקריאה ל-method של ARKit setWorldOrigin(relativeTransform:).

שיקולי ביצועים

השימוש בזיכרון גדל כשמפעילים את ARCore API. יש עלייה בשימוש בסוללה במכשיר, בגלל שימוש מוגבר ברשת וניצול המעבד (CPU).

השלבים הבאים