From 89752323355fed11b2a328ce372af0397447e58c Mon Sep 17 00:00:00 2001 From: Zzb Date: Tue, 23 Jun 2026 15:31:57 +0800 Subject: [PATCH 1/2] fix: resolve AttributeError by adding try-except for Isaac Lab compatibility --- .../direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py b/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py index 4ca5264..3c91f74 100644 --- a/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py +++ b/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py @@ -104,7 +104,12 @@ def _apply_action(self) -> None: def _get_observations(self) -> dict: self.velocity = self.robot.data.root_com_vel_w - self.forwards = math_utils.quat_apply(self.robot.data.root_link_quat_w.torch, self.robot.data.FORWARD_VEC_B.torch) + try: + # Works for older Isaac Lab versions where buffers are wrapped + self.forwards = math_utils.quat_apply(self.robot.data.root_link_quat_w.torch, self.robot.data.FORWARD_VEC_B.torch) + except AttributeError: + # Works for recent Isaac Lab (0.54.4+) where buffers natively return standard PyTorch Tensors + self.forwards = math_utils.quat_apply(self.robot.data.root_link_quat_w, self.robot.data.FORWARD_VEC_B) # obs = torch.hstack((self.velocity, self.commands)) dot = torch.sum(self.forwards * self.commands, dim=-1, keepdim=True) From b68c66d2aa449afa940b8a373d72eabedacf979b Mon Sep 17 00:00:00 2001 From: Zzb Date: Tue, 23 Jun 2026 17:02:55 +0800 Subject: [PATCH 2/2] refactor: optimize compatibility check using hasattr to reduce hot loop overhead --- .../isaac_lab_tutorial/isaac_lab_tutorial_env.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py b/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py index 3c91f74..96ebf46 100644 --- a/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py +++ b/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/isaac_lab_tutorial_env.py @@ -104,12 +104,16 @@ def _apply_action(self) -> None: def _get_observations(self) -> dict: self.velocity = self.robot.data.root_com_vel_w - try: - # Works for older Isaac Lab versions where buffers are wrapped - self.forwards = math_utils.quat_apply(self.robot.data.root_link_quat_w.torch, self.robot.data.FORWARD_VEC_B.torch) - except AttributeError: - # Works for recent Isaac Lab (0.54.4+) where buffers natively return standard PyTorch Tensors - self.forwards = math_utils.quat_apply(self.robot.data.root_link_quat_w, self.robot.data.FORWARD_VEC_B) + # Support both older Isaac Lab (wrapped buffers with .torch accessor) and + # newer Isaac Lab (native PyTorch Tensors returned directly). + quat = self.robot.data.root_link_quat_w + fwd_vec = self.robot.data.FORWARD_VEC_B + + if hasattr(quat, "torch"): + quat = quat.torch + fwd_vec = fwd_vec.torch + + self.forwards = math_utils.quat_apply(quat, fwd_vec) # obs = torch.hstack((self.velocity, self.commands)) dot = torch.sum(self.forwards * self.commands, dim=-1, keepdim=True)