Skip to main content

LiDAR scans

Turn point clouds from static or handheld LiDAR scanners into an AR Clip VPS map. This works with scanners such as Leica, FARO, Trimble and BLK2GO.

Prepare the scans​

  1. Clean the raw scans. Remove tripod artefacts, multiple returns and moving objects in Cyclone, ReCap, CloudCompare or a similar tool.
  2. Register the stations. Align the separate scans using targets or cloud-to-cloud matching.
  3. Add colour. Apply photo textures if you have them. If not, map LiDAR intensity to greyscale.

Export​

  • Make a simplified mesh of up to 5 million triangles for the visual preview.
  • Export the point cloud as E57, LAZ or PLY.
  • Use one coordinate system throughout: a local tangent plane indoors, or a georeferenced CRS outdoors.

Upload with Python​

# upload_lidar.py
from pathlib import Path
import os
import requests

API_BASE = "https://api.arclip.app/vps/api/v3"
TOKEN = os.environ["ARCLIP_TOKEN"]
DATA_PATH = Path("outputs/plant.e57")

headers = {"Authorization": f"Bearer {TOKEN}"}

payload = {
"name": "Factory Floor",
"dataType": "point_cloud",
"sourceFormat": "e57",
"hybrid": True,
"coordinate": {"lat": 35.68124, "lon": 139.76712}
}

init = requests.post(f"{API_BASE}/maps/import", json=payload, headers=headers)
init.raise_for_status()
info = init.json()
upload_url, map_id = info["uploadUrl"], info["mapId"]

with DATA_PATH.open("rb") as src:
put = requests.put(upload_url, data=src, headers={"Content-Type": "application/octet-stream"})
put.raise_for_status()

finalize = requests.post(f"{API_BASE}/maps/{map_id}/finalize", json={"publish": False}, headers=headers)
finalize.raise_for_status()
print(f"LiDAR map {map_id} queued → {finalize.json()['status']}")
  • hybrid=True tells the server that the upload holds a point cloud and, if the E57 or LAZ bundle includes one, a mesh.
  • For indoor-only data, leave out the coordinate block.

Add anchors and publish​

When the map reaches READY:

  1. Choose anchor points for machines, entrances and exits.
  2. Upload them as a small JSON list:
import json

anchors = [
{"name": "CNC-01", "position": [2.4, 0.0, 8.7]},
{"name": "safety_exit", "position": [-11.2, 0.0, 3.1]}
]
resp = requests.post(
f"{API_BASE}/maps/{map_id}/anchors",
headers=headers,
json={"items": anchors}
)
resp.raise_for_status()
  1. When you have checked the map, publish it from the console or call POST /maps/{id}/publish.

Next: Multi-session maps — merge several scans into one map.