@@ -10,8 +10,10 @@ class FrameProperty(Enum):
1010 INVALID_FRAME_PROPERTY = 0x00
1111 JOINT_POSITION_RCO = 0x01
1212 MAX_PRESS_RCO = 0x02
13+ MAX_PRESS_RCO2 = 0x03
1314 JOINT_POSITION2_RCO = 0x04
1415 JOINT_SPEED = 0x05
16+ JOINT_SPEED2 = 0x06
1517 REQUEST_DATA_RETURN = 0x09
1618 JOINT_POSITION_N = 0x11
1719 MAX_PRESS_N = 0x12
@@ -24,10 +26,12 @@ class FrameProperty(Enum):
2426
2527class LinkerHandL10Can :
2628 def __init__ (self ,can_id , can_channel = 'can0' , baudrate = 1000000 , ):
27- self .x01 = [0 ] * 5
28- self .x02 = [0 ] * 5
29- self .x04 = [0 ] * 5
30- self .x05 = [0 ] * 5
29+ self .x01 = [- 1 ] * 5
30+ self .x02 = [- 1 ] * 5
31+ self .x03 = [- 1 ] * 5
32+ self .x04 = [- 1 ] * 5
33+ self .x05 = [- 1 ] * 5
34+ self .x06 = [- 1 ] * 5
3135 self .x33 = self .x34 = [0 ] * 5
3236 # Fault codes
3337 self .x35 ,self .x36 = [0 ] * 5 ,[0 ] * 5
@@ -73,7 +77,7 @@ def init_can_bus(self, channel, baudrate):
7377 else :
7478 raise EnvironmentError ("Unsupported platform for CAN interface" )
7579
76- def send_frame (self , frame_property , data_list ,sleep = 0.005 ):
80+ def send_frame (self , frame_property , data_list ,sleep = 0.003 ):
7781 """Send a single CAN frame with specified properties and data."""
7882 frame_property_value = int (frame_property .value ) if hasattr (frame_property , 'value' ) else frame_property
7983 data = [frame_property_value ] + [int (val ) for val in data_list ]
@@ -108,10 +112,16 @@ def set_joint_speed_l10(self,speed=[180]*5):
108112 time .sleep (0.01 )
109113 self .send_frame (0x05 , speed )
110114 def set_speed (self ,speed = [180 ]* 5 ):
111- self .x05 = speed
112- for i in range (2 ):
113- time .sleep (0.01 )
114- self .send_frame (0x05 , speed )
115+ if len (speed ) == 5 :
116+ self .x05 = speed
117+ for i in range (2 ):
118+ time .sleep (0.01 )
119+ self .send_frame (0x05 , speed )
120+ elif len (speed ) == 10 :
121+ for i in range (2 ):
122+ time .sleep (0.01 )
123+ self .send_frame (0x05 , speed [:5 ])
124+ self .send_frame (0x06 , speed [5 :])
115125 def request_all_status (self ):
116126 """Get all joint positions and pressures."""
117127 self .send_frame (FrameProperty .REQUEST_DATA_RETURN , [])
@@ -153,11 +163,14 @@ def process_response(self, msg):
153163 self .x01 = list (response_data )
154164 elif frame_type == FrameProperty .MAX_PRESS_RCO .value : # 0x02
155165 self .x02 = list (response_data )
166+ elif frame_type == FrameProperty .MAX_PRESS_RCO2 .value : # 0x03
167+ self .x03 = list (response_data )
156168 elif frame_type == FrameProperty .JOINT_POSITION2_RCO .value : # 0x04
157169 self .x04 = list (response_data )
158170 elif frame_type == 0x05 :
159- #self.x05 = list(response_data)
160- pass
171+ self .x05 = list (response_data )
172+ elif frame_type == 0x06 :
173+ self .x06 = list (response_data )
161174 elif frame_type == 0x20 :
162175 # Five-finger normal force
163176 d = list (response_data )
@@ -229,11 +242,17 @@ def process_response(self, msg):
229242
230243 def set_torque (self ,torque = []):
231244 '''Set maximum torque'''
232- self .send_frame (0x02 , torque )
245+ if len (torque ) == 5 :
246+ self .send_frame (0x02 , torque )
247+ time .sleep (0.002 )
248+ self .send_frame (0x03 ,torque )
249+ elif len (torque ) > 5 :
250+ self .send_frame (0x02 , torque [:5 ])
251+ time .sleep (0.002 )
252+ self .send_frame (0x03 ,torque [5 :])
233253 def get_version (self ):
234254 '''Get version'''
235255 self .send_frame (0x64 ,[],sleep = 0.1 )
236- time .sleep (0.001 )
237256 return self .version
238257 def get_current_status (self ):
239258 '''Get current joint status'''
@@ -242,12 +261,10 @@ def get_current_status(self):
242261 return self .x01 + self .x04
243262 def get_speed (self ):
244263 '''Get current speed'''
245- return self .x05
246- def get_press (self ):
247- '''Get current torque'''
248- self .set_max_torque_limits (pressures = [0.0 ], type = "get" )
249- time .sleep (0.001 )
250- return self .x02
264+ # self.send_frame(0x05,[],sleep=0.005)
265+ # self.send_frame(0x06,[],sleep=0.005)
266+ return self .x05 + self .x06
267+
251268 def get_force (self ):
252269 '''Get pressure sensor data'''
253270 return [self .normal_force ,self .tangential_force , self .tangential_force_dir , self .approach_inc ]
@@ -271,24 +288,29 @@ def get_touch_type(self):
271288
272289 def get_touch (self ):
273290 '''Get touch data'''
274- self .send_frame (0xb1 ,[],sleep = 0.02 )
275- self .send_frame (0xb2 ,[],sleep = 0.02 )
276- self .send_frame (0xb3 ,[],sleep = 0.02 )
277- self .send_frame (0xb4 ,[],sleep = 0.02 )
278- self .send_frame (0xb5 ,[],sleep = 0.02 )
291+ self .send_frame (0xb1 ,[],sleep = 0.03 )
292+ self .send_frame (0xb2 ,[],sleep = 0.03 )
293+ self .send_frame (0xb3 ,[],sleep = 0.03 )
294+ self .send_frame (0xb4 ,[],sleep = 0.03 )
295+ self .send_frame (0xb5 ,[],sleep = 0.03 )
279296 return [self .xb1 [1 ],self .xb2 [1 ],self .xb3 [1 ],self .xb4 [1 ],self .xb5 [1 ],0 ] # The last digit is palm, currently not available
280297
281298 def get_matrix_touch (self ):
282- self .send_frame (0xb1 ,[0xc6 ],sleep = 0.025 )
283- self .send_frame (0xb2 ,[0xc6 ],sleep = 0.025 )
284- self .send_frame (0xb3 ,[0xc6 ],sleep = 0.025 )
285- self .send_frame (0xb4 ,[0xc6 ],sleep = 0.025 )
286- self .send_frame (0xb5 ,[0xc6 ],sleep = 0.025 )
299+ self .send_frame (0xb1 ,[0xc6 ],sleep = 0.04 )
300+ self .send_frame (0xb2 ,[0xc6 ],sleep = 0.04 )
301+ self .send_frame (0xb3 ,[0xc6 ],sleep = 0.04 )
302+ self .send_frame (0xb4 ,[0xc6 ],sleep = 0.04 )
303+ self .send_frame (0xb5 ,[0xc6 ],sleep = 0.04 )
287304 return self .thumb_matrix , self .index_matrix , self .middle_matrix , self .ring_matrix , self .little_matrix
288305
289306 def get_torque (self ):
290- '''Not supported yet'''
291- return [- 1 ] * 5
307+ '''Get current motor torque'''
308+ self .send_frame (0x02 , [])
309+ time .sleep (0.002 )
310+ self .send_frame (0x03 ,[])
311+ #self.set_max_torque_limits(pressures=[0.0], type="get")
312+ #time.sleep(0.001)
313+ return self .x02 + self .x03
292314
293315 def get_fault (self ):
294316 '''Get motor fault'''
0 commit comments