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
33 cm_conf.CTRL_MAX = 1000.0
35 robot.timeStep = robot.device.getTimeStep()
40 robot.dynamic.com.recompute(0)
41 robotDim = robot.dynamic.getDimension()
42 mass = robot.dynamic.data.mass[0]
43 h = robot.dynamic.com.value[2]
51 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
52 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
53 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
54 robot.dynamic.LF.recompute(0)
55 robot.dynamic.RF.recompute(0)
56 robot.dynamic.WT.recompute(0)
61 if test_folder
is not None:
62 if sot_talos_balance_folder:
63 from rospkg
import RosPack
67 folder = rospack.get_path(
"sot-talos-balance") +
"/data/" + test_folder
76 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
77 robot.triggerTrajGen.sin.value = 0
81 robot.comTrajGen.x.recompute(0)
82 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
86 robot.lfTrajGen.x.recompute(0)
88 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
89 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
90 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
94 robot.rfTrajGen.x.recompute(0)
96 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
97 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
98 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
102 robot.zmpTrajGen.x.recompute(0)
103 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
107 robot.waistTrajGen.x.recompute(0)
109 robot.waistMix = Mix_of_vector(
"waistMix")
110 robot.waistMix.setSignalNumber(3)
111 robot.waistMix.addSelec(1, 0, 3)
112 robot.waistMix.addSelec(2, 3, 3)
113 robot.waistMix.default.value = [0.0] * 6
114 robot.waistMix.signal(
"sin1").value = [0.0] * 3
115 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
117 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
118 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
119 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
123 robot.rhoTrajGen.x.recompute(0)
124 robot.rhoScalar = Component_of_vector(
"rho_scalar")
125 robot.rhoScalar.setIndex(0)
126 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
127 plug(robot.triggerTrajGen.sout, robot.rhoTrajGen.trigger)
131 robot.phaseTrajGen.x.recompute(0)
132 robot.phaseScalar = Component_of_vector(
"phase_scalar")
133 robot.phaseScalar.setIndex(0)
134 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
135 robot.phaseInt = RoundDoubleToInt(
"phase_int")
136 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
137 plug(robot.triggerTrajGen.sout, robot.phaseTrajGen.trigger)
140 if folder
is not None:
141 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
142 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
143 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
145 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
146 robot.rhoTrajGen.playTrajectoryFile(folder +
"Rho.dat")
147 robot.phaseTrajGen.playTrajectoryFile(folder +
"Phase.dat")
151 wp = DummyWalkingPatternGenerator(
"dummy_wp")
153 wp.omega.value = omega
154 plug(robot.rhoScalar.sout, wp.rho)
155 plug(robot.phaseInt.sout, wp.phase)
156 plug(robot.waistToMatrix.sout, wp.waist)
157 plug(robot.lfToMatrix.sout, wp.footLeft)
158 plug(robot.rfToMatrix.sout, wp.footRight)
159 plug(robot.comTrajGen.x, wp.com)
160 plug(robot.comTrajGen.dx, wp.vcom)
161 plug(robot.comTrajGen.ddx, wp.acom)
168 robot.wp.comDes.recompute(0)
169 robot.wp.dcmDes.recompute(0)
170 robot.wp.zmpDes.recompute(0)
179 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
180 plug(robot.dynamic.LF, robot.m2qLF.sin)
181 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
182 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
183 plug(robot.dynamic.RF, robot.m2qRF.sin)
184 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
189 e2q = EulerToQuat(
"e2q")
190 plug(robot.base_estimator.q, e2q.euler)
194 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
195 robot.rdynamic.setModel(robot.dynamic.model)
196 robot.rdynamic.setData(robot.rdynamic.model.createData())
197 plug(robot.base_estimator.q, robot.rdynamic.position)
198 robot.rdynamic.velocity.value = [0.0] * robotDim
199 robot.rdynamic.acceleration.value = [0.0] * robotDim
202 cdc_estimator = DcmEstimator(
"cdc_estimator")
203 cdc_estimator.init(dt, robot_name)
204 plug(robot.e2q.quaternion, cdc_estimator.q)
205 plug(robot.base_estimator.v, cdc_estimator.v)
206 robot.cdc_estimator = cdc_estimator
209 estimator = DummyDcmEstimator(
"dummy")
210 plug(robot.wp.omegaDes, estimator.omega)
211 estimator.mass.value = 1.0
212 plug(robot.cdc_estimator.c, estimator.com)
213 plug(robot.cdc_estimator.dc, estimator.momenta)
215 robot.estimator = estimator
221 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
222 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
223 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
224 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
225 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
226 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
227 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
229 robot.zmp_estimator = zmp_estimator
235 Ki_dcm = [0.0, 0.0, 0.0]
239 dcm_controller = DcmController(
"dcmCtrl")
241 dcm_controller.Kp.value = Kp_dcm
242 dcm_controller.Ki.value = Ki_dcm
243 dcm_controller.Kz.value = Kz_dcm
244 dcm_controller.decayFactor.value = gamma_dcm
245 dcm_controller.mass.value = mass
246 plug(robot.wp.omegaDes, dcm_controller.omega)
248 plug(robot.cdc_estimator.c, dcm_controller.com)
249 plug(robot.estimator.dcm, dcm_controller.dcm)
251 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
252 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
254 plug(robot.zmp_estimator.zmp, dcm_controller.zmp)
256 dcm_controller.init(dt)
258 robot.dcm_control = dcm_controller
260 Ki_dcm = [1.0, 1.0, 1.0]
262 Kz_dcm = [0.0, 0.0, 0.0]
266 plug(robot.e2q.quaternion, distribute.q)
267 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
268 plug(robot.wp.rhoDes, distribute.rho)
269 plug(robot.wp.phaseDes, distribute.phase)
270 distribute.init(robot_name)
271 robot.distribute = distribute
274 Kp_adm = [0.0, 0.0, 0.0]
276 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
277 com_admittance_control.Kp.value = Kp_adm
278 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
279 com_admittance_control.zmpDes.value = (
280 robot.wp.zmpDes.value
282 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
284 com_admittance_control.init(dt)
285 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
287 robot.com_admittance_control = com_admittance_control
289 Kp_adm = [15.0, 15.0, 0.0]
296 swingAdmittance = [0.0] * 3
302 controller = FootForceDifferenceController(
"footController")
304 plug(robot.wp.phaseDes, controller.phase)
306 controller.dfzAdmittance.value = 0.0
308 plug(robot.ftc.right_foot_force_out, controller.wrenchRight)
309 plug(robot.ftc.left_foot_force_out, controller.wrenchLeft)
310 plug(robot.distribute.surfaceWrenchRight, controller.wrenchRightDes)
311 plug(robot.distribute.surfaceWrenchLeft, controller.wrenchLeftDes)
313 controller.vdcFrequency.value = 0.0
314 controller.vdcDamping.value = 0.0
316 plug(robot.wp.footRightDes, controller.posRightDes)
317 plug(robot.wp.footLeftDes, controller.posLeftDes)
318 plug(robot.dynamic.RF, controller.posRight)
319 plug(robot.dynamic.LF, controller.posLeft)
321 controller.swingAdmittance.value = swingAdmittance
323 controller.gainSwing.value = gainSwing
324 controller.gainStance.value = gainStance
325 controller.gainDouble.value = gainDouble
327 robot.ffdc = controller
331 robot.cm.addCtrlMode(
"sot_input")
332 robot.cm.setCtrlMode(
"all",
"sot_input")
333 robot.cm.addEmergencyStopSIN(
"zmp")
334 robot.cm.addEmergencyStopSIN(
"distribute")
339 robot.taskUpperBody = Task(
"task_upper_body")
340 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
342 q = list(robot.dynamic.position.value)
343 robot.taskUpperBody.feature.state.value = q
344 robot.taskUpperBody.feature.posture.value = q
346 robotDim = robot.dynamic.getDimension()
347 for i
in range(18, robotDim):
348 robot.taskUpperBody.feature.selectDof(i,
True)
350 robot.taskUpperBody.controlGain.value = 100.0
351 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
352 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
356 robot.contactLF = MetaTaskKine6d(
357 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
359 robot.contactLF.feature.frame(
"desired")
360 plug(robot.ffdc.gainLeft, robot.contactLF.task.controlGain)
361 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
362 plug(robot.ffdc.vLeft, robot.contactLF.featureDes.velocity)
363 robot.contactLF.task.setWithDerivative(
True)
364 locals()[
"contactLF"] = robot.contactLF
366 robot.contactRF = MetaTaskKine6d(
367 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
369 robot.contactRF.feature.frame(
"desired")
370 plug(robot.ffdc.gainRight, robot.contactRF.task.controlGain)
371 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
372 plug(robot.ffdc.vRight, robot.contactRF.featureDes.velocity)
373 robot.contactRF.task.setWithDerivative(
True)
374 locals()[
"contactRF"] = robot.contactRF
377 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
378 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
379 robot.taskComH.task.controlGain.value = 100.0
380 robot.taskComH.feature.selec.value =
"100"
383 robot.taskCom = MetaTaskKineCom(robot.dynamic)
384 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
385 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
386 robot.taskCom.task.controlGain.value = 100.0
387 robot.taskCom.task.setWithDerivative(
True)
388 robot.taskCom.feature.selec.value =
"011"
391 robot.keepWaist = MetaTaskKine6d(
392 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
394 robot.keepWaist.feature.frame(
"desired")
395 robot.keepWaist.gain.setConstant(300)
396 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
397 robot.keepWaist.feature.selec.value =
"111000"
398 locals()[
"keepWaist"] = robot.keepWaist
401 robot.sot = SOT(
"sot")
402 robot.sot.setSize(robot.dynamic.getDimension())
405 plug(robot.sot.control, robot.cm.ctrl_sot_input)
406 plug(robot.cm.u_safe, robot.device.control)
408 robot.sot.push(robot.taskUpperBody.name)
409 robot.sot.push(robot.contactRF.task.name)
410 robot.sot.push(robot.contactLF.task.name)
411 robot.sot.push(robot.taskComH.task.name)
412 robot.sot.push(robot.taskCom.task.name)
413 robot.sot.push(robot.keepWaist.task.name)
418 plug(robot.device.velocity, robot.dynamic.velocity)
419 robot.dvdt = Derivator_of_Vector(
"dv_dt")
420 robot.dvdt.dt.value = dt
421 plug(robot.device.velocity, robot.dvdt.sin)
422 plug(robot.dvdt.sout, robot.dynamic.acceleration)
429 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
431 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
436 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
439 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
442 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
446 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
450 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
453 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
458 robot.com_admittance_control,
464 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
468 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
471 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
475 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
478 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
481 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
484 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
488 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
491 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
494 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
506 "surfaceWrenchRight",
511 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
521 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
525 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
528 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
532 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
535 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
539 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
542 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"
546 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
549 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"
553 robot.tracer = TracerRealTime(
"com_tracer")
554 robot.tracer.setBufferSize(80 * (2**20))
555 robot.tracer.open(
"/tmp",
"dg_",
".dat")
556 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
558 addTrace(robot.tracer, robot.wp,
"comDes")
560 addTrace(robot.tracer, robot.cdc_estimator,
"c")
563 addTrace(robot.tracer, robot.com_admittance_control,
"comRef")
564 addTrace(robot.tracer, robot.dynamic,
"com")
571 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
572 addTrace(robot.tracer, robot.dcm_control,
"zmpRef")