地上 LiDAR のパイプライン
据置型や手持ちの LiDAR スキャナー(Leica、FARO、Trimble、BLK2GO など)を使い、点群を AR Clip VPS のマップに変える必要があるときは、このパイプラインを使ってください。
前処理
- 生スキャンをきれいにする — Cyclone、ReCap、CloudCompare などで、三脚のアーティファクト、 多重反射、動く物体を取り除きます。
- ステーションを位置合わせする — ターゲットまたは cloud-to-cloud の手法で、個別のスキャンを そろえます。
- 色を付ける — 写真テクスチャがあれば適用します。なければ LiDAR の反射強度をグレースケールに 割り当てます。
書き出し
- 見た目の確認用に、簡略化したメッシュ(500 万三角形以下)を作ります。
- 点群は E57/LAZ/PLY で書き出します。
- 座標系は一貫させてください。屋内ならローカルな接平面、屋外なら地理参照された CRS を使います。
Python の REST API でアップロードする
# 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は、アップロードに点群と(E57/LAZ に含まれていれば)任意のメッシュの両方が含まれる ことを示します。- 屋内だけのデータセットでは、座標のブロックを省いてください。
後処理とアンカー
マップが READY になったら、次を行います。
- 機械・入口・出口にアンカーポイントを定義します。
- 小さな JSON ファイルでアップロードします。
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()
- 確認が済んだら、Console からマップを公開するか、
POST /maps/{id}/publishを呼びます。