6 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
7 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
8 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
9 import dynamic_graph.sot_talos_balance.talos.hip_flexibility_compensation_conf
as hipFlexCompConfig
10 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
11 from dynamic_graph
import plug
12 from dynamic_graph.sot.core
import (
16 MatrixHomoToPoseQuaternion,
19 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
20 from dynamic_graph.sot.core.meta_tasks_kine
import (
25 from dynamic_graph.sot.dynamic_pinocchio
import DynamicPinocchio
26 from dynamic_graph.tracer_real_time
import TracerRealTime
29 cm_conf.CTRL_MAX = 10.0
31 robot.timeStep = robot.device.getTimeStep()
33 robot.device.setControlInputType(
"noInteg")
37 robot.dynamic.com.recompute(0)
38 robotDim = robot.dynamic.getDimension()
39 mass = robot.dynamic.data.mass[0]
40 h = robot.dynamic.com.value[2]
48 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
49 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
50 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
51 robot.dynamic.LF.recompute(0)
52 robot.dynamic.RF.recompute(0)
53 robot.dynamic.WT.recompute(0)
58 if test_folder
is not None:
59 if sot_talos_balance_folder:
60 from rospkg
import RosPack
64 folder = rospack.get_path(
"sot-talos-balance") +
"/data/" + test_folder
73 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
78 robot.comTrajGen.x.recompute(0)
79 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
83 robot.lfTrajGen.x.recompute(0)
85 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
86 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
87 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
91 robot.rfTrajGen.x.recompute(0)
93 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
94 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
95 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
99 robot.zmpTrajGen.x.recompute(0)
100 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
104 robot.waistTrajGen.x.recompute(0)
106 robot.waistMix = Mix_of_vector(
"waistMix")
107 robot.waistMix.setSignalNumber(3)
108 robot.waistMix.addSelec(1, 0, 3)
109 robot.waistMix.addSelec(2, 3, 3)
110 robot.waistMix.default.value = [0.0] * 6
111 robot.waistMix.signal(
"sin1").value = [0.0] * 3
112 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
114 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
115 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
116 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
120 robot.phaseTrajGen.x.recompute(0)
121 robot.phaseScalar = Component_of_vector(
"phase_scalar")
122 robot.phaseScalar.setIndex(0)
123 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
124 robot.phaseInt = RoundDoubleToInt(
"phase_int")
125 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
126 plug(robot.triggerTrajGen.sout, robot.phaseTrajGen.trigger)
130 robot.torqueTrajGen.x.recompute(0)
132 robot.torqueSelec = Selec_of_vector(
"torque_selec")
133 robot.torqueSelec.selec(6, 38)
134 plug(robot.torqueTrajGen.x, robot.torqueSelec.sin)
135 plug(robot.triggerTrajGen.sout, robot.torqueTrajGen.trigger)
142 wp = DummyWalkingPatternGenerator(
"dummy_wp")
144 wp.omega.value = omega
145 plug(robot.waistToMatrix.sout, wp.waist)
146 plug(robot.lfToMatrix.sout, wp.footLeft)
147 plug(robot.rfToMatrix.sout, wp.footRight)
148 plug(robot.comTrajGen.x, wp.com)
149 plug(robot.comTrajGen.dx, wp.vcom)
150 plug(robot.comTrajGen.ddx, wp.acom)
157 robot.wp.comDes.recompute(0)
158 robot.wp.dcmDes.recompute(0)
159 robot.wp.zmpDes.recompute(0)
168 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
169 plug(robot.dynamic.LF, robot.m2qLF.sin)
170 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
171 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
172 plug(robot.dynamic.RF, robot.m2qRF.sin)
173 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
178 e2q = EulerToQuat(
"e2q")
179 plug(robot.base_estimator.q, e2q.euler)
183 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
184 robot.rdynamic.setModel(robot.dynamic.model)
185 robot.rdynamic.setData(robot.rdynamic.model.createData())
186 plug(robot.base_estimator.q, robot.rdynamic.position)
187 robot.rdynamic.velocity.value = [0.0] * robotDim
188 robot.rdynamic.acceleration.value = [0.0] * robotDim
191 cdc_estimator = DcmEstimator(
"cdc_estimator")
192 cdc_estimator.init(dt, robot_name)
193 plug(robot.e2q.quaternion, cdc_estimator.q)
194 plug(robot.base_estimator.v, cdc_estimator.v)
195 robot.cdc_estimator = cdc_estimator
198 estimator = DummyDcmEstimator(
"dummy")
199 plug(robot.wp.omegaDes, estimator.omega)
200 estimator.mass.value = 1.0
201 plug(robot.cdc_estimator.c, estimator.com)
202 plug(robot.cdc_estimator.dc, estimator.momenta)
204 robot.estimator = estimator
210 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
211 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
212 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
213 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
214 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
215 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
216 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
218 robot.zmp_estimator = zmp_estimator
224 Ki_dcm = [0.0, 0.0, 0.0]
228 dcm_controller = DcmController(
"dcmCtrl")
230 dcm_controller.Kp.value = Kp_dcm
231 dcm_controller.Ki.value = Ki_dcm
232 dcm_controller.Kz.value = Kz_dcm
233 dcm_controller.decayFactor.value = gamma_dcm
234 dcm_controller.mass.value = mass
235 plug(robot.wp.omegaDes, dcm_controller.omega)
237 plug(robot.cdc_estimator.c, dcm_controller.com)
238 plug(robot.estimator.dcm, dcm_controller.dcm)
240 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
241 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
243 plug(robot.zmp_estimator.zmp, dcm_controller.zmp)
245 dcm_controller.init(dt)
247 robot.dcm_control = dcm_controller
249 Ki_dcm = [1.0, 1.0, 1.0]
251 Kz_dcm = [0.0, 0.0, 0.0]
254 Kp_adm = [0.0, 0.0, 0.0]
256 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
257 com_admittance_control.Kp.value = Kp_adm
258 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
259 com_admittance_control.zmpDes.value = (
260 robot.wp.zmpDes.value
262 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
264 com_admittance_control.init(dt)
265 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
267 robot.com_admittance_control = com_admittance_control
269 Kp_adm = [15.0, 15.0, 0.0]
273 robot.cm.addCtrlMode(
"sot_input")
274 robot.cm.setCtrlMode(
"all",
"sot_input")
275 robot.cm.addEmergencyStopSIN(
"zmp")
280 robot.taskUpperBody = Task(
"task_upper_body")
281 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
283 q = list(robot.dynamic.position.value)
284 robot.taskUpperBody.feature.state.value = q
285 robot.taskUpperBody.feature.posture.value = q
287 robotDim = robot.dynamic.getDimension()
288 for i
in range(18, robotDim):
289 robot.taskUpperBody.feature.selectDof(i,
True)
291 robot.taskUpperBody.controlGain.value = 100.0
292 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
293 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
297 robot.contactLF = MetaTaskKine6d(
298 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
300 robot.contactLF.feature.frame(
"desired")
301 robot.contactLF.gain.setConstant(300)
302 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
303 locals()[
"contactLF"] = robot.contactLF
305 robot.contactRF = MetaTaskKine6d(
306 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
308 robot.contactRF.feature.frame(
"desired")
309 robot.contactRF.gain.setConstant(300)
310 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
311 locals()[
"contactRF"] = robot.contactRF
314 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
315 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
316 robot.taskComH.task.controlGain.value = 100.0
317 robot.taskComH.feature.selec.value =
"100"
320 robot.taskCom = MetaTaskKineCom(robot.dynamic)
321 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
322 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
323 robot.taskCom.task.controlGain.value = 100.0
324 robot.taskCom.task.setWithDerivative(
True)
325 robot.taskCom.feature.selec.value =
"011"
328 robot.keepWaist = MetaTaskKine6d(
329 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
331 robot.keepWaist.feature.frame(
"desired")
332 robot.keepWaist.gain.setConstant(300)
333 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
334 robot.keepWaist.feature.selec.value =
"111000"
335 locals()[
"keepWaist"] = robot.keepWaist
338 robot.sot = SOT(
"sot")
339 robot.sot.setSize(robot.dynamic.getDimension())
342 robot.integrate = SimpleStateIntegrator(
"integrate")
343 robot.integrate.init(dt)
344 robot.integrate.setState(robot.device.state.value)
345 robot.integrate.setVelocity(robot.dynamic.getDimension() * [0.0])
350 robot, hipFlexCompConfig, robot_name
352 plug(robot.torqueSelec.sout, robot.hipComp.tau)
353 plug(robot.phaseInt.sout, robot.hipComp.phase)
355 robot.hipComp.K_l.value = float(
"inf")
356 robot.hipComp.K_r.value = float(
"inf")
359 plug(robot.sot.control, robot.cm.ctrl_sot_input)
360 plug(robot.cm.u_safe, robot.integrate.control)
361 plug(robot.integrate.state, robot.hipComp.q_des)
362 plug(robot.hipComp.q_cmd, robot.device.control)
364 robot.sot.push(robot.taskUpperBody.name)
365 robot.sot.push(robot.contactRF.task.name)
366 robot.sot.push(robot.contactLF.task.name)
367 robot.sot.push(robot.taskComH.task.name)
368 robot.sot.push(robot.taskCom.task.name)
369 robot.sot.push(robot.keepWaist.task.name)
375 robot.delay_pos.setMemory(robot.device.state.value)
376 robot.device.before.addSignal(robot.delay_pos.name +
".current")
377 plug(robot.integrate.state, robot.delay_pos.sin)
380 robot.delay_vel.setMemory(robot.dynamic.getDimension() * [0.0])
381 robot.device.before.addSignal(robot.delay_vel.name +
".current")
382 plug(robot.cm.u_safe, robot.delay_vel.sin)
385 plug(robot.delay_pos.previous, robot.pselec.sin)
386 plug(robot.pselec.sout, robot.base_estimator.joint_positions)
387 plug(robot.delay_vel.previous, robot.vselec.sin)
390 plug(robot.delay_pos.previous, robot.dynamic.position)
391 plug(robot.delay_vel.previous, robot.dynamic.velocity)
392 robot.dvdt = Derivator_of_Vector(
"dv_dt")
393 robot.dvdt.dt.value = dt
394 plug(robot.delay_vel.previous, robot.dvdt.sin)
395 plug(robot.dvdt.sout, robot.dynamic.acceleration)
402 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
404 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
409 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
412 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
415 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
419 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
423 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
426 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
431 robot.com_admittance_control,
437 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
441 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
444 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
448 robot.publisher, robot.zmpTrajGen,
"x", robot=robot, data_type=
"vector"
451 robot.publisher, robot.wp,
"zmpDes", robot=robot, data_type=
"vector"
454 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
457 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
460 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
470 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
474 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
477 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
481 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
484 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
488 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
491 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"
494 create_topic(robot.publisher, robot.hipComp,
"delta_q", robot=robot, data_type=
"vector")
495 create_topic(robot.publisher, robot.hipComp,
"q_cmd", robot=robot, data_type=
"vector")
496 create_topic(robot.publisher, robot.hipComp,
"q_des", robot=robot, data_type=
"vector")
497 create_topic(robot.publisher, robot.hipComp,
"tau", robot=robot, data_type=
"vector")
499 robot.publisher, robot.hipComp,
"tau_filt", robot=robot, data_type=
"vector"
503 robot.tracer = TracerRealTime(
"com_tracer")
504 robot.tracer.setBufferSize(80 * (2**20))
505 robot.tracer.open(
"/tmp",
"dg_",
".dat")
506 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
508 addTrace(robot.tracer, robot.wp,
"comDes")
510 addTrace(robot.tracer, robot.cdc_estimator,
"c")
513 addTrace(robot.tracer, robot.com_admittance_control,
"comRef")
514 addTrace(robot.tracer, robot.dynamic,
"com")
521 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
522 addTrace(robot.tracer, robot.dcm_control,
"zmpRef")