summaryrefslogtreecommitdiff
path: root/examples/pybullet/examples/quadruped.py
blob: a9352fd084bba033a984bd145101abc545e85b50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
import pybullet as p
import time
import math


def drawInertiaBox(parentUid, parentLinkIndex, color):
  dyn = p.getDynamicsInfo(parentUid, parentLinkIndex)
  mass = dyn[0]
  frictionCoeff = dyn[1]
  inertia = dyn[2]
  if (mass > 0):
    Ixx = inertia[0]
    Iyy = inertia[1]
    Izz = inertia[2]
    boxScaleX = 0.5 * math.sqrt(6 * (Izz + Iyy - Ixx) / mass)
    boxScaleY = 0.5 * math.sqrt(6 * (Izz + Ixx - Iyy) / mass)
    boxScaleZ = 0.5 * math.sqrt(6 * (Ixx + Iyy - Izz) / mass)

    halfExtents = [boxScaleX, boxScaleY, boxScaleZ]
    pts = [[halfExtents[0], halfExtents[1], halfExtents[2]],
           [-halfExtents[0], halfExtents[1], halfExtents[2]],
           [halfExtents[0], -halfExtents[1], halfExtents[2]],
           [-halfExtents[0], -halfExtents[1], halfExtents[2]],
           [halfExtents[0], halfExtents[1], -halfExtents[2]],
           [-halfExtents[0], halfExtents[1], -halfExtents[2]],
           [halfExtents[0], -halfExtents[1], -halfExtents[2]],
           [-halfExtents[0], -halfExtents[1], -halfExtents[2]]]

    p.addUserDebugLine(pts[0],
                       pts[1],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[1],
                       pts[3],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[3],
                       pts[2],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[2],
                       pts[0],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)

    p.addUserDebugLine(pts[0],
                       pts[4],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[1],
                       pts[5],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[2],
                       pts[6],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[3],
                       pts[7],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)

    p.addUserDebugLine(pts[4 + 0],
                       pts[4 + 1],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[4 + 1],
                       pts[4 + 3],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[4 + 3],
                       pts[4 + 2],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)
    p.addUserDebugLine(pts[4 + 2],
                       pts[4 + 0],
                       color,
                       1,
                       parentObjectUniqueId=parentUid,
                       parentLinkIndex=parentLinkIndex)


toeConstraint = True
useMaximalCoordinates = False
useRealTime = 1

#the fixedTimeStep and numSolverIterations are the most important parameters to trade-off quality versus performance
fixedTimeStep = 1. / 100
numSolverIterations = 50

if (useMaximalCoordinates):
  fixedTimeStep = 1. / 500
  numSolverIterations = 200

speed = 10
amplitude = 0.8
jump_amp = 0.5
maxForce = 3.5
kneeFrictionForce = 0
kp = 1
kd = .5
maxKneeForce = 1000

physId = p.connect(p.SHARED_MEMORY)
if (physId < 0):
  p.connect(p.GUI)
#p.resetSimulation()

angle = 0  # pick in range 0..0.2 radians
orn = p.getQuaternionFromEuler([0, angle, 0])
p.loadURDF("plane.urdf", [0, 0, 0], orn)
p.setPhysicsEngineParameter(numSolverIterations=numSolverIterations)
p.startStateLogging(p.STATE_LOGGING_GENERIC_ROBOT,
                    "genericlogdata.bin",
                    maxLogDof=16,
                    logFlags=p.STATE_LOG_JOINT_TORQUES)
p.setTimeOut(4000000)

p.setGravity(0, 0, 0)
p.setTimeStep(fixedTimeStep)

orn = p.getQuaternionFromEuler([0, 0, 0.4])
p.setRealTimeSimulation(0)
quadruped = p.loadURDF("quadruped/minitaur_v1.urdf", [1, -1, .3],
                       orn,
                       useFixedBase=False,
                       useMaximalCoordinates=useMaximalCoordinates,
                       flags=p.URDF_USE_IMPLICIT_CYLINDER)
nJoints = p.getNumJoints(quadruped)

jointNameToId = {}
for i in range(nJoints):
  jointInfo = p.getJointInfo(quadruped, i)
  jointNameToId[jointInfo[1].decode('UTF-8')] = jointInfo[0]

motor_front_rightR_joint = jointNameToId['motor_front_rightR_joint']
motor_front_rightL_joint = jointNameToId['motor_front_rightL_joint']
knee_front_rightL_link = jointNameToId['knee_front_rightL_link']
hip_front_rightR_link = jointNameToId['hip_front_rightR_link']
knee_front_rightR_link = jointNameToId['knee_front_rightR_link']
motor_front_rightL_link = jointNameToId['motor_front_rightL_link']
motor_front_leftR_joint = jointNameToId['motor_front_leftR_joint']
hip_front_leftR_link = jointNameToId['hip_front_leftR_link']
knee_front_leftR_link = jointNameToId['knee_front_leftR_link']
motor_front_leftL_joint = jointNameToId['motor_front_leftL_joint']
motor_front_leftL_link = jointNameToId['motor_front_leftL_link']
knee_front_leftL_link = jointNameToId['knee_front_leftL_link']
motor_back_rightR_joint = jointNameToId['motor_back_rightR_joint']
hip_rightR_link = jointNameToId['hip_rightR_link']
knee_back_rightR_link = jointNameToId['knee_back_rightR_link']
motor_back_rightL_joint = jointNameToId['motor_back_rightL_joint']
motor_back_rightL_link = jointNameToId['motor_back_rightL_link']
knee_back_rightL_link = jointNameToId['knee_back_rightL_link']
motor_back_leftR_joint = jointNameToId['motor_back_leftR_joint']
hip_leftR_link = jointNameToId['hip_leftR_link']
knee_back_leftR_link = jointNameToId['knee_back_leftR_link']
motor_back_leftL_joint = jointNameToId['motor_back_leftL_joint']
motor_back_leftL_link = jointNameToId['motor_back_leftL_link']
knee_back_leftL_link = jointNameToId['knee_back_leftL_link']

#fixtorso = p.createConstraint(-1,-1,quadruped,-1,p.JOINT_FIXED,[0,0,0],[0,0,0],[0,0,0])

motordir = [-1, -1, -1, -1, 1, 1, 1, 1]
halfpi = 1.57079632679
twopi = 4 * halfpi
kneeangle = -2.1834

dyn = p.getDynamicsInfo(quadruped, -1)
mass = dyn[0]
friction = dyn[1]
localInertiaDiagonal = dyn[2]

print("localInertiaDiagonal", localInertiaDiagonal)

#this is a no-op, just to show the API
p.changeDynamics(quadruped, -1, localInertiaDiagonal=localInertiaDiagonal)

#for i in range (nJoints):
#	p.changeDynamics(quadruped,i,localInertiaDiagonal=[0.000001,0.000001,0.000001])

drawInertiaBox(quadruped, -1, [1, 0, 0])
#drawInertiaBox(quadruped,motor_front_rightR_joint, [1,0,0])

for i in range(nJoints):
  drawInertiaBox(quadruped, i, [0, 1, 0])

if (useMaximalCoordinates):
  steps = 400
  for aa in range(steps):
    p.setJointMotorControl2(quadruped, motor_front_leftL_joint, p.POSITION_CONTROL,
                            motordir[0] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_front_leftR_joint, p.POSITION_CONTROL,
                            motordir[1] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_back_leftL_joint, p.POSITION_CONTROL,
                            motordir[2] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_back_leftR_joint, p.POSITION_CONTROL,
                            motordir[3] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_front_rightL_joint, p.POSITION_CONTROL,
                            motordir[4] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_front_rightR_joint, p.POSITION_CONTROL,
                            motordir[5] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_back_rightL_joint, p.POSITION_CONTROL,
                            motordir[6] * halfpi * float(aa) / steps)
    p.setJointMotorControl2(quadruped, motor_back_rightR_joint, p.POSITION_CONTROL,
                            motordir[7] * halfpi * float(aa) / steps)

    p.setJointMotorControl2(quadruped, knee_front_leftL_link, p.POSITION_CONTROL,
                            motordir[0] * (kneeangle + twopi) * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_front_leftR_link, p.POSITION_CONTROL,
                            motordir[1] * kneeangle * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_back_leftL_link, p.POSITION_CONTROL,
                            motordir[2] * kneeangle * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_back_leftR_link, p.POSITION_CONTROL,
                            motordir[3] * (kneeangle + twopi) * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_front_rightL_link, p.POSITION_CONTROL,
                            motordir[4] * (kneeangle) * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_front_rightR_link, p.POSITION_CONTROL,
                            motordir[5] * (kneeangle + twopi) * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_back_rightL_link, p.POSITION_CONTROL,
                            motordir[6] * (kneeangle + twopi) * float(aa) / steps)
    p.setJointMotorControl2(quadruped, knee_back_rightR_link, p.POSITION_CONTROL,
                            motordir[7] * kneeangle * float(aa) / steps)

    p.stepSimulation()
    #time.sleep(fixedTimeStep)
else:

  p.resetJointState(quadruped, motor_front_leftL_joint, motordir[0] * halfpi)
  p.resetJointState(quadruped, knee_front_leftL_link, motordir[0] * kneeangle)
  p.resetJointState(quadruped, motor_front_leftR_joint, motordir[1] * halfpi)
  p.resetJointState(quadruped, knee_front_leftR_link, motordir[1] * kneeangle)

  p.resetJointState(quadruped, motor_back_leftL_joint, motordir[2] * halfpi)
  p.resetJointState(quadruped, knee_back_leftL_link, motordir[2] * kneeangle)
  p.resetJointState(quadruped, motor_back_leftR_joint, motordir[3] * halfpi)
  p.resetJointState(quadruped, knee_back_leftR_link, motordir[3] * kneeangle)

  p.resetJointState(quadruped, motor_front_rightL_joint, motordir[4] * halfpi)
  p.resetJointState(quadruped, knee_front_rightL_link, motordir[4] * kneeangle)
  p.resetJointState(quadruped, motor_front_rightR_joint, motordir[5] * halfpi)
  p.resetJointState(quadruped, knee_front_rightR_link, motordir[5] * kneeangle)

  p.resetJointState(quadruped, motor_back_rightL_joint, motordir[6] * halfpi)
  p.resetJointState(quadruped, knee_back_rightL_link, motordir[6] * kneeangle)
  p.resetJointState(quadruped, motor_back_rightR_joint, motordir[7] * halfpi)
  p.resetJointState(quadruped, knee_back_rightR_link, motordir[7] * kneeangle)

#p.getNumJoints(1)

if (toeConstraint):
  cid = p.createConstraint(quadruped, knee_front_leftR_link, quadruped, knee_front_leftL_link,
                           p.JOINT_POINT2POINT, [0, 0, 0], [0, 0.005, 0.1], [0, 0.01, 0.1])
  p.changeConstraint(cid, maxForce=maxKneeForce)
  cid = p.createConstraint(quadruped, knee_front_rightR_link, quadruped, knee_front_rightL_link,
                           p.JOINT_POINT2POINT, [0, 0, 0], [0, 0.005, 0.1], [0, 0.01, 0.1])
  p.changeConstraint(cid, maxForce=maxKneeForce)
  cid = p.createConstraint(quadruped, knee_back_leftR_link, quadruped, knee_back_leftL_link,
                           p.JOINT_POINT2POINT, [0, 0, 0], [0, 0.005, 0.1], [0, 0.01, 0.1])
  p.changeConstraint(cid, maxForce=maxKneeForce)
  cid = p.createConstraint(quadruped, knee_back_rightR_link, quadruped, knee_back_rightL_link,
                           p.JOINT_POINT2POINT, [0, 0, 0], [0, 0.005, 0.1], [0, 0.01, 0.1])
  p.changeConstraint(cid, maxForce=maxKneeForce)

if (1):
  p.setJointMotorControl(quadruped, knee_front_leftL_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_front_leftR_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_front_rightL_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_front_rightR_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_leftL_link, p.VELOCITY_CONTROL, 0, kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_leftR_link, p.VELOCITY_CONTROL, 0, kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_leftL_link, p.VELOCITY_CONTROL, 0, kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_leftR_link, p.VELOCITY_CONTROL, 0, kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_rightL_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)
  p.setJointMotorControl(quadruped, knee_back_rightR_link, p.VELOCITY_CONTROL, 0,
                         kneeFrictionForce)

p.setGravity(0, 0, -10)

legnumbering = [
    motor_front_leftL_joint, motor_front_leftR_joint, motor_back_leftL_joint,
    motor_back_leftR_joint, motor_front_rightL_joint, motor_front_rightR_joint,
    motor_back_rightL_joint, motor_back_rightR_joint
]

for i in range(8):
  print(legnumbering[i])
#use the Minitaur leg numbering
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[0],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[0] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[1],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[1] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[2],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[2] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[3],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[3] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[4],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[4] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[5],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[5] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[6],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[6] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
p.setJointMotorControl2(bodyIndex=quadruped,
                        jointIndex=legnumbering[7],
                        controlMode=p.POSITION_CONTROL,
                        targetPosition=motordir[7] * 1.57,
                        positionGain=kp,
                        velocityGain=kd,
                        force=maxForce)
#stand still
p.setRealTimeSimulation(useRealTime)

t = 0.0
t_end = t + 15
ref_time = time.time()
while (t < t_end):
  p.setGravity(0, 0, -10)
  if (useRealTime):
    t = time.time() - ref_time
  else:
    t = t + fixedTimeStep
  if (useRealTime == 0):
    p.stepSimulation()
    time.sleep(fixedTimeStep)

print("quadruped Id = ")
print(quadruped)
p.saveWorld("quadru.py")
logId = p.startStateLogging(p.STATE_LOGGING_MINITAUR, "quadrupedLog.bin", [quadruped])

#jump
t = 0.0
t_end = t + 100
i = 0
ref_time = time.time()

while (1):
  if (useRealTime):
    t = time.time() - ref_time
  else:
    t = t + fixedTimeStep
  if (True):

    target = math.sin(t * speed) * jump_amp + 1.57
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[0],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[0] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[1],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[1] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[2],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[2] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[3],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[3] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[4],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[4] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[5],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[5] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[6],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[6] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)
    p.setJointMotorControl2(bodyIndex=quadruped,
                            jointIndex=legnumbering[7],
                            controlMode=p.POSITION_CONTROL,
                            targetPosition=motordir[7] * target,
                            positionGain=kp,
                            velocityGain=kd,
                            force=maxForce)

  if (useRealTime == 0):
    p.stepSimulation()
    time.sleep(fixedTimeStep)