5 from dynamic_graph
import plug
6 from dynamic_graph.sot.core
import SOT, Derivator_of_Vector, FeaturePosture, Task
7 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
8 from dynamic_graph.sot.core.meta_tasks_kine
import (
13 from dynamic_graph.sot.core.operator
import Multiply_double_vector
14 from dynamic_graph.sot.dynamic_pinocchio
import DynamicPinocchio
15 from dynamic_graph.tracer_real_time
import TracerRealTime
17 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
18 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
19 import dynamic_graph.sot_talos_balance.talos.distribute_conf
as distribute_conf
20 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
21 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
23 from dynamic_graph.sot_talos_balance.meta_task_joint
import MetaTaskKineJoint
25 cm_conf.CTRL_MAX = 1000.0
27 robot.timeStep = robot.device.getTimeStep()
32 robot.dynamic.com.recompute(0)
33 robotDim = robot.dynamic.getDimension()
34 mass = robot.dynamic.data.mass[0]
35 h = robot.dynamic.com.value[2]
43 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
44 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
45 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
46 robot.dynamic.LF.recompute(0)
47 robot.dynamic.RF.recompute(0)
48 robot.dynamic.WT.recompute(0)
60 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
61 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
66 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
67 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
73 robot.waistMix = Mix_of_vector(
"waistMix")
74 robot.waistMix.setSignalNumber(3)
75 robot.waistMix.addSelec(1, 0, 3)
76 robot.waistMix.addSelec(2, 3, 3)
77 robot.waistMix.default.value = [0.0] * 6
78 robot.waistMix.signal(
"sin1").value = [0.0] * 3
79 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
81 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
82 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
86 robot.rhoScalar = Component_of_vector(
"rho_scalar")
87 robot.rhoScalar.setIndex(0)
88 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
92 robot.phaseScalar = Component_of_vector(
"phase_scalar")
93 robot.phaseScalar.setIndex(0)
94 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
98 wp = DummyWalkingPatternGenerator(
"dummy_wp")
100 wp.omega.value = omega
101 plug(robot.waistToMatrix.sout, wp.waist)
102 plug(robot.lfToMatrix.sout, wp.footLeft)
103 plug(robot.rfToMatrix.sout, wp.footRight)
104 plug(robot.comTrajGen.x, wp.com)
105 plug(robot.comTrajGen.dx, wp.vcom)
106 plug(robot.comTrajGen.ddx, wp.acom)
111 robot.wp.comDes.recompute(0)
112 robot.wp.dcmDes.recompute(0)
113 robot.wp.zmpDes.recompute(0)
125 rf = SimpleReferenceFrame(
"rf")
127 plug(robot.dynamic.LF, rf.footLeft)
128 plug(robot.dynamic.RF, rf.footRight)
132 stf = StateTransformation(
"stf")
134 plug(robot.rf.referenceFrame, stf.referenceFrame)
135 plug(robot.base_estimator.q, stf.q_in)
136 plug(robot.base_estimator.v, stf.v_in)
140 e2q = EulerToQuat(
"e2q")
141 plug(robot.stf.q, e2q.euler)
145 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
146 robot.rdynamic.setModel(robot.dynamic.model)
147 robot.rdynamic.setData(robot.rdynamic.model.createData())
148 plug(robot.stf.q, robot.rdynamic.position)
149 robot.rdynamic.velocity.value = [0.0] * robotDim
150 robot.rdynamic.acceleration.value = [0.0] * robotDim
153 cdc_estimator = DcmEstimator(
"cdc_estimator")
154 cdc_estimator.init(dt, robot_name)
155 plug(robot.e2q.quaternion, cdc_estimator.q)
156 plug(robot.stf.v, cdc_estimator.v)
157 robot.cdc_estimator = cdc_estimator
160 estimator = DummyDcmEstimator(
"dummy")
161 estimator.omega.value = omega
162 estimator.mass.value = 1.0
163 plug(robot.cdc_estimator.c, estimator.com)
164 plug(robot.cdc_estimator.dc, estimator.momenta)
166 robot.estimator = estimator
172 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
173 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
174 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
175 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
176 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
177 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
178 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
180 robot.zmp_estimator = zmp_estimator
185 Kp_dcm = [5.0, 5.0, 5.0]
186 Ki_dcm = [0.0, 0.0, 0.0]
189 dcm_controller = DcmController(
"dcmCtrl")
191 dcm_controller.Kp.value = Kp_dcm
192 dcm_controller.Ki.value = Ki_dcm
193 dcm_controller.decayFactor.value = gamma_dcm
194 dcm_controller.mass.value = mass
195 dcm_controller.omega.value = omega
197 plug(robot.cdc_estimator.c, dcm_controller.com)
198 plug(robot.estimator.dcm, dcm_controller.dcm)
200 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
201 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
203 dcm_controller.init(dt)
205 robot.dcm_control = dcm_controller
207 Ki_dcm = [1.0, 1.0, 1.0]
211 plug(robot.e2q.quaternion, distribute.q)
212 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
213 plug(robot.rhoScalar.sout, distribute.rho)
214 distribute.init(robot_name)
215 robot.distribute = distribute
227 controller = SimpleAdmittanceController(
"rightPitchAnkleController")
228 controller.Kp.value = [0.0]
230 robot.stateselecRP = Selec_of_vector(
"stateselecRP")
231 robot.stateselecRP.selec(RightPitchJoint + 6, RightPitchJoint + 7)
232 plug(robot.device.state, robot.stateselecRP.sin)
233 plug(robot.stateselecRP.sout, controller.state)
235 robot.tauselecRP = Selec_of_vector(
"tauselecRP")
236 robot.tauselecRP.selec(RightPitchJoint, RightPitchJoint + 1)
237 plug(robot.device.ptorque, robot.tauselecRP.sin)
238 plug(robot.tauselecRP.sout, controller.tau)
240 robot.rightPitchSelec = Selec_of_vector(
"rightPitchSelec")
241 robot.rightPitchSelec.selec(4, 5)
242 plug(robot.distribute.ankleWrenchRight, robot.rightPitchSelec.sin)
244 robot.multRP = Multiply_double_vector(
"multRP")
245 robot.multRP.sin1.value = -1.0
246 plug(robot.rightPitchSelec.sout, robot.multRP.sin2)
247 plug(robot.multRP.sout, controller.tauDes)
250 controller.init(dt, 1)
251 controller.setPosition([robot.device.state.value[RightPitchJoint + 6]])
252 robot.rightPitchAnkleController = controller
254 robot.rightAnklePitchTask = MetaTaskKineJoint(robot.dynamic, RightPitchJoint + 6)
255 robot.rightAnklePitchTask.task.controlGain.value = 0
256 robot.rightAnklePitchTask.task.setWithDerivative(
True)
257 plug(robot.rightPitchAnkleController.qRef, robot.rightAnklePitchTask.featureDes.errorIN)
259 robot.rightPitchAnkleController.dqRef,
260 robot.rightAnklePitchTask.featureDes.errordotIN,
264 controller = SimpleAdmittanceController(
"rightRollAnkleController")
265 controller.Kp.value = [0.0]
267 robot.stateselecRR = Selec_of_vector(
"stateselecRR")
268 robot.stateselecRR.selec(RightRollJoint + 6, RightRollJoint + 7)
269 plug(robot.device.state, robot.stateselecRR.sin)
270 plug(robot.stateselecRR.sout, controller.state)
272 robot.tauselecRR = Selec_of_vector(
"tauselecRR")
273 robot.tauselecRR.selec(RightRollJoint, RightRollJoint + 1)
274 plug(robot.device.ptorque, robot.tauselecRR.sin)
275 plug(robot.tauselecRR.sout, controller.tau)
277 robot.rightRollSelec = Selec_of_vector(
"rightRollSelec")
278 robot.rightRollSelec.selec(3, 4)
279 plug(robot.distribute.ankleWrenchRight, robot.rightRollSelec.sin)
281 robot.multRR = Multiply_double_vector(
"multRR")
282 robot.multRR.sin1.value = -1.0
283 plug(robot.rightRollSelec.sout, robot.multRR.sin2)
284 plug(robot.multRR.sout, controller.tauDes)
287 controller.init(dt, 1)
288 controller.setPosition([robot.device.state.value[RightRollJoint + 6]])
289 robot.rightRollAnkleController = controller
291 robot.rightAnkleRollTask = MetaTaskKineJoint(robot.dynamic, RightRollJoint + 6)
292 robot.rightAnkleRollTask.task.controlGain.value = 0
293 robot.rightAnkleRollTask.task.setWithDerivative(
True)
294 plug(robot.rightRollAnkleController.qRef, robot.rightAnkleRollTask.featureDes.errorIN)
296 robot.rightRollAnkleController.dqRef, robot.rightAnkleRollTask.featureDes.errordotIN
300 controller = SimpleAdmittanceController(
"leftPitchAnkleController")
301 controller.Kp.value = [0.0]
303 robot.stateselecLP = Selec_of_vector(
"stateselecLP")
304 robot.stateselecLP.selec(LeftPitchJoint + 6, LeftPitchJoint + 7)
305 plug(robot.device.state, robot.stateselecLP.sin)
306 plug(robot.stateselecLP.sout, controller.state)
308 robot.tauselecLP = Selec_of_vector(
"tauselecLP")
309 robot.tauselecLP.selec(LeftPitchJoint, LeftPitchJoint + 1)
310 plug(robot.device.ptorque, robot.tauselecLP.sin)
311 plug(robot.tauselecLP.sout, controller.tau)
313 robot.leftPitchSelec = Selec_of_vector(
"leftPitchSelec")
314 robot.leftPitchSelec.selec(4, 5)
315 plug(robot.distribute.ankleWrenchLeft, robot.leftPitchSelec.sin)
317 robot.multLP = Multiply_double_vector(
"multLP")
318 robot.multLP.sin1.value = -1.0
319 plug(robot.leftPitchSelec.sout, robot.multLP.sin2)
320 plug(robot.multLP.sout, controller.tauDes)
323 controller.init(dt, 1)
324 controller.setPosition([robot.device.state.value[LeftPitchJoint + 6]])
325 robot.leftPitchAnkleController = controller
327 robot.leftAnklePitchTask = MetaTaskKineJoint(robot.dynamic, LeftPitchJoint + 6)
328 robot.leftAnklePitchTask.task.controlGain.value = 0
329 robot.leftAnklePitchTask.task.setWithDerivative(
True)
330 plug(robot.leftPitchAnkleController.qRef, robot.leftAnklePitchTask.featureDes.errorIN)
332 robot.leftPitchAnkleController.dqRef, robot.leftAnklePitchTask.featureDes.errordotIN
336 controller = SimpleAdmittanceController(
"leftRollAnkleController")
337 controller.Kp.value = [0.0]
339 robot.stateselecLR = Selec_of_vector(
"stateselecLR")
340 robot.stateselecLR.selec(LeftRollJoint + 6, LeftRollJoint + 7)
341 plug(robot.device.state, robot.stateselecLR.sin)
342 plug(robot.stateselecLR.sout, controller.state)
344 robot.tauselecLR = Selec_of_vector(
"tauselecLR")
345 robot.tauselecLR.selec(LeftRollJoint, LeftRollJoint + 1)
346 plug(robot.device.ptorque, robot.tauselecLR.sin)
347 plug(robot.tauselecLR.sout, controller.tau)
349 robot.leftRollSelec = Selec_of_vector(
"leftRollSelec")
350 robot.leftRollSelec.selec(3, 4)
351 plug(robot.distribute.ankleWrenchLeft, robot.leftRollSelec.sin)
353 robot.multLR = Multiply_double_vector(
"multLR")
354 robot.multLR.sin1.value = -1.0
355 plug(robot.leftRollSelec.sout, robot.multLR.sin2)
356 plug(robot.multLR.sout, controller.tauDes)
359 controller.init(dt, 1)
360 controller.setPosition([robot.device.state.value[LeftRollJoint + 6]])
361 robot.leftRollAnkleController = controller
363 robot.leftAnkleRollTask = MetaTaskKineJoint(robot.dynamic, LeftRollJoint + 6)
364 robot.leftAnkleRollTask.task.controlGain.value = 0
365 robot.leftAnkleRollTask.task.setWithDerivative(
True)
366 plug(robot.leftRollAnkleController.qRef, robot.leftAnkleRollTask.featureDes.errorIN)
367 plug(robot.leftRollAnkleController.dqRef, robot.leftAnkleRollTask.featureDes.errordotIN)
371 robot.cm.addCtrlMode(
"sot_input")
372 robot.cm.setCtrlMode(
"all",
"sot_input")
373 robot.cm.addEmergencyStopSIN(
"zmp")
374 robot.cm.addEmergencyStopSIN(
"distribute")
379 robot.taskUpperBody = Task(
"task_upper_body")
380 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
382 q = list(robot.dynamic.position.value)
383 robot.taskUpperBody.feature.state.value = q
384 robot.taskUpperBody.feature.posture.value = q
387 robot.taskUpperBody.feature.selectDof(18,
True)
388 robot.taskUpperBody.feature.selectDof(19,
True)
389 robot.taskUpperBody.feature.selectDof(20,
True)
390 robot.taskUpperBody.feature.selectDof(21,
True)
391 robot.taskUpperBody.feature.selectDof(22,
True)
392 robot.taskUpperBody.feature.selectDof(23,
True)
393 robot.taskUpperBody.feature.selectDof(24,
True)
394 robot.taskUpperBody.feature.selectDof(25,
True)
395 robot.taskUpperBody.feature.selectDof(26,
True)
396 robot.taskUpperBody.feature.selectDof(27,
True)
397 robot.taskUpperBody.feature.selectDof(28,
True)
398 robot.taskUpperBody.feature.selectDof(29,
True)
399 robot.taskUpperBody.feature.selectDof(30,
True)
400 robot.taskUpperBody.feature.selectDof(31,
True)
401 robot.taskUpperBody.feature.selectDof(32,
True)
402 robot.taskUpperBody.feature.selectDof(33,
True)
403 robot.taskUpperBody.feature.selectDof(34,
True)
404 robot.taskUpperBody.feature.selectDof(35,
True)
405 robot.taskUpperBody.feature.selectDof(36,
True)
406 robot.taskUpperBody.feature.selectDof(37,
True)
408 robot.taskUpperBody.controlGain.value = 100.0
409 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
410 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
414 robot.contactLF = MetaTaskKine6d(
415 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
417 robot.contactLF.feature.frame(
"desired")
418 robot.contactLF.gain.setConstant(300)
419 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
421 locals()[
"contactLF"] = robot.contactLF
423 robot.contactRF = MetaTaskKine6d(
424 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
426 robot.contactRF.feature.frame(
"desired")
427 robot.contactRF.gain.setConstant(300)
428 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
430 locals()[
"contactRF"] = robot.contactRF
433 robot.taskCom = MetaTaskKineCom(robot.dynamic)
434 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
435 robot.taskCom.task.controlGain.value = 10
436 robot.taskCom.feature.selec.value =
"100"
439 robot.keepWaist = MetaTaskKine6d(
440 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
442 robot.keepWaist.feature.frame(
"desired")
443 robot.keepWaist.gain.setConstant(300)
444 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
445 robot.keepWaist.feature.selec.value =
"111000"
446 locals()[
"keepWaist"] = robot.keepWaist
449 robot.sot = SOT(
"sot")
450 robot.sot.setSize(robot.dynamic.getDimension())
453 plug(robot.sot.control, robot.cm.ctrl_sot_input)
454 plug(robot.cm.u_safe, robot.device.control)
456 robot.sot.push(robot.taskUpperBody.name)
457 robot.sot.push(robot.contactRF.task.name)
458 robot.sot.push(robot.contactLF.task.name)
459 robot.sot.push(robot.taskCom.task.name)
460 robot.sot.push(robot.rightAnklePitchTask.task.name)
461 robot.sot.push(robot.rightAnkleRollTask.task.name)
462 robot.sot.push(robot.leftAnklePitchTask.task.name)
463 robot.sot.push(robot.leftAnkleRollTask.task.name)
464 robot.sot.push(robot.keepWaist.task.name)
467 plug(robot.device.velocity, robot.dynamic.velocity)
468 robot.dvdt = Derivator_of_Vector(
"dv_dt")
469 robot.dvdt.dt.value = dt
470 plug(robot.device.velocity, robot.dvdt.sin)
471 plug(robot.dvdt.sout, robot.dynamic.acceleration)
479 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
483 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
486 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
490 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
494 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
497 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
501 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
504 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
507 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
510 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
514 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
517 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
520 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
523 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
533 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
536 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
541 robot.rightPitchAnkleController,
548 robot.rightPitchAnkleController,
555 robot.rightPitchAnkleController,
562 robot.rightPitchAnkleController,
570 robot.rightRollAnkleController,
577 robot.rightRollAnkleController,
584 robot.rightRollAnkleController,
591 robot.rightRollAnkleController,
599 robot.leftPitchAnkleController,
606 robot.leftPitchAnkleController,
613 robot.leftPitchAnkleController,
620 robot.leftPitchAnkleController,
628 robot.leftRollAnkleController,
635 robot.leftRollAnkleController,
642 robot.leftRollAnkleController,
649 robot.leftRollAnkleController,