Files
isaac/scripts/diag_zero.py
T
dasha_f 0d32f32db0 Сортировочная ячейка 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>
2026-08-01 13:07:24 +00:00

55 lines
2.5 KiB
Python

"""Кто обнуляет surfaceVelocity: значение читается до play и НЕСКОЛЬКО РАЗ во время.
drive_belt вернул (-1.0, 0, 0), а в атрибуте лежит (-0, 0, 0). Два разных объяснения:
запись не дошла до према, либо её перетирают во время прогона. Отличить их можно только
чтением атрибута в обоих состояниях - что и делается здесь.
Подозреваемый - авторские узлы ConveyorBeltGraph: по документации сборки собственной
скорости они не несут и на каждом тике пишут свою (нулевую), забивая явную установку.
Их деактивация в предыдущем прогоне могла не подействовать на уже созданный граф.
"""
import sys
REPO = "/home/dasha/robozon-sorter"
if REPO not in sys.path:
sys.path.insert(0, REPO)
import omni.usd, omni.timeline
import isaacsim.core.experimental.utils.app as app_utils
from pxr import Gf, PhysxSchema
from isaacsim.core.experimental.prims import RigidPrim
stage = omni.usd.get_context().get_stage()
tl = omni.timeline.get_timeline_interface()
if tl.is_playing():
tl.stop(); await app_utils.update_app_async(steps=10)
BELT = "/World/ConveyorTrack/Belt"
PROBE = "/World/_BeltProbe/main_00"
pr = stage.GetPrimAtPath(BELT)
attr = pr.GetAttribute("physxSurfaceVelocity:surfaceVelocity")
# состояние графов конвейера
graphs = [p for p in stage.Traverse() if "ConveyorBeltGraph" in p.GetName()]
print("графы ConveyorBeltGraph:")
for g in graphs:
print(f" {g.GetPath()} активен={g.IsActive()}")
attr.Set(Gf.Vec3f(-1.0, 0.0, 0.0))
print(f"\nзаписал -1.0 -> читается ДО play: {attr.Get()}")
tl.play()
await app_utils.update_app_async(steps=5)
print(f"после play, 5 шагов: {attr.Get()}")
await app_utils.update_app_async(steps=20)
print(f"после play, 25 шагов: {attr.Get()}")
rp = RigidPrim(paths=[PROBE])
x0 = rp.get_world_poses()[0].numpy()[0][0]
for i in range(6):
await app_utils.update_app_async(steps=20)
x = rp.get_world_poses()[0].numpy()[0][0]
print(f" шаг {25+(i+1)*20:4d}: v={attr.Get()} проба x={x:+.3f} прошла {(x-x0)*1000:+7.1f} мм")
tl.stop()
await app_utils.update_app_async(steps=5)
print(f"\nпосле stop: {attr.Get()}")