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.round_double_to_int
import RoundDoubleToInt
30 cm_conf.CTRL_MAX = 10.0
32 robot.timeStep = robot.device.getTimeStep()
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")
74 robot.triggerTrajGen.sin.value = 0
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.rhoTrajGen.x.recompute(0)
121 robot.rhoScalar = Component_of_vector(
"rho_scalar")
122 robot.rhoScalar.setIndex(0)
123 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
124 plug(robot.triggerTrajGen.sout, robot.rhoTrajGen.trigger)
128 robot.phaseTrajGen.x.recompute(0)
129 robot.phaseScalar = Component_of_vector(
"phase_scalar")
130 robot.phaseScalar.setIndex(0)
131 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
132 robot.phaseInt = RoundDoubleToInt(
"phase_int")
133 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
134 plug(robot.triggerTrajGen.sout, robot.phaseTrajGen.trigger)
137 if folder
is not None:
138 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
139 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
140 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
142 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
143 robot.rhoTrajGen.playTrajectoryFile(folder +
"Rho.dat")
144 robot.phaseTrajGen.playTrajectoryFile(folder +
"Phase.dat")
148 wp = DummyWalkingPatternGenerator(
"dummy_wp")
150 wp.omega.value = omega
151 plug(robot.rhoScalar.sout, wp.rho)
152 plug(robot.phaseInt.sout, wp.phase)
153 plug(robot.waistToMatrix.sout, wp.waist)
154 plug(robot.lfToMatrix.sout, wp.footLeft)
155 plug(robot.rfToMatrix.sout, wp.footRight)
156 plug(robot.comTrajGen.x, wp.com)
157 plug(robot.comTrajGen.dx, wp.vcom)
158 plug(robot.comTrajGen.ddx, wp.acom)
165 robot.wp.comDes.recompute(0)
166 robot.wp.dcmDes.recompute(0)
167 robot.wp.zmpDes.recompute(0)
176 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
177 plug(robot.dynamic.LF, robot.m2qLF.sin)
178 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
179 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
180 plug(robot.dynamic.RF, robot.m2qRF.sin)
181 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
186 e2q = EulerToQuat(
"e2q")
187 plug(robot.base_estimator.q, e2q.euler)
191 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
192 robot.rdynamic.setModel(robot.dynamic.model)
193 robot.rdynamic.setData(robot.rdynamic.model.createData())
194 plug(robot.base_estimator.q, robot.rdynamic.position)
195 robot.rdynamic.velocity.value = [0.0] * robotDim
196 robot.rdynamic.acceleration.value = [0.0] * robotDim
199 cdc_estimator = DcmEstimator(
"cdc_estimator")
200 cdc_estimator.init(dt, robot_name)
201 plug(robot.e2q.quaternion, cdc_estimator.q)
202 plug(robot.base_estimator.v, cdc_estimator.v)
203 robot.cdc_estimator = cdc_estimator
206 estimator = DummyDcmEstimator(
"dummy")
207 plug(robot.wp.omegaDes, estimator.omega)
208 estimator.mass.value = 1.0
209 plug(robot.cdc_estimator.c, estimator.com)
210 plug(robot.cdc_estimator.dc, estimator.momenta)
212 robot.estimator = estimator
218 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
219 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
220 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
221 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
222 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
223 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
224 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
226 robot.zmp_estimator = zmp_estimator
232 Ki_dcm = [0.0, 0.0, 0.0]
236 dcm_controller = DcmController(
"dcmCtrl")
238 dcm_controller.Kp.value = Kp_dcm
239 dcm_controller.Ki.value = Ki_dcm
240 dcm_controller.Kz.value = Kz_dcm
241 dcm_controller.decayFactor.value = gamma_dcm
242 dcm_controller.mass.value = mass
243 plug(robot.wp.omegaDes, dcm_controller.omega)
245 plug(robot.cdc_estimator.c, dcm_controller.com)
246 plug(robot.estimator.dcm, dcm_controller.dcm)
248 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
249 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
251 plug(robot.zmp_estimator.zmp, dcm_controller.zmp)
253 dcm_controller.init(dt)
255 robot.dcm_control = dcm_controller
257 Ki_dcm = [1.0, 1.0, 1.0]
259 Kz_dcm = [0.0, 0.0, 0.0]
263 plug(robot.e2q.quaternion, distribute.q)
264 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
265 plug(robot.wp.rhoDes, distribute.rho)
266 plug(robot.wp.phaseDes, distribute.phase)
267 distribute.init(robot_name)
268 robot.distribute = distribute
271 Kp_adm = [0.0, 0.0, 0.0]
273 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
274 com_admittance_control.Kp.value = Kp_adm
275 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
276 com_admittance_control.zmpDes.value = (
277 robot.wp.zmpDes.value
279 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
281 com_admittance_control.init(dt)
282 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
284 robot.com_admittance_control = com_admittance_control
286 Kp_adm = [15.0, 15.0, 0.0]
290 robot.cm.addCtrlMode(
"sot_input")
291 robot.cm.setCtrlMode(
"all",
"sot_input")
292 robot.cm.addEmergencyStopSIN(
"zmp")
293 robot.cm.addEmergencyStopSIN(
"distribute")
298 robot.taskUpperBody = Task(
"task_upper_body")
299 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
301 q = list(robot.dynamic.position.value)
302 robot.taskUpperBody.feature.state.value = q
303 robot.taskUpperBody.feature.posture.value = q
305 robotDim = robot.dynamic.getDimension()
306 for i
in range(18, robotDim):
307 robot.taskUpperBody.feature.selectDof(i,
True)
309 robot.taskUpperBody.controlGain.value = 100.0
310 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
311 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
315 robot.contactLF = MetaTaskKine6d(
316 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
318 robot.contactLF.feature.frame(
"desired")
319 robot.contactLF.gain.setConstant(300)
320 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
321 locals()[
"contactLF"] = robot.contactLF
323 robot.contactRF = MetaTaskKine6d(
324 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
326 robot.contactRF.feature.frame(
"desired")
327 robot.contactRF.gain.setConstant(300)
328 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
329 locals()[
"contactRF"] = robot.contactRF
332 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
333 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
334 robot.taskComH.task.controlGain.value = 100.0
335 robot.taskComH.feature.selec.value =
"100"
338 robot.taskCom = MetaTaskKineCom(robot.dynamic)
339 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
340 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
341 robot.taskCom.task.controlGain.value = 100.0
342 robot.taskCom.task.setWithDerivative(
True)
343 robot.taskCom.feature.selec.value =
"011"
346 robot.keepWaist = MetaTaskKine6d(
347 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
349 robot.keepWaist.feature.frame(
"desired")
350 robot.keepWaist.gain.setConstant(300)
351 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
352 robot.keepWaist.feature.selec.value =
"111000"
353 locals()[
"keepWaist"] = robot.keepWaist
356 robot.sot = SOT(
"sot")
357 robot.sot.setSize(robot.dynamic.getDimension())
360 plug(robot.sot.control, robot.cm.ctrl_sot_input)
361 plug(robot.cm.u_safe, robot.device.control)
363 robot.sot.push(robot.taskUpperBody.name)
364 robot.sot.push(robot.contactRF.task.name)
365 robot.sot.push(robot.contactLF.task.name)
366 robot.sot.push(robot.taskComH.task.name)
367 robot.sot.push(robot.taskCom.task.name)
368 robot.sot.push(robot.keepWaist.task.name)
373 plug(robot.device.velocity, robot.dynamic.velocity)
374 robot.dvdt = Derivator_of_Vector(
"dv_dt")
375 robot.dvdt.dt.value = dt
376 plug(robot.device.velocity, robot.dvdt.sin)
377 plug(robot.dvdt.sout, robot.dynamic.acceleration)
384 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
386 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
391 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
394 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
397 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
401 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
405 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
408 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
413 robot.com_admittance_control,
419 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
423 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
426 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
430 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
433 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
436 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
439 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
443 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
446 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
449 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
452 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
462 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
466 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
469 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
473 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
476 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
480 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
483 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"