Files
isaac/scripts/env_scan.py
T
dasha_f 0d32f32db0 Сортировочная ячейка Isaac Sim: CV-пайплайн и меши товаров
Замкнутый контур "поток -> CV -> механика": товары идут по конвейеру с шагом 700 мм,
класс определяется стереопайплайном во время движения, пушер и плуг реагируют физически.

Состав:
* control_test/ - ячейка и CV. run_sorting_cv.py + cv_worker.py (два процесса, потому что
  torch внутри Isaac роняет сцену), cell.py (физика лент, плуга, пушера), measure_plane.py
  (замер габаритов), README.md и .memory.md с замерами, проблемами и ловушками
* robozon_sorter/ - модули симуляции, scripts/ - утилиты, scene/ - сцены
* assets/ - меши товаров, плуг, объекты Objaverse

Бейзлайн CV: DEFOM-Stereo vitl, вход 480, iters 24, кроп зоны осмотра, без сегментации.
На потоке 700 мм - классы 8/9, габариты MAE 32.8 мм, 469 мс на товар при такте 700 мс.

Веса моделей (4.5 ГБ) и пропсы конвейера NVIDIA (274 МБ) не включены - источники и
команды скачивания в MODELS.md. Выход прогонов (captures/, runtime/) не включён:
воспроизводится.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 13:07:24 +00:00

44 lines
1.8 KiB
Python

"""Check ConveyorTrack_05 geometry, existing floor/ground, and lighting in the fresh stage."""
import omni.usd
from pxr import Usd, UsdGeom, UsdLux
stage = omni.usd.get_context().get_stage()
bbc = UsdGeom.BBoxCache(Usd.TimeCode.Default(), [UsdGeom.Tokens.default_, UsdGeom.Tokens.render])
xc = UsdGeom.XformCache()
def report(path):
prim = stage.GetPrimAtPath(path)
if not prim.IsValid():
print(f"{path} MISSING"); return
r = bbc.ComputeWorldBound(prim).ComputeAlignedRange()
mn, mx = r.GetMin(), r.GetMax()
M = xc.GetLocalToWorldTransform(prim)
lx = M.TransformDir((1,0,0)); lx = lx/(lx.GetLength() or 1)
print(f"{path}")
print(f" bbox x[{mn[0]:+.3f}..{mx[0]:+.3f}] y[{mn[1]:+.3f}..{mx[1]:+.3f}] z[{mn[2]:+.3f}..{mx[2]:+.3f}]")
print(f" local+X in world = ({lx[0]:+.3f},{lx[1]:+.3f},{lx[2]:+.3f})")
for p in ["/World/ConveyorTrack_05", "/World/ConveyorTrack_05/Belt"]:
report(p)
print("\n=== whole /World bbox ===")
w = stage.GetPrimAtPath("/World")
r = bbc.ComputeWorldBound(w).ComputeAlignedRange()
print(f" x[{r.GetMin()[0]:+.2f}..{r.GetMax()[0]:+.2f}] y[{r.GetMin()[1]:+.2f}..{r.GetMax()[1]:+.2f}] z[{r.GetMin()[2]:+.2f}..{r.GetMax()[2]:+.2f}]")
print("\n=== lights ===")
n = 0
for p in stage.Traverse():
if p.IsA(UsdLux.BoundableLightBase) or p.IsA(UsdLux.NonboundableLightBase):
n += 1
inten = p.GetAttribute("inputs:intensity")
vis = UsdGeom.Imageable(p).ComputeVisibility()
print(f" {p.GetPath()} type={p.GetTypeName()} intensity={inten.Get() if inten else '?'} vis={vis}")
print(f" total lights: {n}")
print("\n=== any ground/floor plane already present? ===")
for p in stage.Traverse():
name = p.GetName().lower()
if "floor" in name or "ground" in name or "plane" in name:
print(" candidate:", p.GetPath(), p.GetTypeName())