メインコンテンツまでスキップ

LiDAR スキャン

据え置き型やハンドヘルド型の LiDAR スキャナーで取った点群を、AR Clip VPS のマップにします。Leica、FARO、Trimble、BLK2GO などのスキャナーで使えます。

スキャンを準備する​

  1. 元のスキャンをクリーンアップします。 Cyclone、ReCap、CloudCompare などのツールで、三脚の写り込み、多重反射、動いている物体を取り除きます。
  2. ステーションを位置合わせします。 ターゲットか、点群どうしのマッチングを使って、個々のスキャンの位置を合わせます。
  3. 色を付けます。 写真のテクスチャーがあれば適用します。なければ、LiDAR の反射強度をグレースケールに割り当てます。

書き出す​

  • 見た目のプレビュー用に、最大 500 万トライアングルの簡略化したメッシュを作ります。
  • 点群を E57、LAZ、PLY のいずれかの形式で書き出します。
  • 座標系は全体で 1 つにそろえます。屋内なら局所接平面、屋外なら地理座標付きの CRS を使います。

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 は、アップロードに点群が含まれていること、そして E57 や LAZ のバンドルにメッシュがあればメッシュも含まれていることをサーバーに伝えます。
  • 屋内だけのデータなら、coordinate ブロックは省きます。

アンカーを追加して公開する​

マップが READY になったら、次の手順を進めます。

  1. 機械、入口、出口などにアンカーの位置を決めます。
  2. アンカーを小さな 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()
  1. マップを確認したら、コンソールから公開するか、POST /maps/{id}/publish を呼び出します。

次へ: 複数セッションのマップ — 複数のスキャンを 1 つのマップにまとめます。