0d32f32db0
Замкнутый контур "поток -> 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>
41 lines
1.7 KiB
Python
41 lines
1.7 KiB
Python
"""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}]")
|