@@ -131,6 +131,15 @@ def _init_scene(self, simulation_app=None, args=None) -> None:
131131 if self .sim .has_gui ():
132132 self ._init_keyboard ()
133133
134+ def _write_root_state_to_sim (self , obj_inst , pose , velocity , env_ids , * , kinematic : bool ) -> None :
135+ if isinstance (env_ids , torch .Tensor ):
136+ env_ids_t = env_ids
137+ else :
138+ env_ids_t = torch .tensor (env_ids , device = self .device )
139+ obj_inst .write_root_pose_to_sim (pose , env_ids = env_ids_t )
140+ if not kinematic :
141+ obj_inst .write_root_velocity_to_sim (velocity , env_ids = env_ids_t )
142+
134143 def _load_robots (self ) -> None :
135144 for robot in self .robots :
136145 self ._add_robot (robot )
@@ -348,8 +357,13 @@ def _set_states(self, states: list[DictEnvState] | TensorState, env_ids: list[in
348357 # Set root state (fix_base_link only affects physics, not manual state setting)
349358 root_state = states .objects [obj .name ].root_state .clone ()
350359 root_state [:, :3 ] += self .scene .env_origins
351- obj_inst .write_root_pose_to_sim (root_state [env_ids , :7 ], env_ids = env_ids )
352- obj_inst .write_root_velocity_to_sim (root_state [env_ids , 7 :], env_ids = env_ids )
360+ self ._write_root_state_to_sim (
361+ obj_inst ,
362+ root_state [env_ids , :7 ],
363+ root_state [env_ids , 7 :],
364+ env_ids = env_ids ,
365+ kinematic = bool (obj .fix_base_link ),
366+ )
353367 # Set joint state for articulated objects
354368 if isinstance (obj , ArticulationObjCfg ):
355369 joint_ids_reindex = self .get_joint_reindex (obj .name , inverse = True )
@@ -368,9 +382,12 @@ def _set_states(self, states: list[DictEnvState] | TensorState, env_ids: list[in
368382 robot_inst = self .scene .articulations [robot .name ]
369383 root_state = states .robots [robot .name ].root_state .clone ()
370384 root_state [:, :3 ] += self .scene .env_origins
371- robot_inst .write_root_pose_to_sim (root_state [env_ids , :7 ], env_ids = env_ids )
372- robot_inst .write_root_velocity_to_sim (
373- states .robots [robot .name ].root_state [env_ids , 7 :], env_ids = env_ids
385+ self ._write_root_state_to_sim (
386+ robot_inst ,
387+ root_state [env_ids , :7 ],
388+ states .robots [robot .name ].root_state [env_ids , 7 :],
389+ env_ids = env_ids ,
390+ kinematic = bool (robot .fix_base_link ),
374391 )
375392 joint_ids_reindex = self .get_joint_reindex (robot .name , inverse = True )
376393 robot_inst .write_joint_position_to_sim (
@@ -1510,10 +1527,12 @@ def _set_object_pose(
15101527 ],
15111528 dim = - 1 ,
15121529 )
1513- obj_inst .write_root_pose_to_sim (pose , env_ids = torch .tensor (env_ids , device = self .device ))
1514- obj_inst .write_root_velocity_to_sim (
1530+ self ._write_root_state_to_sim (
1531+ obj_inst ,
1532+ pose ,
15151533 torch .zeros ((len (env_ids ), 6 ), device = self .device , dtype = torch .float32 ),
15161534 env_ids = torch .tensor (env_ids , device = self .device ),
1535+ kinematic = bool (object .fix_base_link ),
15171536 ) # ! critical
15181537 obj_inst .write_data_to_sim ()
15191538
0 commit comments