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.ft_calibration_conf
as ft_conf
20 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
22 from dynamic_graph.sot_talos_balance.meta_task_joint
import MetaTaskKineJoint
24 cm_conf.CTRL_MAX = 10.0
26 robot.timeStep = robot.device.getTimeStep()
31 robot.dynamic.com.recompute(0)
32 robotDim = robot.dynamic.getDimension()
33 mass = robot.dynamic.data.mass[0]
34 h = robot.dynamic.com.value[2]
42 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
43 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
44 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
45 robot.dynamic.LF.recompute(0)
46 robot.dynamic.RF.recompute(0)
47 robot.dynamic.WT.recompute(0)
59 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
60 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
65 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
66 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
72 robot.waistMix = Mix_of_vector(
"waistMix")
73 robot.waistMix.setSignalNumber(3)
74 robot.waistMix.addSelec(1, 0, 3)
75 robot.waistMix.addSelec(2, 3, 3)
76 robot.waistMix.default.value = [0.0] * 6
77 robot.waistMix.signal(
"sin1").value = [0.0] * 3
78 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
80 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
81 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
85 robot.rhoScalar = Component_of_vector(
"rho_scalar")
86 robot.rhoScalar.setIndex(0)
87 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
91 robot.phaseScalar = Component_of_vector(
"phase_scalar")
92 robot.phaseScalar.setIndex(0)
93 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
97 wp = DummyWalkingPatternGenerator(
"dummy_wp")
99 wp.omega.value = omega
100 plug(robot.waistToMatrix.sout, wp.waist)
101 plug(robot.lfToMatrix.sout, wp.footLeft)
102 plug(robot.rfToMatrix.sout, wp.footRight)
103 plug(robot.comTrajGen.x, wp.com)
104 plug(robot.comTrajGen.dx, wp.vcom)
105 plug(robot.comTrajGen.ddx, wp.acom)
110 robot.wp.comDes.recompute(0)
111 robot.wp.dcmDes.recompute(0)
112 robot.wp.zmpDes.recompute(0)
124 rf = SimpleReferenceFrame(
"rf")
126 plug(robot.dynamic.LF, rf.footLeft)
127 plug(robot.dynamic.RF, rf.footRight)
131 stf = StateTransformation(
"stf")
133 plug(robot.rf.referenceFrame, stf.referenceFrame)
134 plug(robot.base_estimator.q, stf.q_in)
135 plug(robot.base_estimator.v, stf.v_in)
139 e2q = EulerToQuat(
"e2q")
140 plug(robot.stf.q, e2q.euler)
144 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
145 robot.rdynamic.setModel(robot.dynamic.model)
146 robot.rdynamic.setData(robot.rdynamic.model.createData())
147 plug(robot.stf.q, robot.rdynamic.position)
148 robot.rdynamic.velocity.value = [0.0] * robotDim
149 robot.rdynamic.acceleration.value = [0.0] * robotDim
152 cdc_estimator = DcmEstimator(
"cdc_estimator")
153 cdc_estimator.init(dt, robot_name)
154 plug(robot.e2q.quaternion, cdc_estimator.q)
155 plug(robot.stf.v, cdc_estimator.v)
156 robot.cdc_estimator = cdc_estimator
159 estimator = DummyDcmEstimator(
"dummy")
160 estimator.omega.value = omega
161 estimator.mass.value = 1.0
162 plug(robot.cdc_estimator.c, estimator.com)
163 plug(robot.cdc_estimator.dc, estimator.momenta)
165 robot.estimator = estimator
171 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
172 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
173 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
174 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
175 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
176 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
177 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
179 robot.zmp_estimator = zmp_estimator
184 Kp_dcm = [5.0, 5.0, 5.0]
185 Ki_dcm = [0.0, 0.0, 0.0]
188 dcm_controller = DcmController(
"dcmCtrl")
190 dcm_controller.Kp.value = Kp_dcm
191 dcm_controller.Ki.value = Ki_dcm
192 dcm_controller.decayFactor.value = gamma_dcm
193 dcm_controller.mass.value = mass
194 dcm_controller.omega.value = omega
196 plug(robot.cdc_estimator.c, dcm_controller.com)
197 plug(robot.estimator.dcm, dcm_controller.dcm)
199 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
200 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
202 dcm_controller.init(dt)
204 robot.dcm_control = dcm_controller
206 Ki_dcm = [1.0, 1.0, 1.0]
210 plug(robot.e2q.quaternion, distribute.q)
211 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
212 plug(robot.rhoScalar.sout, distribute.rho)
213 distribute.init(robot_name)
214 robot.distribute = distribute
226 controller = SimpleAdmittanceController(
"rightPitchAnkleController")
227 controller.Kp.value = [0.0]
229 robot.stateselecRP = Selec_of_vector(
"stateselecRP")
230 robot.stateselecRP.selec(RightPitchJoint + 6, RightPitchJoint + 7)
231 plug(robot.device.state, robot.stateselecRP.sin)
232 plug(robot.stateselecRP.sout, controller.state)
234 robot.tauselecRP = Selec_of_vector(
"tauselecRP")
235 robot.tauselecRP.selec(RightPitchJoint, RightPitchJoint + 1)
236 plug(robot.device.ptorque, robot.tauselecRP.sin)
237 plug(robot.tauselecRP.sout, controller.tau)
239 robot.rightPitchSelec = Selec_of_vector(
"rightPitchSelec")
240 robot.rightPitchSelec.selec(4, 5)
241 plug(robot.distribute.ankleWrenchRight, robot.rightPitchSelec.sin)
243 robot.multRP = Multiply_double_vector(
"multRP")
244 robot.multRP.sin1.value = -1.0
245 plug(robot.rightPitchSelec.sout, robot.multRP.sin2)
246 plug(robot.multRP.sout, controller.tauDes)
249 controller.init(dt, 1)
250 controller.setPosition([robot.device.state.value[RightPitchJoint + 6]])
251 robot.rightPitchAnkleController = controller
253 robot.rightAnklePitchTask = MetaTaskKineJoint(robot.dynamic, RightPitchJoint + 6)
254 robot.rightAnklePitchTask.task.controlGain.value = 0
255 robot.rightAnklePitchTask.task.setWithDerivative(
True)
256 plug(robot.rightPitchAnkleController.qRef, robot.rightAnklePitchTask.featureDes.errorIN)
258 robot.rightPitchAnkleController.dqRef,
259 robot.rightAnklePitchTask.featureDes.errordotIN,
263 controller = SimpleAdmittanceController(
"rightRollAnkleController")
264 controller.Kp.value = [0.0]
266 robot.stateselecRR = Selec_of_vector(
"stateselecRR")
267 robot.stateselecRR.selec(RightRollJoint + 6, RightRollJoint + 7)
268 plug(robot.device.state, robot.stateselecRR.sin)
269 plug(robot.stateselecRR.sout, controller.state)
271 robot.tauselecRR = Selec_of_vector(
"tauselecRR")
272 robot.tauselecRR.selec(RightRollJoint, RightRollJoint + 1)
273 plug(robot.device.ptorque, robot.tauselecRR.sin)
274 plug(robot.tauselecRR.sout, controller.tau)
276 robot.rightRollSelec = Selec_of_vector(
"rightRollSelec")
277 robot.rightRollSelec.selec(3, 4)
278 plug(robot.distribute.ankleWrenchRight, robot.rightRollSelec.sin)
280 robot.multRR = Multiply_double_vector(
"multRR")
281 robot.multRR.sin1.value = -1.0
282 plug(robot.rightRollSelec.sout, robot.multRR.sin2)
283 plug(robot.multRR.sout, controller.tauDes)
286 controller.init(dt, 1)
287 controller.setPosition([robot.device.state.value[RightRollJoint + 6]])
288 robot.rightRollAnkleController = controller
290 robot.rightAnkleRollTask = MetaTaskKineJoint(robot.dynamic, RightRollJoint + 6)
291 robot.rightAnkleRollTask.task.controlGain.value = 0
292 robot.rightAnkleRollTask.task.setWithDerivative(
True)
293 plug(robot.rightRollAnkleController.qRef, robot.rightAnkleRollTask.featureDes.errorIN)
295 robot.rightRollAnkleController.dqRef, robot.rightAnkleRollTask.featureDes.errordotIN
300 robot.cm.addCtrlMode(
"sot_input")
301 robot.cm.setCtrlMode(
"all",
"sot_input")
302 robot.cm.addEmergencyStopSIN(
"zmp")
303 robot.cm.addEmergencyStopSIN(
"distribute")
308 robot.taskUpperBody = Task(
"task_upper_body")
309 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
311 q = list(robot.dynamic.position.value)
312 robot.taskUpperBody.feature.state.value = q
313 robot.taskUpperBody.feature.posture.value = q
316 robot.taskUpperBody.feature.selectDof(18,
True)
317 robot.taskUpperBody.feature.selectDof(19,
True)
318 robot.taskUpperBody.feature.selectDof(20,
True)
319 robot.taskUpperBody.feature.selectDof(21,
True)
320 robot.taskUpperBody.feature.selectDof(22,
True)
321 robot.taskUpperBody.feature.selectDof(23,
True)
322 robot.taskUpperBody.feature.selectDof(24,
True)
323 robot.taskUpperBody.feature.selectDof(25,
True)
324 robot.taskUpperBody.feature.selectDof(26,
True)
325 robot.taskUpperBody.feature.selectDof(27,
True)
326 robot.taskUpperBody.feature.selectDof(28,
True)
327 robot.taskUpperBody.feature.selectDof(29,
True)
328 robot.taskUpperBody.feature.selectDof(30,
True)
329 robot.taskUpperBody.feature.selectDof(31,
True)
330 robot.taskUpperBody.feature.selectDof(32,
True)
331 robot.taskUpperBody.feature.selectDof(33,
True)
332 robot.taskUpperBody.feature.selectDof(34,
True)
333 robot.taskUpperBody.feature.selectDof(35,
True)
334 robot.taskUpperBody.feature.selectDof(36,
True)
335 robot.taskUpperBody.feature.selectDof(37,
True)
337 robot.taskUpperBody.controlGain.value = 100.0
338 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
339 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
343 robot.contactLF = MetaTaskKine6d(
344 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
346 robot.contactLF.feature.frame(
"desired")
347 robot.contactLF.gain.setConstant(300)
348 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
349 locals()[
"contactLF"] = robot.contactLF
351 robot.contactRF = MetaTaskKine6d(
352 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
354 robot.contactRF.feature.frame(
"desired")
355 robot.contactRF.gain.setConstant(300)
356 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
358 locals()[
"contactRF"] = robot.contactRF
361 robot.taskCom = MetaTaskKineCom(robot.dynamic)
362 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
363 robot.taskCom.task.controlGain.value = 10
364 robot.taskCom.feature.selec.value =
"100"
367 robot.keepWaist = MetaTaskKine6d(
368 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
370 robot.keepWaist.feature.frame(
"desired")
371 robot.keepWaist.gain.setConstant(300)
372 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
373 robot.keepWaist.feature.selec.value =
"111000"
374 locals()[
"keepWaist"] = robot.keepWaist
377 robot.sot = SOT(
"sot")
378 robot.sot.setSize(robot.dynamic.getDimension())
381 plug(robot.sot.control, robot.cm.ctrl_sot_input)
382 plug(robot.cm.u_safe, robot.device.control)
384 robot.sot.push(robot.taskUpperBody.name)
385 robot.sot.push(robot.contactRF.task.name)
386 robot.sot.push(robot.contactLF.task.name)
387 robot.sot.push(robot.taskCom.task.name)
388 robot.sot.push(robot.rightAnklePitchTask.task.name)
389 robot.sot.push(robot.rightAnkleRollTask.task.name)
390 robot.sot.push(robot.keepWaist.task.name)
393 plug(robot.device.velocity, robot.dynamic.velocity)
394 robot.dvdt = Derivator_of_Vector(
"dv_dt")
395 robot.dvdt.dt.value = dt
396 plug(robot.device.velocity, robot.dvdt.sin)
397 plug(robot.dvdt.sout, robot.dynamic.acceleration)
405 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
409 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
412 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
416 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
420 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
423 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
427 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
430 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
433 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
436 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
440 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
443 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
446 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
449 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
459 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
462 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
467 robot.rightPitchAnkleController,
474 robot.rightPitchAnkleController,
481 robot.rightPitchAnkleController,
488 robot.rightPitchAnkleController,
496 robot.rightRollAnkleController,
503 robot.rightRollAnkleController,
510 robot.rightRollAnkleController,
517 robot.rightRollAnkleController,