Сортировочная ячейка 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,43 @@
|
||||
"""Is gravity actually simulated at all right now? Check PhysicsScene + one item's live state."""
|
||||
import omni.usd, omni.timeline
|
||||
from pxr import UsdPhysics, PhysxSchema, UsdGeom, Usd
|
||||
import isaacsim.core.experimental.utils.app as app_utils
|
||||
from isaacsim.core.experimental.prims import RigidPrim
|
||||
|
||||
stage = omni.usd.get_context().get_stage()
|
||||
tl = omni.timeline.get_timeline_interface()
|
||||
print("timeline playing:", tl.is_playing())
|
||||
|
||||
sc = stage.GetPrimAtPath("/World/PhysicsScene")
|
||||
print("PhysicsScene valid:", sc.IsValid())
|
||||
if sc.IsValid():
|
||||
physxScene = PhysxSchema.PhysxSceneAPI(sc)
|
||||
print(" gravityMagnitude:", sc.GetAttribute("physics:gravityMagnitude").Get())
|
||||
print(" gravityDirection:", sc.GetAttribute("physics:gravityDirection").Get())
|
||||
print(" timeStepsPerSecond:", sc.GetAttribute("physxScene:timeStepsPerSecond").Get())
|
||||
print(" enableCCD:", sc.GetAttribute("physxScene:enableCCD").Get())
|
||||
|
||||
name = "bottle"
|
||||
prim = stage.GetPrimAtPath(f"/World/Items/{name}")
|
||||
print(f"\n{name} prim valid:", prim.IsValid())
|
||||
print(" applied schemas:", list(prim.GetAppliedSchemas()))
|
||||
print(" kinematicEnabled:", prim.GetAttribute("physics:kinematicEnabled").Get())
|
||||
attr = prim.GetAttribute("xformOp:translate")
|
||||
print(" authored translate:", attr.Get())
|
||||
rp = RigidPrim(paths=[f"/World/Items/{name}"])
|
||||
print(" RigidPrim world pose (fabric):", rp.get_world_poses()[0].numpy()[0])
|
||||
|
||||
# check mass / collision on descendant meshes
|
||||
n_col = 0
|
||||
for p in Usd.PrimRange(prim):
|
||||
if p.HasAPI(UsdPhysics.CollisionAPI) or p.HasAPI(UsdPhysics.MeshCollisionAPI):
|
||||
n_col += 1
|
||||
print(" descendant prims with CollisionAPI:", n_col)
|
||||
|
||||
print("\n=== stepping physics 60 more times, watching bottle's Z ===")
|
||||
if not tl.is_playing():
|
||||
tl.play()
|
||||
for i in range(6):
|
||||
await app_utils.update_app_async(steps=10)
|
||||
p = rp.get_world_poses()[0].numpy()[0]
|
||||
print(f" step batch {i}: pos={p} playing={tl.is_playing()} time={tl.get_current_time():.3f}")
|
||||
Reference in New Issue
Block a user