@@ -65,7 +65,9 @@ def __init__(
6565
6666 self ._adapter = adapter
6767 self ._component = component
68- self ._joint_names = component .joints
68+ self ._arm_joint_names : list [JointName ] = list (component .joints )
69+ self ._gripper_joints : list [JointName ] = list (component .gripper_joints )
70+ self ._joint_names : list [JointName ] = component .all_joints
6971
7072 # Track last commanded values for hold-last behavior
7173 self ._last_commanded : dict [str , float ] = {}
@@ -114,15 +116,27 @@ def read_state(self) -> dict[JointName, JointState]:
114116 velocities = self ._adapter .read_joint_velocities ()
115117 efforts = self ._adapter .read_joint_efforts ()
116118
117- return {
119+ result : dict [ JointName , JointState ] = {
118120 name : JointState (
119121 position = positions [i ],
120122 velocity = velocities [i ],
121123 effort = efforts [i ],
122124 )
123- for i , name in enumerate (self ._joint_names )
125+ for i , name in enumerate (self ._arm_joint_names )
124126 }
125127
128+ # Append gripper joint(s) via adapter gripper method
129+ if self ._gripper_joints :
130+ gripper_pos = self ._adapter .read_gripper_position ()
131+ for gj in self ._gripper_joints :
132+ result [gj ] = JointState (
133+ position = gripper_pos if gripper_pos is not None else 0.0 ,
134+ velocity = 0.0 ,
135+ effort = 0.0 ,
136+ )
137+
138+ return result
139+
126140 def write_command (self , commands : dict [str , float ], mode : ControlMode ) -> bool :
127141 """Write commands - allows partial joint sets, holds last for missing.
128142
@@ -153,8 +167,8 @@ def write_command(self, commands: dict[str, float], mode: ControlMode) -> bool:
153167 )
154168 self ._warned_unknown_joints .add (joint_name )
155169
156- # Build ordered list for adapter
157- ordered = self ._build_ordered_command ()
170+ # Build ordered list for arm joints only
171+ arm_ordered = [ self ._last_commanded [ name ] for name in self . _arm_joint_names ]
158172
159173 # Switch control mode if needed
160174 if mode != self ._current_mode :
@@ -163,25 +177,43 @@ def write_command(self, commands: dict[str, float], mode: ControlMode) -> bool:
163177 return False
164178 self ._current_mode = mode
165179
166- # Send to adapter
180+ # Send arm joints to adapter
181+ arm_ok : bool
167182 match mode :
168183 case ControlMode .POSITION | ControlMode .SERVO_POSITION :
169- return self ._adapter .write_joint_positions (ordered )
184+ arm_ok = self ._adapter .write_joint_positions (arm_ordered )
170185 case ControlMode .VELOCITY :
171- return self ._adapter .write_joint_velocities (ordered )
186+ arm_ok = self ._adapter .write_joint_velocities (arm_ordered )
172187 case ControlMode .TORQUE :
173188 logger .warning (f"Hardware { self .hardware_id } does not support torque mode" )
174- return False
189+ arm_ok = False
175190 case _:
176- return False
191+ arm_ok = False
192+
193+ # Send gripper joints via adapter gripper method
194+ gripper_ok = True
195+ for gj in self ._gripper_joints :
196+ if gj in self ._last_commanded :
197+ gripper_ok = (
198+ self ._adapter .write_gripper_position (self ._last_commanded [gj ]) and gripper_ok
199+ )
200+
201+ return arm_ok and gripper_ok
177202
178203 def _initialize_last_commanded (self ) -> None :
179204 """Initialize last_commanded with current hardware positions."""
180205 for _ in range (10 ):
181206 try :
182207 current = self ._adapter .read_joint_positions ()
183- for i , name in enumerate (self ._joint_names ):
208+ for i , name in enumerate (self ._arm_joint_names ):
184209 self ._last_commanded [name ] = current [i ]
210+
211+ # Initialize gripper joint(s) from adapter
212+ if self ._gripper_joints :
213+ gripper_pos = self ._adapter .read_gripper_position ()
214+ for gj in self ._gripper_joints :
215+ self ._last_commanded [gj ] = gripper_pos if gripper_pos is not None else 0.0
216+
185217 self ._initialized = True
186218 return
187219 except Exception :
0 commit comments