Сортировочная ячейка 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>
This commit is contained in:
dasha_f
2026-08-01 13:07:24 +00:00
parent 6ce460378a
commit 0d32f32db0
342 changed files with 18000 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
"""Find the real D-item collection bin/container geometry near the pusher branch."""
import omni.usd
from pxr import Usd, UsdGeom
stage = omni.usd.get_context().get_stage()
bbc = UsdGeom.BBoxCache(Usd.TimeCode.Default(), [UsdGeom.Tokens.default_, UsdGeom.Tokens.render])
print("=== config bin constants (old sorter.usd) ===")
import sys
sys.path.insert(0, "/home/dasha/robozon-sorter")
from robozon_sorter import config as C
print(f"BIN_X0={C.BIN_X0} BIN_X1={C.BIN_X1} BIN_Y0={C.BIN_Y0} BIN_Y1={C.BIN_Y1} BIN_LIP_Z={C.BIN_LIP_Z}")
print("\n=== SortingRig subtree (candidate bin location) ===")
p = stage.GetPrimAtPath("/World/SortingRig")
if p.IsValid():
for c in p.GetChildren():
r = bbc.ComputeWorldBound(c).ComputeAlignedRange()
if not r.IsEmpty():
mn, mx = r.GetMin(), r.GetMax()
print(f" {c.GetPath()} x[{mn[0]:+.2f}..{mx[0]:+.2f}] y[{mn[1]:+.2f}..{mx[1]:+.2f}] z[{mn[2]:+.2f}..{mx[2]:+.2f}]")
else:
print(" MISSING")
print("\n=== ConveyorTrack_03 subtree (pusher branch) ===")
p = stage.GetPrimAtPath("/World/ConveyorTrack_03")
for c in p.GetChildren():
r = bbc.ComputeWorldBound(c).ComputeAlignedRange()
if not r.IsEmpty():
mn, mx = r.GetMin(), r.GetMax()
print(f" {c.GetPath()} x[{mn[0]:+.2f}..{mx[0]:+.2f}] y[{mn[1]:+.2f}..{mx[1]:+.2f}] z[{mn[2]:+.2f}..{mx[2]:+.2f}]")
print("\n=== search whole stage for Bin-like names ===")
for pr in stage.Traverse():
nm = pr.GetName().lower()
if "bin" in nm:
r = bbc.ComputeWorldBound(pr).ComputeAlignedRange()
if not r.IsEmpty():
mn, mx = r.GetMin(), r.GetMax()
print(f" {pr.GetPath()} x[{mn[0]:+.2f}..{mx[0]:+.2f}] y[{mn[1]:+.2f}..{mx[1]:+.2f}] z[{mn[2]:+.2f}..{mx[2]:+.2f}]")