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
- Clean the raw scans. Remove tripod artefacts, multiple returns and moving objects in Cyclone, ReCap, CloudCompare or a similar tool.
- Register the stations. Align the separate scans using targets or cloud-to-cloud matching.
- 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=Truetells 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
coordinateblock.
Add anchors and publish
When the map reaches READY:
- Choose anchor points for machines, entrances and exits.
- 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()
- 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.