1
1
#include < chrono>
2
2
#include < thread>
3
- #include < unitree/hg_idl /HandState_.hpp> // replace your sdk path
4
- #include < unitree/hg_idl /HandCmd_.hpp> // replace your sdk path
3
+ #include < unitree/idl/hg /HandState_.hpp> // replace your sdk path
4
+ #include < unitree/idl/hg /HandCmd_.hpp> // replace your sdk path
5
5
#include < unitree/robot/channel/channel_publisher.hpp>
6
6
#include < unitree/robot/channel/channel_subscriber.hpp>
7
7
#include < iostream>
@@ -22,15 +22,13 @@ enum State {
22
22
PRINT
23
23
};
24
24
25
- // �ο�urdf�����λ
26
- const float maxTorqueLimits_left[7 ]= { 1.05 , 1.05 , 1.75 , 0 , 0 , 0 , 0 }; // set max motor value
27
- const float minTorqueLimits_left[7 ]= { -1.05 , -0.724 , 0 , -1.57 , -1.75 , -1.57 ,-1.75 };
28
- const float maxTorqueLimits_right[7 ]= { 1.05 , 0.742 , 0 , 1.57 , 1.75 , 1.57 , 1.75 };
29
- const float minTorqueLimits_right[7 ]= { -1.05 , -1.05 , -1.75 , 0 , 0 , 0 ,0 };
30
-
31
-
32
- // State currentState = INIT;
25
+ // set URDF Limits
26
+ const float maxLimits_left[7 ]= { 1.05 , 1.05 , 1.75 , 0 , 0 , 0 , 0 }; // set max motor value
27
+ const float minLimits_left[7 ]= { -1.05 , -0.724 , 0 , -1.57 , -1.75 , -1.57 ,-1.75 };
28
+ const float maxLimits_right[7 ]= { 1.05 , 0.742 , 0 , 1.57 , 1.75 , 1.57 , 1.75 };
29
+ const float minLimits_right[7 ]= { -1.05 , -1.05 , -1.75 , 0 , 0 , 0 ,0 };
33
30
31
+ // Initing the dds configuration
34
32
std::string dds_namespace = " rt/dex3/left" ;
35
33
std::string sub_namespace = " rt/dex3/left/state" ;
36
34
unitree::robot::ChannelPublisherPtr<unitree_hg::msg::dds_::HandCmd_> handcmd_publisher;
@@ -50,7 +48,7 @@ typedef struct {
50
48
uint8_t timeout: 1 ;
51
49
} RIS_Mode_t;
52
50
53
- // stateToString ��������
51
+ // stateToString Method
54
52
const char * stateToString (State state) {
55
53
switch (state) {
56
54
case INIT: return " INIT" ;
@@ -62,7 +60,7 @@ const char* stateToString(State state) {
62
60
}
63
61
}
64
62
65
-
63
+ // Monitor user's input
66
64
char getNonBlockingInput () {
67
65
struct termios oldt, newt;
68
66
char ch;
@@ -75,16 +73,14 @@ char getNonBlockingInput() {
75
73
oldf = fcntl (STDIN_FILENO, F_GETFL, 0 );
76
74
fcntl (STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
77
75
78
- ch = getchar (); // ��ȡ�����ַ�
76
+ ch = getchar ();
79
77
80
78
tcsetattr (STDIN_FILENO, TCSANOW, &oldt);
81
79
fcntl (STDIN_FILENO, F_SETFL, oldf);
82
80
83
81
return ch;
84
82
}
85
83
86
-
87
-
88
84
void userInputThread () {
89
85
while (true ) {
90
86
char ch = getNonBlockingInput ();
@@ -105,11 +101,12 @@ void userInputThread() {
105
101
}
106
102
}
107
103
104
+ // this method can send kp and kd to motors
108
105
void rotateMotors (bool isLeftHand) {
109
106
static int _count = 1 ;
110
107
static int dir = 1 ;
111
- const float * maxTorqueLimits = isLeftHand ? maxTorqueLimits_left : maxTorqueLimits_right ;
112
- const float * minTorqueLimits = isLeftHand ? minTorqueLimits_left : minTorqueLimits_right ;
108
+ const float * maxLimits = isLeftHand ? maxLimits_left : maxLimits_right ;
109
+ const float * minLimits = isLeftHand ? minLimits_left : minLimits_right ;
113
110
114
111
for (int i = 0 ; i < MOTOR_MAX; i++) {
115
112
RIS_Mode_t ris_mode;
@@ -127,8 +124,8 @@ void rotateMotors(bool isLeftHand) {
127
124
msg.motor_cmd ()[i].kd (0.1 );
128
125
129
126
130
- float range = maxTorqueLimits [i] - minTorqueLimits [i];
131
- float mid = (maxTorqueLimits [i] + minTorqueLimits [i]) / 2.0 ;
127
+ float range = maxLimits [i] - minLimits [i];
128
+ float mid = (maxLimits [i] + minLimits [i]) / 2.0 ;
132
129
float amplitude = range / 2.0 ;
133
130
float q = mid + amplitude * sin (_count / 20000.0 * M_PI);
134
131
@@ -149,15 +146,16 @@ void rotateMotors(bool isLeftHand) {
149
146
usleep (100 );
150
147
}
151
148
149
+ // this method can send static position to motors
152
150
void gripHand (bool isLeftHand) {
153
151
154
- const float * maxTorqueLimits = isLeftHand ? maxTorqueLimits_left : maxTorqueLimits_right ;
155
- const float * minTorqueLimits = isLeftHand ? minTorqueLimits_left : minTorqueLimits_right ;
152
+ const float * maxLimits = isLeftHand ? maxLimits_left : maxLimits_right ;
153
+ const float * minLimits = isLeftHand ? minLimits_left : minLimits_right ;
156
154
157
155
for (int i = 0 ; i < MOTOR_MAX; i++) {
158
156
RIS_Mode_t ris_mode;
159
157
ris_mode.id = i;
160
- ris_mode.status = 0x01 ; /
158
+ ris_mode.status = 0x01 ;
161
159
162
160
163
161
uint8_t mode = 0 ;
@@ -168,7 +166,7 @@ void gripHand(bool isLeftHand) {
168
166
msg.motor_cmd ()[i].tau (0 );
169
167
170
168
171
- float mid = (maxTorqueLimits [i] + minTorqueLimits [i]) / 2.0 ;
169
+ float mid = (maxLimits [i] + minLimits [i]) / 2.0 ;
172
170
173
171
174
172
msg.motor_cmd ()[i].q (mid);
@@ -182,6 +180,7 @@ void gripHand(bool isLeftHand) {
182
180
usleep (1000000 );
183
181
}
184
182
183
+ // this method can send dynamic position to motors
185
184
void stopMotors () {
186
185
for (int i = 0 ; i < MOTOR_MAX; i++) {
187
186
RIS_Mode_t ris_mode;
@@ -205,17 +204,17 @@ void stopMotors() {
205
204
usleep (1000000 );
206
205
}
207
206
208
-
207
+ // this method can subscribe dds and show the position for now
209
208
void printState (bool isLeftHand){
210
209
Eigen::Matrix<float , 7 , 1 > q;
211
210
212
- const float * maxTorqueLimits = isLeftHand ? maxTorqueLimits_left : maxTorqueLimits_right ;
213
- const float * minTorqueLimits = isLeftHand ? minTorqueLimits_left : minTorqueLimits_right ;
211
+ const float * maxLimits = isLeftHand ? maxLimits_left : maxLimits_right ;
212
+ const float * minLimits = isLeftHand ? minLimits_left : minLimits_right ;
214
213
for (int i = 0 ; i < 7 ; i++)
215
214
{
216
215
q (i) = state.motor_state ()[i].q ();
217
216
218
- q (i) = (q (i) - minTorqueLimits [i] ) / (maxTorqueLimits [i] - minTorqueLimits [i]);
217
+ q (i) = (q (i) - minLimits [i] ) / (maxLimits [i] - minLimits [i]);
219
218
q (i) = std::clamp (q (i), 0 .0f , 1 .0f );
220
219
}
221
220
std::cout << " \033 [2J\033 [H" ;
@@ -240,7 +239,8 @@ void StateHandler(const void *message) {
240
239
241
240
242
241
243
- int main () {
242
+ int main (int argc, const char ** argv)
243
+ {
244
244
std::cout << " --- Unitree Robotics --- \n " ;
245
245
std::cout << " Dex3 Hand Example \n\n " ;
246
246
std::string input;
@@ -260,7 +260,12 @@ int main() {
260
260
return -1 ;
261
261
}
262
262
263
- unitree::robot::ChannelFactory::Instance ()->Init (0 );
263
+ if (argc < 2 )
264
+ {
265
+ std::cout << " Usage: " << argv[0 ] << " networkInterface" << std::endl;
266
+ exit (-1 );
267
+ }
268
+ unitree::robot::ChannelFactory::Instance ()->Init (0 , argv[1 ]);
264
269
handcmd_publisher.reset (new unitree::robot::ChannelPublisher<unitree_hg::msg::dds_::HandCmd_>(dds_namespace + " /cmd" ));
265
270
handstate_subscriber.reset (new unitree::robot::ChannelSubscriber<unitree_hg::msg::dds_::HandState_>(sub_namespace));
266
271
handcmd_publisher->InitChannel ();
0 commit comments