@@ -1161,6 +1161,72 @@ def cleanup(self, render_data):
11611161 Renderer ._registry .pop (backend , None )
11621162
11631163
1164+ @pytest .mark .parametrize ("device" , ["cuda:0" , "cpu" ])
1165+ @pytest .mark .isaacsim_ci
1166+ def test_camera_pose_update_reflected_in_render (setup_camera_device , device ):
1167+ """Camera pose changes via FrameView should be visible in rendered depth.
1168+
1169+ Moves the camera close then far, renders depth, and verifies that the mean
1170+ valid depth from the far position is significantly larger (>1.5×) than the
1171+ close position. This validates that Fabric-side pose writes (via
1172+ PrepareForReuse) and USD writes are correctly propagated to the RTX
1173+ renderer.
1174+ """
1175+ sim , _unused_cam_cfg , dt = setup_camera_device
1176+
1177+ cam_cfg = CameraCfg (
1178+ prim_path = "/World/PoseTestCam" ,
1179+ height = 128 ,
1180+ width = 256 ,
1181+ update_period = 0 ,
1182+ update_latest_camera_pose = True ,
1183+ data_types = ["distance_to_camera" ],
1184+ spawn = sim_utils .PinholeCameraCfg (
1185+ focal_length = 24.0 ,
1186+ focus_distance = 400.0 ,
1187+ horizontal_aperture = 20.955 ,
1188+ clipping_range = (0.1 , 1.0e5 ),
1189+ ),
1190+ )
1191+ camera = Camera (cam_cfg )
1192+ try :
1193+ sim .reset ()
1194+
1195+ target = torch .tensor ([[0.0 , 0.0 , 0.0 ]], dtype = torch .float32 , device = camera .device )
1196+ max_range = cam_cfg .spawn .clipping_range [1 ]
1197+
1198+ # -- close position --
1199+ eyes_close = torch .tensor ([[2.0 , 2.0 , 2.0 ]], dtype = torch .float32 , device = camera .device )
1200+ camera .set_world_poses_from_view (eyes_close , target )
1201+ sim .step ()
1202+ camera .update (dt )
1203+ depth_close = camera .data .output ["distance_to_camera" ].clone ()
1204+
1205+ # -- far position --
1206+ eyes_far = torch .tensor ([[8.0 , 8.0 , 8.0 ]], dtype = torch .float32 , device = camera .device )
1207+ camera .set_world_poses_from_view (eyes_far , target )
1208+ sim .step ()
1209+ camera .update (dt )
1210+ depth_far = camera .data .output ["distance_to_camera" ].clone ()
1211+
1212+ # -- validate --
1213+ valid_close = depth_close [depth_close < max_range ]
1214+ valid_far = depth_far [depth_far < max_range ]
1215+
1216+ assert valid_close .numel () > 0 , "No valid close-range depth pixels"
1217+ assert valid_far .numel () > 0 , "No valid far-range depth pixels"
1218+
1219+ mean_close = valid_close .mean ().item ()
1220+ mean_far = valid_far .mean ().item ()
1221+
1222+ assert mean_far > mean_close * 1.5 , (
1223+ f"Far depth ({ mean_far :.2f} ) should be > 1.5× close depth ({ mean_close :.2f} ). "
1224+ "Camera pose change may not be reaching the renderer."
1225+ )
1226+ finally :
1227+ del camera
1228+
1229+
11641230def _populate_scene ():
11651231 """Add prims to the scene."""
11661232 # Ground-plane
0 commit comments