11import time
22import sys
3+ import struct
4+
35from unitree_sdk2py .core .channel import ChannelSubscriber , ChannelFactoryInitialize
46
5- from unitree_sdk2py .idl .default import unitree_go_msg_dds__WirelessController_
6- from unitree_sdk2py .idl .unitree_go .msg .dds_ import WirelessController_
7+ # Uncomment the following two lines when using Go2、Go2-W、B2、B2-W、H1 robot
8+ # from unitree_sdk2py.idl.default import unitree_go_msg_dds__LowState_
9+ # from unitree_sdk2py.idl.unitree_go.msg.dds_ import LowState_
10+
11+ # Uncomment the following two lines when using G1、H1-2 robot
12+ from unitree_sdk2py .idl .default import unitree_hg_msg_dds__LowState_
13+ from unitree_sdk2py .idl .unitree_hg .msg .dds_ import LowState_
714
15+ class unitreeRemoteController :
16+ def __init__ (self ):
17+ # key
18+ self .Lx = 0
19+ self .Rx = 0
20+ self .Ry = 0
21+ self .Ly = 0
822
9- key_state = [
10- ["R1" , 0 ],
11- ["L1" , 0 ],
12- ["start" , 0 ],
13- ["select" , 0 ],
14- ["R2" , 0 ],
15- ["L2" , 0 ],
16- ["F1" , 0 ],
17- ["F2" , 0 ],
18- ["A" , 0 ],
19- ["B" , 0 ],
20- ["X" , 0 ],
21- ["Y" , 0 ],
22- ["up" , 0 ],
23- ["right" , 0 ],
24- ["down" , 0 ],
25- ["left" , 0 ],
26- ]
23+ # button
24+ self .L1 = 0
25+ self .L2 = 0
26+ self .R1 = 0
27+ self .R2 = 0
28+ self .A = 0
29+ self .B = 0
30+ self .X = 0
31+ self .Y = 0
32+ self .Up = 0
33+ self .Down = 0
34+ self .Left = 0
35+ self .Right = 0
36+ self .Select = 0
37+ self .F1 = 0
38+ self .F3 = 0
39+ self .Start = 0
40+
41+ def parse_botton (self ,data1 ,data2 ):
42+ self .R1 = (data1 >> 0 ) & 1
43+ self .L1 = (data1 >> 1 ) & 1
44+ self .Start = (data1 >> 2 ) & 1
45+ self .Select = (data1 >> 3 ) & 1
46+ self .R2 = (data1 >> 4 ) & 1
47+ self .L2 = (data1 >> 5 ) & 1
48+ self .F1 = (data1 >> 6 ) & 1
49+ self .F3 = (data1 >> 7 ) & 1
50+ self .A = (data2 >> 0 ) & 1
51+ self .B = (data2 >> 1 ) & 1
52+ self .X = (data2 >> 2 ) & 1
53+ self .Y = (data2 >> 3 ) & 1
54+ self .Up = (data2 >> 4 ) & 1
55+ self .Right = (data2 >> 5 ) & 1
56+ self .Down = (data2 >> 6 ) & 1
57+ self .Left = (data2 >> 7 ) & 1
2758
59+ def parse_key (self ,data ):
60+ lx_offset = 4
61+ self .Lx = struct .unpack ('<f' , data [lx_offset :lx_offset + 4 ])[0 ]
62+ rx_offset = 8
63+ self .Rx = struct .unpack ('<f' , data [rx_offset :rx_offset + 4 ])[0 ]
64+ ry_offset = 12
65+ self .Ry = struct .unpack ('<f' , data [ry_offset :ry_offset + 4 ])[0 ]
66+ L2_offset = 16
67+ L2 = struct .unpack ('<f' , data [L2_offset :L2_offset + 4 ])[0 ] # Placeholder,unused
68+ ly_offset = 20
69+ self .Ly = struct .unpack ('<f' , data [ly_offset :ly_offset + 4 ])[0 ]
2870
29- def WirelessControllerHandler (msg : WirelessController_ ):
30- global key_state
31- print ("lx: " , msg .lx )
32- print ("lx: " , msg .ly )
33- print ("lx: " , msg .rx )
34- print ("lx: " , msg .ry )
35- print ("keys: " , msg .keys )
3671
37- #Update key state
38- for i in range ( 16 ):
39- key_state [ i ][ 1 ] = ( msg . keys & ( 1 << i )) >> i
72+ def parse ( self , remoteData ):
73+ self . parse_key ( remoteData )
74+ self . parse_botton ( remoteData [ 2 ], remoteData [ 3 ])
4075
41- print (key_state )
76+ print ("debug unitreeRemoteController: " )
77+ print ("Lx:" , self .Lx )
78+ print ("Rx:" , self .Rx )
79+ print ("Ry:" , self .Ry )
80+ print ("Ly:" , self .Ly )
4281
82+ print ("L1:" , self .L1 )
83+ print ("L2:" , self .L2 )
84+ print ("R1:" , self .R1 )
85+ print ("R2:" , self .R2 )
86+ print ("A:" , self .A )
87+ print ("B:" , self .B )
88+ print ("X:" , self .X )
89+ print ("Y:" , self .Y )
90+ print ("Up:" , self .Up )
91+ print ("Down:" , self .Down )
92+ print ("Left:" , self .Left )
93+ print ("Right:" , self .Right )
94+ print ("Select:" , self .Select )
95+ print ("F1:" , self .F1 )
96+ print ("F3:" , self .F3 )
97+ print ("Start:" , self .Start )
98+ print ("\n " )
99+
100+
101+ class Custom :
102+ def __init__ (self ):
103+ self .low_state = None
104+ self .remoteController = unitreeRemoteController ()
105+
106+ def Init (self ):
107+ self .lowstate_subscriber = ChannelSubscriber ("rt/lf/lowstate" , LowState_ )
108+ self .lowstate_subscriber .Init (self .LowStateMessageHandler , 10 )
109+
110+
111+ def LowStateMessageHandler (self , msg : LowState_ ):
112+ self .low_state = msg
113+ wireless_remote_data = self .low_state .wireless_remote
114+ self .remoteController .parse (wireless_remote_data )
43115
44116
45- if __name__ == "__main__" :
117+ if __name__ == '__main__' :
118+
119+ print ("WARNING: Please ensure there are no obstacles around the robot while running this example." )
120+ input ("Press Enter to continue..." )
121+
46122 if len (sys .argv )> 1 :
47123 ChannelFactoryInitialize (0 , sys .argv [1 ])
48124 else :
49125 ChannelFactoryInitialize (0 )
50-
51- sub = ChannelSubscriber ( "rt/wirelesscontroller" , WirelessController_ )
52- sub .Init (WirelessControllerHandler , 10 )
53-
54- while True :
55- time .sleep (10.0 )
126+
127+ custom = Custom ( )
128+ custom .Init ()
129+
130+ while True :
131+ time .sleep (1 )
0 commit comments