feat: support PLY meshes in vehicle registration

This commit is contained in:
2026-07-24 15:38:10 +08:00
parent 33c5fb9b9c
commit 9262390037
2 changed files with 29 additions and 2 deletions

View File

@@ -173,6 +173,33 @@ def step_to_open3d_mesh(step_path, mesh_deflection=0.1):
return mesh return mesh
def load_cad_mesh(cad_path, mesh_deflection=0.1):
"""根据后缀加载 CAD mesh:STEP 走 OCC 离散化,PLY 直接读取三角网格。"""
ext = os.path.splitext(cad_path)[1].lower()
if ext in (".step", ".stp"):
return step_to_open3d_mesh(cad_path, mesh_deflection=mesh_deflection)
if ext == ".ply":
print(f"[INFO] Loading CAD mesh from PLY: {cad_path}")
mesh = o3d.io.read_triangle_mesh(cad_path)
if len(mesh.vertices) == 0 or len(mesh.triangles) == 0:
raise RuntimeError(f"PLY CAD mesh 为空或读取失败: {cad_path}")
mesh.remove_duplicated_vertices()
mesh.remove_duplicated_triangles()
mesh.remove_degenerate_triangles()
mesh.compute_vertex_normals()
print(
f"[OK] PLY CAD mesh loaded: {len(mesh.vertices)} vertices, "
f"{len(mesh.triangles)} triangles"
)
return mesh
raise RuntimeError(f"不支持的 CAD 格式: {cad_path}(仅支持 .step/.stp/.ply)")
# ============================================================ # ============================================================
# 工具函数 # 工具函数
# ============================================================ # ============================================================
@@ -529,7 +556,7 @@ def translate_align_by_front_tail(
cad_pcd = None cad_pcd = None
if cad_pcd is None: if cad_pcd is None:
cad_mesh = step_to_open3d_mesh( cad_mesh = load_cad_mesh(
cad_path, cad_path,
mesh_deflection=mesh_deflection mesh_deflection=mesh_deflection
) )

View File

@@ -43,7 +43,7 @@ def main() -> int:
pc_path = first_pointcloud(payload) pc_path = first_pointcloud(payload)
cad_path = inputs.get("cadPath") cad_path = inputs.get("cadPath")
if not cad_path: if not cad_path:
raise RuntimeError("整车配准需要 STEP CAD 文件,请在任务下上传并选中 CAD。") raise RuntimeError("整车配准需要 CAD 文件(STEP 或 PLY mesh),请在任务下上传并选中 CAD。")
axis = str(config.get("axis") or "x") axis = str(config.get("axis") or "x")
crop_ratio = float(config.get("cropRatio") or 0.01) crop_ratio = float(config.get("cropRatio") or 0.01)