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.glbRGB/
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:
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>.jpgPose/CameraPose_<id>.jsonDepth/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
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:
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?

