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.distribute_conf
as distribute_conf
9 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
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
28 from dynamic_graph.sot_talos_balance.foot_force_difference_controller
import (
29 FootForceDifferenceController,
31 from dynamic_graph.sot_talos_balance.round_double_to_int
import RoundDoubleToInt
32 from dynamic_graph.sot_talos_balance.simple_controller_6d
import SimpleController6d
34 cm_conf.CTRL_MAX = 1000.0
36 robot.timeStep = robot.device.getTimeStep()
41 robot.dynamic.com.recompute(0)
42 robotDim = robot.dynamic.getDimension()
43 mass = robot.dynamic.data.mass[0]
44 h = robot.dynamic.com.value[2]
52 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
53 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
54 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
55 robot.dynamic.LF.recompute(0)
56 robot.dynamic.RF.recompute(0)
57 robot.dynamic.WT.recompute(0)
69 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
70 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
75 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
76 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
82 robot.waistMix = Mix_of_vector(
"waistMix")
83 robot.waistMix.setSignalNumber(3)
84 robot.waistMix.addSelec(1, 0, 3)
85 robot.waistMix.addSelec(2, 3, 3)
86 robot.waistMix.default.value = [0.0] * 6
87 robot.waistMix.signal(
"sin1").value = [0.0] * 3
88 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
90 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
91 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
95 robot.rhoScalar = Component_of_vector(
"rho_scalar")
96 robot.rhoScalar.setIndex(0)
97 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
101 robot.phaseScalar = Component_of_vector(
"phase_scalar")
102 robot.phaseScalar.setIndex(0)
103 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
104 robot.phaseInt = RoundDoubleToInt(
"phase_int")
105 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
109 wp = DummyWalkingPatternGenerator(
"dummy_wp")
111 wp.omega.value = omega
112 plug(robot.rhoScalar.sout, wp.rho)
113 plug(robot.phaseInt.sout, wp.phase)
114 plug(robot.waistToMatrix.sout, wp.waist)
115 plug(robot.lfToMatrix.sout, wp.footLeft)
116 plug(robot.rfToMatrix.sout, wp.footRight)
117 plug(robot.comTrajGen.x, wp.com)
118 plug(robot.comTrajGen.dx, wp.vcom)
119 plug(robot.comTrajGen.ddx, wp.acom)
124 robot.wp.comDes.recompute(0)
125 robot.wp.dcmDes.recompute(0)
126 robot.wp.zmpDes.recompute(0)
135 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
136 plug(robot.dynamic.LF, robot.m2qLF.sin)
137 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
138 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
139 plug(robot.dynamic.RF, robot.m2qRF.sin)
140 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
162 e2q = EulerToQuat(
"e2q")
163 plug(robot.base_estimator.q, e2q.euler)
167 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
168 robot.rdynamic.setModel(robot.dynamic.model)
169 robot.rdynamic.setData(robot.rdynamic.model.createData())
170 plug(robot.base_estimator.q, robot.rdynamic.position)
178 robot.rdynamic.velocity.value = [0.0] * robotDim
179 robot.rdynamic.acceleration.value = [0.0] * robotDim
182 cdc_estimator = DcmEstimator(
"cdc_estimator")
183 cdc_estimator.init(dt, robot_name)
184 plug(robot.e2q.quaternion, cdc_estimator.q)
185 plug(robot.base_estimator.v, cdc_estimator.v)
186 robot.cdc_estimator = cdc_estimator
189 estimator = DummyDcmEstimator(
"dummy")
190 plug(robot.wp.omegaDes, estimator.omega)
191 estimator.mass.value = 1.0
192 plug(robot.cdc_estimator.c, estimator.com)
193 plug(robot.cdc_estimator.dc, estimator.momenta)
195 robot.estimator = estimator
201 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
202 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
203 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
204 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
205 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
206 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
207 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
209 robot.zmp_estimator = zmp_estimator
214 Kp_dcm = [5.0, 5.0, 5.0]
215 Ki_dcm = [0.0, 0.0, 0.0]
218 dcm_controller = DcmController(
"dcmCtrl")
220 dcm_controller.Kp.value = Kp_dcm
221 dcm_controller.Ki.value = Ki_dcm
222 dcm_controller.decayFactor.value = gamma_dcm
223 dcm_controller.mass.value = mass
224 plug(robot.wp.omegaDes, dcm_controller.omega)
226 plug(robot.cdc_estimator.c, dcm_controller.com)
227 plug(robot.estimator.dcm, dcm_controller.dcm)
229 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
230 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
232 dcm_controller.init(dt)
234 robot.dcm_control = dcm_controller
236 Ki_dcm = [1.0, 1.0, 1.0]
240 plug(robot.e2q.quaternion, distribute.q)
241 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
242 plug(robot.wp.rhoDes, distribute.rho)
243 plug(robot.wp.phaseDes, distribute.phase)
244 distribute.init(robot_name)
245 robot.distribute = distribute
248 Kp_adm = [0.0, 0.0, 0.0]
250 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
251 com_admittance_control.Kp.value = Kp_adm
252 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
253 com_admittance_control.zmpDes.value = (
254 robot.wp.zmpDes.value
256 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
258 com_admittance_control.init(dt)
259 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
261 robot.com_admittance_control = com_admittance_control
263 Kp_adm = [20.0, 10.0, 0.0]
267 dfzAdmittance = -1e-4
271 controller = FootForceDifferenceController(
"footController")
273 plug(robot.wp.phaseDes, controller.phase)
275 controller.dfzAdmittance.value = 0.0
277 plug(robot.ftc.right_foot_force_out, controller.wrenchRight)
278 plug(robot.ftc.left_foot_force_out, controller.wrenchLeft)
279 plug(robot.distribute.surfaceWrenchRight, controller.wrenchRightDes)
280 plug(robot.distribute.surfaceWrenchLeft, controller.wrenchLeftDes)
282 controller.vdcFrequency.value = 0.0
283 controller.vdcDamping.value = 0.0
285 plug(robot.wp.footRightDes, controller.posRightDes)
286 plug(robot.wp.footLeftDes, controller.posLeftDes)
287 plug(robot.dynamic.RF, controller.posRight)
288 plug(robot.dynamic.LF, controller.posLeft)
290 robot.ffdc = controller
294 robot.cm.addCtrlMode(
"sot_input")
295 robot.cm.setCtrlMode(
"all",
"sot_input")
296 robot.cm.addEmergencyStopSIN(
"zmp")
297 robot.cm.addEmergencyStopSIN(
"distribute")
302 robot.taskUpperBody = Task(
"task_upper_body")
303 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
305 q = list(robot.dynamic.position.value)
306 robot.taskUpperBody.feature.state.value = q
307 robot.taskUpperBody.feature.posture.value = q
310 robot.taskUpperBody.feature.selectDof(18,
True)
311 robot.taskUpperBody.feature.selectDof(19,
True)
312 robot.taskUpperBody.feature.selectDof(20,
True)
313 robot.taskUpperBody.feature.selectDof(21,
True)
314 robot.taskUpperBody.feature.selectDof(22,
True)
315 robot.taskUpperBody.feature.selectDof(23,
True)
316 robot.taskUpperBody.feature.selectDof(24,
True)
317 robot.taskUpperBody.feature.selectDof(25,
True)
318 robot.taskUpperBody.feature.selectDof(26,
True)
319 robot.taskUpperBody.feature.selectDof(27,
True)
320 robot.taskUpperBody.feature.selectDof(28,
True)
321 robot.taskUpperBody.feature.selectDof(29,
True)
322 robot.taskUpperBody.feature.selectDof(30,
True)
323 robot.taskUpperBody.feature.selectDof(31,
True)
324 robot.taskUpperBody.feature.selectDof(32,
True)
325 robot.taskUpperBody.feature.selectDof(33,
True)
326 robot.taskUpperBody.feature.selectDof(34,
True)
327 robot.taskUpperBody.feature.selectDof(35,
True)
328 robot.taskUpperBody.feature.selectDof(36,
True)
329 robot.taskUpperBody.feature.selectDof(37,
True)
331 robot.taskUpperBody.controlGain.value = 100.0
332 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
333 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
337 robot.contactLF = MetaTaskKine6d(
338 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
340 robot.contactLF.feature.frame(
"desired")
341 robot.contactLF.gain.setConstant(1)
342 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
343 plug(robot.ffdc.vLeft, robot.contactLF.featureDes.velocity)
344 robot.contactLF.task.setWithDerivative(
True)
345 locals()[
"contactLF"] = robot.contactLF
347 robot.contactRF = MetaTaskKine6d(
348 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
350 robot.contactRF.feature.frame(
"desired")
351 robot.contactRF.gain.setConstant(1)
352 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
353 plug(robot.ffdc.vRight, robot.contactRF.featureDes.velocity)
354 robot.contactRF.task.setWithDerivative(
True)
355 locals()[
"contactRF"] = robot.contactRF
358 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
359 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
360 robot.taskComH.task.controlGain.value = 100.0
361 robot.taskComH.feature.selec.value =
"100"
364 robot.taskCom = MetaTaskKineCom(robot.dynamic)
365 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
366 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
367 robot.taskCom.task.controlGain.value = 0
368 robot.taskCom.task.setWithDerivative(
True)
369 robot.taskCom.feature.selec.value =
"011"
372 robot.keepWaist = MetaTaskKine6d(
373 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
375 robot.keepWaist.feature.frame(
"desired")
376 robot.keepWaist.gain.setConstant(300)
377 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
378 robot.keepWaist.feature.selec.value =
"111000"
379 locals()[
"keepWaist"] = robot.keepWaist
382 robot.sot = SOT(
"sot")
383 robot.sot.setSize(robot.dynamic.getDimension())
386 plug(robot.sot.control, robot.cm.ctrl_sot_input)
387 plug(robot.cm.u_safe, robot.device.control)
389 robot.sot.push(robot.taskUpperBody.name)
390 robot.sot.push(robot.contactRF.task.name)
391 robot.sot.push(robot.contactLF.task.name)
392 robot.sot.push(robot.taskComH.task.name)
393 robot.sot.push(robot.taskCom.task.name)
394 robot.sot.push(robot.keepWaist.task.name)
397 plug(robot.device.velocity, robot.dynamic.velocity)
398 robot.dvdt = Derivator_of_Vector(
"dv_dt")
399 robot.dvdt.dt.value = dt
400 plug(robot.device.velocity, robot.dvdt.sin)
401 plug(robot.dvdt.sout, robot.dynamic.acceleration)
409 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
413 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
416 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
420 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
424 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
427 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
431 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
434 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
437 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
440 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
444 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
447 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
450 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
462 "surfaceWrenchRight",
467 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
477 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
480 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
484 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
487 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"