Сортировочная ячейка 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:
@@ -0,0 +1,47 @@
|
||||
"""Scan the new 90/45 scene: exact belt geometry, plow decks, and containers."""
|
||||
import omni.usd
|
||||
from pxr import Usd, UsdGeom, UsdPhysics
|
||||
|
||||
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)
|
||||
localx = M.TransformDir((1,0,0))
|
||||
localx = localx / (localx.GetLength() or 1)
|
||||
active = prim.IsActive()
|
||||
print(f"{path} active={active}")
|
||||
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 = ({localx[0]:+.3f},{localx[1]:+.3f},{localx[2]:+.3f})")
|
||||
kids = [c.GetName() for c in prim.GetChildren()]
|
||||
print(f" children: {kids}")
|
||||
|
||||
print("=== root-level /ConveyorTrack_01 duplicate check ===")
|
||||
p = stage.GetPrimAtPath("/ConveyorTrack_01")
|
||||
print("exists:", p.IsValid())
|
||||
|
||||
for path in ["/World/ConveyorTrack_04", "/World/ConveyorTrack_04/Belt",
|
||||
"/World/ConveyorTrack_06", "/World/ConveyorTrack_06/Belt",
|
||||
"/World/ConveyorTrack_01", "/World/ConveyorTrack_01/Belt",
|
||||
"/World/PlowCornerDeck_B", "/World/PlowCornerDeck_C",
|
||||
"/World/PlowTransition_B", "/World/PlowTransition_C",
|
||||
"/World/PlowContainers", "/World/Diverters/DiverterEnd"]:
|
||||
report(path)
|
||||
print()
|
||||
|
||||
print("=== PlowContainers full subtree ===")
|
||||
pc = stage.GetPrimAtPath("/World/PlowContainers")
|
||||
if pc.IsValid():
|
||||
for c in Usd.PrimRange(pc):
|
||||
r = bbc.ComputeWorldBound(c).ComputeAlignedRange()
|
||||
if not r.IsEmpty():
|
||||
mn, mx = r.GetMin(), r.GetMax()
|
||||
print(f" {c.GetPath()} type={c.GetTypeName()} "
|
||||
f"x[{mn[0]:+.2f}..{mx[0]:+.2f}] y[{mn[1]:+.2f}..{mx[1]:+.2f}] z[{mn[2]:+.2f}..{mx[2]:+.2f}]")
|
||||
Reference in New Issue
Block a user