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>
55 lines
2.5 KiB
Python
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()}")
|