For the complete documentation index, see llms.txt. This page is also available as Markdown.

Mobile Map Upload

Upload a mobile capture from a LiDAR or non-LiDAR phone or tablet (RGB frames and poses, plus depth images and a mesh when LiDAR is available) as a MultiSet VPS map via the REST API.

A mobile map is a capture recorded on a phone or tablet with your own AR app. Package the capture as a single .zip in the format below, then upload it in three calls: create the map, upload the zip, and complete the upload.

Any ARKit iPhone or iPad and any ARCore Android device can capture a map. What goes in the .zip depends on whether the device has a LiDAR sensor:

Capture type

Devices

Contents

fileType

LiDAR

iPhone Pro and iPad Pro with LiDAR

RGB frames, poses, depth images and a mesh

zip

Non-LiDAR (Posed RGB)

Every other ARKit or ARCore device

RGB frames and poses only

PosedRGB

If the device has LiDAR, upload a LiDAR capture: the depth images and mesh make the map more accurate.

What to upload

LiDAR capture

A single .zip with this layout:

MappingData.zip
├── CameraIntrinsics.json
├── RGB/
│   ├── Rgb_20260929101512034.jpg
│   └── …
├── Pose/
│   ├── CameraPose_20260929101512034.json
│   └── …
├── Depth/
│   ├── Depth_20260929101512034.exr
│   └── …
└── Mesh/
    └── Mesh.glb
Item
Required
Format

RGB/

Yes

Camera frames as .jpg.

Pose/

Yes

One .json per RGB frame, in Unity left-handed (LHS) coordinates.

Mesh/Mesh.glb

Yes

Mesh of the captured space as a binary glTF, in the same coordinate frame as the poses.

CameraIntrinsics.json

Yes

Camera intrinsics of the RGB frames.

Depth/

Yes

One depth image per RGB frame as a 16-bit or 32-bit float .exr.

Keep the folders and CameraIntrinsics.json at the root of the archive.

Non-LiDAR capture (Posed RGB)

On a device without LiDAR, upload the RGB frames, their poses and the camera intrinsics only, with this layout:

Item
Required
Format

RGB/

Yes

Camera frames as .jpg.

Pose/

Yes

One .json per RGB frame, in Unity left-handed (LHS) coordinates.

CameraIntrinsics.json

Yes

Camera intrinsics of the RGB frames.

Leave out Depth/ and Mesh/, and set fileType to PosedRGB when you create the map (see source object). The RGB frames, poses and intrinsics use the same formats as a LiDAR capture.

File naming

Each RGB frame, its pose and (on a LiDAR capture) its depth image share the same ID:

  • RGB/Rgb_<id>.jpg

  • Pose/CameraPose_<id>.json

  • Depth/Depth_<id>.exr

The <id> must not contain an underscore. A UTC timestamp such as 20260929101512034 (yyyyMMddHHmmssfff) works well. Every RGB frame needs a pose file, and on a LiDAR capture a depth image too.

Capture guidelines

  • Capture rate: save frames at around 5 FPS (one RGB frame, pose and, on LiDAR, depth image every 0.2 seconds) while the user is mapping.

  • Overlap: each RGB frame should overlap with 2 to 3 neighbouring frames, so every part of the space is seen in several images.

Pose

Field
Format

Position

Camera position in world space, in metres.

Rotation

Camera rotation in world space as a unit quaternion {x, y, z, w}.

cameraParams

Focal length (fx, fy) and principal point (px, py) of this frame, in pixels.

All poses, and the mesh on a LiDAR capture, must share the same world origin.

Camera intrinsics

The intrinsics and resolution must match the RGB images as saved. If you resize the images, scale fx, fy, px and py by the same factor.

Depth

LiDAR captures only.

  • Single-channel OpenEXR (.exr), 16-bit (half) or 32-bit float, depth in metres.

  • Same timestamp and orientation as its RGB frame (see File naming).

  • It can be lower resolution than the RGB frame, with the same aspect ratio.

source object

LiDAR capture:

Non-LiDAR capture:

Field
Value

provider

"mobile"

fileType

"zip" for a LiDAR capture, "PosedRGB" for a non-LiDAR capture. The value is case-sensitive.

coordinateSystem

"LHS"

Step 1: create the map

This example is a LiDAR capture. For a non-LiDAR capture, set "fileType": "PosedRGB". fileSize is the size of the .zip in bytes. The response contains the mapCode and an upload URL:

Step 2: upload the zip

PUT the whole .zip to the signedUrl. The URL is valid for 1 hour.

Step 3: complete the upload

Use the mapCode from Step 1.

The map then starts processing, and becomes available for VPS queries once its status is active. See the Map Upload overview for the full OpenAPI specs.

Last updated

Was this helpful?