5 from dynamic_graph
import plug
6 from dynamic_graph.sot.core
import (
10 MatrixHomoToPoseQuaternion,
13 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
14 from dynamic_graph.sot.core.meta_tasks_kine
import (
19 from dynamic_graph.sot.dynamic_pinocchio
import DynamicPinocchio
20 from dynamic_graph.tracer_real_time
import TracerRealTime
22 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
23 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
24 import dynamic_graph.sot_talos_balance.talos.distribute_conf
as distribute_conf
25 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
26 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
28 from dynamic_graph.sot_talos_balance.round_double_to_int
import RoundDoubleToInt
30 robot.timeStep = robot.device.getTimeStep()
35 robot.dynamic.com.recompute(0)
36 robotDim = robot.dynamic.getDimension()
37 mass = robot.dynamic.data.mass[0]
38 h = robot.dynamic.com.value[2]
46 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
47 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
48 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
49 robot.dynamic.LF.recompute(0)
50 robot.dynamic.RF.recompute(0)
51 robot.dynamic.WT.recompute(0)
63 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
64 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
69 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
70 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
76 robot.waistMix = Mix_of_vector(
"waistMix")
77 robot.waistMix.setSignalNumber(3)
78 robot.waistMix.addSelec(1, 0, 3)
79 robot.waistMix.addSelec(2, 3, 3)
80 robot.waistMix.default.value = [0.0] * 6
81 robot.waistMix.signal(
"sin1").value = [0.0] * 3
82 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
84 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
85 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
89 robot.rhoScalar = Component_of_vector(
"rho_scalar")
90 robot.rhoScalar.setIndex(0)
91 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
95 robot.phaseScalar = Component_of_vector(
"phase_scalar")
96 robot.phaseScalar.setIndex(0)
97 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
98 robot.phaseInt = RoundDoubleToInt(
"phase_int")
99 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
103 wp = DummyWalkingPatternGenerator(
"dummy_wp")
105 wp.omega.value = omega
106 plug(robot.rhoScalar.sout, wp.rho)
107 plug(robot.phaseInt.sout, wp.phase)
108 plug(robot.waistToMatrix.sout, wp.waist)
109 plug(robot.lfToMatrix.sout, wp.footLeft)
110 plug(robot.rfToMatrix.sout, wp.footRight)
111 plug(robot.comTrajGen.x, wp.com)
112 plug(robot.comTrajGen.dx, wp.vcom)
113 plug(robot.comTrajGen.ddx, wp.acom)
118 robot.wp.comDes.recompute(0)
119 robot.wp.dcmDes.recompute(0)
120 robot.wp.zmpDes.recompute(0)
129 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
130 plug(robot.dynamic.LF, robot.m2qLF.sin)
131 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
132 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
133 plug(robot.dynamic.RF, robot.m2qRF.sin)
134 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
156 e2q = EulerToQuat(
"e2q")
157 plug(robot.base_estimator.q, e2q.euler)
161 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
162 robot.rdynamic.setModel(robot.dynamic.model)
163 robot.rdynamic.setData(robot.rdynamic.model.createData())
164 plug(robot.base_estimator.q, robot.rdynamic.position)
165 robot.rdynamic.velocity.value = [0.0] * robotDim
166 robot.rdynamic.acceleration.value = [0.0] * robotDim
169 cdc_estimator = DcmEstimator(
"cdc_estimator")
170 cdc_estimator.init(dt, robot_name)
171 plug(robot.e2q.quaternion, cdc_estimator.q)
172 plug(robot.base_estimator.v, cdc_estimator.v)
173 robot.cdc_estimator = cdc_estimator
176 estimator = DummyDcmEstimator(
"dummy")
177 plug(robot.wp.omegaDes, estimator.omega)
178 estimator.mass.value = 1.0
179 plug(robot.cdc_estimator.c, estimator.com)
180 plug(robot.cdc_estimator.dc, estimator.momenta)
182 robot.estimator = estimator
188 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
189 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
190 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
191 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
192 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
193 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
194 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
196 robot.zmp_estimator = zmp_estimator
201 Kp_dcm = [5.0, 5.0, 5.0]
202 Ki_dcm = [0.0, 0.0, 0.0]
205 dcm_controller = DcmController(
"dcmCtrl")
207 dcm_controller.Kp.value = Kp_dcm
208 dcm_controller.Ki.value = Ki_dcm
209 dcm_controller.decayFactor.value = gamma_dcm
210 dcm_controller.mass.value = mass
211 plug(robot.wp.omegaDes, dcm_controller.omega)
213 plug(robot.cdc_estimator.c, dcm_controller.com)
214 plug(robot.estimator.dcm, dcm_controller.dcm)
216 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
217 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
219 dcm_controller.init(dt)
221 robot.dcm_control = dcm_controller
223 Ki_dcm = [1.0, 1.0, 1.0]
227 plug(robot.e2q.quaternion, distribute.q)
228 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
229 plug(robot.wp.rhoDes, distribute.rho)
230 plug(robot.wp.phaseDes, distribute.phase)
231 distribute.init(robot_name)
232 robot.distribute = distribute
235 Kp_adm = [0.0, 0.0, 0.0]
237 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
238 com_admittance_control.Kp.value = Kp_adm
239 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
240 com_admittance_control.zmpDes.value = (
241 robot.wp.zmpDes.value
243 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
245 com_admittance_control.init(dt)
246 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
248 robot.com_admittance_control = com_admittance_control
250 Kp_adm = [20.0, 10.0, 0.0]
254 robot.cm.addCtrlMode(
"sot_input")
255 robot.cm.setCtrlMode(
"all",
"sot_input")
256 robot.cm.addEmergencyStopSIN(
"zmp")
257 robot.cm.addEmergencyStopSIN(
"distribute")
262 robot.taskUpperBody = Task(
"task_upper_body")
263 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
265 q = list(robot.dynamic.position.value)
266 robot.taskUpperBody.feature.state.value = q
267 robot.taskUpperBody.feature.posture.value = q
270 robot.taskUpperBody.feature.selectDof(18,
True)
271 robot.taskUpperBody.feature.selectDof(19,
True)
272 robot.taskUpperBody.feature.selectDof(20,
True)
273 robot.taskUpperBody.feature.selectDof(21,
True)
274 robot.taskUpperBody.feature.selectDof(22,
True)
275 robot.taskUpperBody.feature.selectDof(23,
True)
276 robot.taskUpperBody.feature.selectDof(24,
True)
277 robot.taskUpperBody.feature.selectDof(25,
True)
278 robot.taskUpperBody.feature.selectDof(26,
True)
279 robot.taskUpperBody.feature.selectDof(27,
True)
280 robot.taskUpperBody.feature.selectDof(28,
True)
281 robot.taskUpperBody.feature.selectDof(29,
True)
282 robot.taskUpperBody.feature.selectDof(30,
True)
283 robot.taskUpperBody.feature.selectDof(31,
True)
284 robot.taskUpperBody.feature.selectDof(32,
True)
285 robot.taskUpperBody.feature.selectDof(33,
True)
286 robot.taskUpperBody.feature.selectDof(34,
True)
287 robot.taskUpperBody.feature.selectDof(35,
True)
288 robot.taskUpperBody.feature.selectDof(36,
True)
289 robot.taskUpperBody.feature.selectDof(37,
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 = 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
384 robot.sot = SOT(
"sot")
385 robot.sot.setSize(robot.dynamic.getDimension())
388 plug(robot.sot.control, robot.cm.ctrl_sot_input)
389 plug(robot.cm.u_safe, robot.device.control)
391 robot.sot.push(robot.taskUpperBody.name)
392 robot.sot.push(robot.contactRF.task.name)
393 robot.sot.push(robot.contactLF.task.name)
394 robot.sot.push(robot.taskComH.task.name)
395 robot.sot.push(robot.taskCom.task.name)
396 robot.sot.push(robot.keepWaist.task.name)
401 plug(robot.device.velocity, robot.dynamic.velocity)
402 robot.dvdt = Derivator_of_Vector(
"dv_dt")
403 robot.dvdt.dt.value = dt
404 plug(robot.device.velocity, robot.dvdt.sin)
405 plug(robot.dvdt.sout, robot.dynamic.acceleration)
412 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
414 robot.publisher, robot.base_estimator,
"q", 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.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
451 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
454 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
457 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
461 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
464 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
467 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
470 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
480 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
483 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
487 robot.tracer = TracerRealTime(
"com_tracer")
488 robot.tracer.setBufferSize(80 * (2**20))
489 robot.tracer.open(
"/tmp",
"dg_",
".dat")
490 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
492 addTrace(robot.tracer, robot.wp,
"comDes")
494 addTrace(robot.tracer, robot.cdc_estimator,
"c")
495 addTrace(robot.tracer, robot.cdc_estimator,
"dc")
497 addTrace(robot.tracer, robot.com_admittance_control,
"comRef")
498 addTrace(robot.tracer, robot.dynamic,
"com")
500 addTrace(robot.tracer, robot.dcm_control,
"dcmDes")
501 addTrace(robot.tracer, robot.estimator,
"dcm")
503 addTrace(robot.tracer, robot.dcm_control,
"zmpDes")
504 addTrace(robot.tracer, robot.dynamic,
"zmp")
505 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
506 addTrace(robot.tracer, robot.dcm_control,
"zmpRef")
508 addTrace(robot.tracer, robot.dcm_control,
"wrenchRef")
509 addTrace(robot.tracer, robot.distribute,
"wrenchLeft")
510 addTrace(robot.tracer, robot.distribute,
"wrenchRight")
511 addTrace(robot.tracer, robot.distribute,
"wrenchRef")
513 addTrace(robot.tracer, robot.ftc,
"left_foot_force_out")
514 addTrace(robot.tracer, robot.ftc,
"right_foot_force_out")