merge: imf attnres policy
# Conflicts: # roboimi/demos/vla_scripts/eval_vla.py # roboimi/envs/double_base.py
This commit is contained in:
@@ -90,6 +90,36 @@ class _FakeRenderer:
|
||||
|
||||
|
||||
class EvalVLAHeadlessTest(unittest.TestCase):
|
||||
def test_prepare_observation_skips_resize_when_image_resize_shape_is_none(self):
|
||||
obs = {
|
||||
"images": {
|
||||
"front": np.arange(8 * 8 * 3, dtype=np.uint8).reshape(8, 8, 3),
|
||||
},
|
||||
"qpos": np.zeros(16, dtype=np.float32),
|
||||
}
|
||||
|
||||
with mock.patch("cv2.resize", side_effect=AssertionError("resize should be skipped")):
|
||||
prepared = eval_vla.prepare_observation(
|
||||
obs,
|
||||
["front"],
|
||||
image_resize_shape=None,
|
||||
)
|
||||
|
||||
self.assertEqual(tuple(prepared["images"]["front"].shape), (3, 8, 8))
|
||||
self.assertEqual(tuple(prepared["qpos"].shape), (16,))
|
||||
|
||||
def test_headless_eval_sets_mujoco_gl_to_egl_when_display_missing(self):
|
||||
cfg = OmegaConf.create({"eval": {"headless": True}})
|
||||
with mock.patch.dict(eval_vla.os.environ, {}, clear=True):
|
||||
eval_vla._configure_headless_mujoco_gl(cfg.eval)
|
||||
self.assertEqual(eval_vla.os.environ.get("MUJOCO_GL"), "egl")
|
||||
|
||||
def test_headless_eval_preserves_existing_mujoco_gl(self):
|
||||
cfg = OmegaConf.create({"eval": {"headless": True}})
|
||||
with mock.patch.dict(eval_vla.os.environ, {"MUJOCO_GL": "osmesa"}, clear=True):
|
||||
eval_vla._configure_headless_mujoco_gl(cfg.eval)
|
||||
self.assertEqual(eval_vla.os.environ.get("MUJOCO_GL"), "osmesa")
|
||||
|
||||
def test_eval_config_exposes_headless_default(self):
|
||||
eval_cfg = OmegaConf.load(Path("roboimi/vla/conf/eval/eval.yaml"))
|
||||
|
||||
@@ -117,6 +147,49 @@ class EvalVLAHeadlessTest(unittest.TestCase):
|
||||
cam_view="left_side",
|
||||
)
|
||||
|
||||
def test_headless_sync_camera_capture_populates_images_without_gui_calls(self):
|
||||
env = DualDianaMed.__new__(DualDianaMed)
|
||||
env.mj_model = object()
|
||||
env.mj_data = object()
|
||||
env.exit_flag = False
|
||||
env.is_render = False
|
||||
env.cam = 'angle'
|
||||
env.r_vis = None
|
||||
env.l_vis = None
|
||||
env.top = None
|
||||
env.angle = None
|
||||
env.front = None
|
||||
env._offscreen_renderer = None
|
||||
|
||||
with mock.patch(
|
||||
'roboimi.envs.double_base.mj.Renderer',
|
||||
side_effect=lambda *args, **kwargs: _FakeRenderer(env),
|
||||
) as renderer_cls, mock.patch('roboimi.envs.double_base.cv2.namedWindow') as named_window, mock.patch(
|
||||
'roboimi.envs.double_base.cv2.imshow'
|
||||
) as imshow, mock.patch('roboimi.envs.double_base.cv2.waitKey') as wait_key:
|
||||
env._update_camera_images_sync()
|
||||
|
||||
renderer_cls.assert_called_once()
|
||||
named_window.assert_not_called()
|
||||
imshow.assert_not_called()
|
||||
wait_key.assert_not_called()
|
||||
self.assertIsNotNone(env.r_vis)
|
||||
self.assertIsNotNone(env.l_vis)
|
||||
self.assertIsNotNone(env.top)
|
||||
self.assertIsNotNone(env.angle)
|
||||
self.assertIsNotNone(env.front)
|
||||
|
||||
def test_cam_start_skips_background_thread_when_headless(self):
|
||||
env = DualDianaMed.__new__(DualDianaMed)
|
||||
env.is_render = False
|
||||
env.cam_thread = None
|
||||
|
||||
with mock.patch('roboimi.envs.double_base.threading.Thread') as thread_cls:
|
||||
env.cam_start()
|
||||
|
||||
thread_cls.assert_not_called()
|
||||
self.assertIsNone(env.cam_thread)
|
||||
|
||||
def test_camera_viewer_headless_updates_images_without_gui_calls(self):
|
||||
env = DualDianaMed.__new__(DualDianaMed)
|
||||
env.mj_model = object()
|
||||
|
||||
Reference in New Issue
Block a user