"""Кто обнуляет 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()}")