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>
46 lines
2.1 KiB
Python
46 lines
2.1 KiB
Python
"""Check for gaps/height-mismatches at every belt-to-belt handoff seam, and compare
|
|
plow_cell.usd's own reference grip-material setup against what we're using."""
|
|
import omni.usd
|
|
from pxr import Usd, UsdGeom, UsdShade, UsdPhysics
|
|
|
|
stage = omni.usd.get_context().get_stage()
|
|
bbc = UsdGeom.BBoxCache(Usd.TimeCode.Default(), [UsdGeom.Tokens.default_, UsdGeom.Tokens.render])
|
|
|
|
def report(path):
|
|
prim = stage.GetPrimAtPath(path)
|
|
if not prim.IsValid():
|
|
print(f" {path} MISSING"); return None
|
|
r = bbc.ComputeWorldBound(prim).ComputeAlignedRange()
|
|
mn, mx = r.GetMin(), r.GetMax()
|
|
api = UsdShade.MaterialBindingAPI(prim)
|
|
mat, _ = api.ComputeBoundMaterial(materialPurpose="physics")
|
|
fric = None
|
|
if mat:
|
|
m = UsdPhysics.MaterialAPI(mat.GetPrim())
|
|
fric = (round(m.GetStaticFrictionAttr().Get(),2), round(m.GetDynamicFrictionAttr().Get(),2))
|
|
print(f" {path}")
|
|
print(f" x[{mn[0]:+.3f}..{mx[0]:+.3f}] y[{mn[1]:+.3f}..{mx[1]:+.3f}] z[{mn[2]:+.3f}..{mx[2]:+.3f}] friction={fric} mat={mat.GetPath() if mat else None}")
|
|
return mn, mx
|
|
|
|
print("=== pusher handoff: ConveyorTrack_03/Belt -> Belt_01 ===")
|
|
b1 = report("/World/ConveyorTrack_03/Belt")
|
|
b2 = report("/World/ConveyorTrack_03/Belt_01")
|
|
if b1 and b2:
|
|
print(f" Y GAP (belt max_y to branch min_y): {b2[0][1]-b1[1][1]:+.3f} m Z step: {b2[0][2]-b1[1][2]:+.3f} m")
|
|
|
|
print("\n=== plow handoff: ConveyorTrack_04 -> decks -> ConveyorTrack_06 / _01 ===")
|
|
for path in ["/World/ConveyorTrack_04/Belt", "/World/PlowTransition_B", "/World/PlowCornerDeck_B",
|
|
"/World/ConveyorTrack_01/Belt", "/World/PlowTransition_C", "/World/PlowCornerDeck_C",
|
|
"/World/ConveyorTrack_06/Belt"]:
|
|
report(path)
|
|
|
|
print("\n=== reference: plow_cell.py's own GRIP_MATERIAL values ===")
|
|
import sys
|
|
sys.path.insert(0, "/home/dasha/robozon-sorter")
|
|
from robozon_sorter.sim import plow_cell as _pc
|
|
grip = stage.GetPrimAtPath(_pc.GRIP_MATERIAL)
|
|
print(" GRIP_MATERIAL path:", _pc.GRIP_MATERIAL, " valid:", grip.IsValid())
|
|
if grip.IsValid():
|
|
m = UsdPhysics.MaterialAPI(grip)
|
|
print(" static/dynamic:", m.GetStaticFrictionAttr().Get(), m.GetDynamicFrictionAttr().Get())
|