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.meta_task_pose
import MetaTaskPose
29 from dynamic_graph.sot_talos_balance.round_double_to_int
import RoundDoubleToInt
31 cm_conf.CTRL_MAX = 1000.0
33 robot.timeStep = robot.device.getTimeStep()
38 robot.dynamic.com.recompute(0)
39 robotDim = robot.dynamic.getDimension()
40 mass = robot.dynamic.data.mass[0]
41 h = robot.dynamic.com.value[2]
49 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
50 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
51 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
52 robot.dynamic.LF.recompute(0)
53 robot.dynamic.RF.recompute(0)
54 robot.dynamic.WT.recompute(0)
59 if test_folder
is not None:
60 if sot_talos_balance_folder:
61 from rospkg
import RosPack
65 folder = rospack.get_path(
"sot-talos-balance") +
"/data/" + test_folder
74 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
75 robot.triggerTrajGen.sin.value = 0
79 robot.comTrajGen.x.recompute(0)
80 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
84 robot.lfTrajGen.x.recompute(0)
86 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
87 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
88 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
92 robot.rfTrajGen.x.recompute(0)
94 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
95 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
96 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
100 robot.zmpTrajGen.x.recompute(0)
101 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
105 robot.waistTrajGen.x.recompute(0)
107 robot.waistMix = Mix_of_vector(
"waistMix")
108 robot.waistMix.setSignalNumber(3)
109 robot.waistMix.addSelec(1, 0, 3)
110 robot.waistMix.addSelec(2, 3, 3)
111 robot.waistMix.default.value = [0.0] * 6
112 robot.waistMix.signal(
"sin1").value = [0.0] * 3
113 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
115 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
116 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
117 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
121 robot.rhoTrajGen.x.recompute(0)
122 robot.rhoScalar = Component_of_vector(
"rho_scalar")
123 robot.rhoScalar.setIndex(0)
124 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
125 plug(robot.triggerTrajGen.sout, robot.rhoTrajGen.trigger)
129 robot.phaseTrajGen.x.recompute(0)
130 robot.phaseScalar = Component_of_vector(
"phase_scalar")
131 robot.phaseScalar.setIndex(0)
132 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
133 robot.phaseInt = RoundDoubleToInt(
"phase_int")
134 plug(robot.phaseScalar.sout, robot.phaseInt.sin)
135 plug(robot.triggerTrajGen.sout, robot.phaseTrajGen.trigger)
138 if folder
is not None:
139 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
140 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
141 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
143 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
144 robot.rhoTrajGen.playTrajectoryFile(folder +
"Rho.dat")
145 robot.phaseTrajGen.playTrajectoryFile(folder +
"Phase.dat")
149 wp = DummyWalkingPatternGenerator(
"dummy_wp")
151 wp.omega.value = omega
152 plug(robot.rhoScalar.sout, wp.rho)
153 plug(robot.phaseInt.sout, wp.phase)
154 plug(robot.waistToMatrix.sout, wp.waist)
155 plug(robot.lfToMatrix.sout, wp.footLeft)
156 plug(robot.rfToMatrix.sout, wp.footRight)
157 plug(robot.comTrajGen.x, wp.com)
158 plug(robot.comTrajGen.dx, wp.vcom)
159 plug(robot.comTrajGen.ddx, wp.acom)
166 robot.wp.comDes.recompute(0)
167 robot.wp.dcmDes.recompute(0)
168 robot.wp.zmpDes.recompute(0)
177 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
178 plug(robot.dynamic.LF, robot.m2qLF.sin)
179 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
180 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
181 plug(robot.dynamic.RF, robot.m2qRF.sin)
182 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
187 e2q = EulerToQuat(
"e2q")
188 plug(robot.base_estimator.q, e2q.euler)
192 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
193 robot.rdynamic.setModel(robot.dynamic.model)
194 robot.rdynamic.setData(robot.rdynamic.model.createData())
195 plug(robot.base_estimator.q, robot.rdynamic.position)
196 robot.rdynamic.velocity.value = [0.0] * robotDim
197 robot.rdynamic.acceleration.value = [0.0] * robotDim
200 cdc_estimator = DcmEstimator(
"cdc_estimator")
201 cdc_estimator.init(dt, robot_name)
202 plug(robot.e2q.quaternion, cdc_estimator.q)
203 plug(robot.base_estimator.v, cdc_estimator.v)
204 robot.cdc_estimator = cdc_estimator
207 estimator = DummyDcmEstimator(
"dummy")
208 plug(robot.wp.omegaDes, estimator.omega)
209 estimator.mass.value = 1.0
210 plug(robot.cdc_estimator.c, estimator.com)
211 plug(robot.cdc_estimator.dc, estimator.momenta)
213 robot.estimator = estimator
219 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
220 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
221 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
222 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
223 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
224 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
225 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
227 robot.zmp_estimator = zmp_estimator
233 Ki_dcm = [0.0, 0.0, 0.0]
237 dcm_controller = DcmController(
"dcmCtrl")
239 dcm_controller.Kp.value = Kp_dcm
240 dcm_controller.Ki.value = Ki_dcm
241 dcm_controller.Kz.value = Kz_dcm
242 dcm_controller.decayFactor.value = gamma_dcm
243 dcm_controller.mass.value = mass
244 plug(robot.wp.omegaDes, dcm_controller.omega)
246 plug(robot.cdc_estimator.c, dcm_controller.com)
247 plug(robot.estimator.dcm, dcm_controller.dcm)
249 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
250 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
252 plug(robot.zmp_estimator.zmp, dcm_controller.zmp)
254 dcm_controller.init(dt)
256 robot.dcm_control = dcm_controller
258 Ki_dcm = [1.0, 1.0, 1.0]
260 Kz_dcm = [0.0, 0.0, 0.0]
264 plug(robot.e2q.quaternion, distribute.q)
265 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
266 plug(robot.wp.rhoDes, distribute.rho)
267 plug(robot.wp.phaseDes, distribute.phase)
268 distribute.init(robot_name)
269 robot.distribute = distribute
272 Kp_adm = [0.0, 0.0, 0.0]
274 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
275 com_admittance_control.Kp.value = Kp_adm
276 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
277 com_admittance_control.zmpDes.value = (
278 robot.wp.zmpDes.value
280 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
282 com_admittance_control.init(dt)
283 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
285 robot.com_admittance_control = com_admittance_control
287 Kp_adm = [15.0, 15.0, 0.0]
294 swingAdmittance = [0.0] * 3
300 controller = FootForceDifferenceController(
"footController")
302 plug(robot.wp.phaseDes, controller.phase)
304 controller.dfzAdmittance.value = 0.0
306 plug(robot.ftc.right_foot_force_out, controller.wrenchRight)
307 plug(robot.ftc.left_foot_force_out, controller.wrenchLeft)
308 plug(robot.distribute.surfaceWrenchRight, controller.wrenchRightDes)
309 plug(robot.distribute.surfaceWrenchLeft, controller.wrenchLeftDes)
311 controller.vdcFrequency.value = 0.0
312 controller.vdcDamping.value = 0.0
314 plug(robot.wp.footRightDes, controller.posRightDes)
315 plug(robot.wp.footLeftDes, controller.posLeftDes)
316 plug(robot.dynamic.RF, controller.posRight)
317 plug(robot.dynamic.LF, controller.posLeft)
319 controller.swingAdmittance.value = swingAdmittance
321 controller.gainSwing.value = gainSwing
322 controller.gainStance.value = gainStance
323 controller.gainDouble.value = gainDouble
325 robot.ffdc = controller
329 robot.cm.addCtrlMode(
"sot_input")
330 robot.cm.setCtrlMode(
"all",
"sot_input")
331 robot.cm.addEmergencyStopSIN(
"zmp")
332 robot.cm.addEmergencyStopSIN(
"distribute")
337 robot.taskUpperBody = Task(
"task_upper_body")
338 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
340 q = list(robot.dynamic.position.value)
341 robot.taskUpperBody.feature.state.value = q
342 robot.taskUpperBody.feature.posture.value = q
344 robotDim = robot.dynamic.getDimension()
345 for i
in range(18, robotDim):
346 robot.taskUpperBody.feature.selectDof(i,
True)
348 robot.taskUpperBody.controlGain.value = 100.0
349 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
350 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
354 robot.contactLF = MetaTaskPose(
355 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
357 plug(robot.ffdc.gainLeft, robot.contactLF.task.controlGain)
358 plug(robot.wp.footLeftDes, robot.contactLF.feature.faMfbDes)
359 plug(robot.ffdc.vLeft, robot.contactLF.feature.faNufafbDes)
360 robot.device.before.addSignal(
361 robot.contactLF.feature.name +
".faNufafbDes"
363 robot.contactLF.task.setWithDerivative(
True)
364 locals()[
"contactLF"] = robot.contactLF
366 robot.contactRF = MetaTaskPose(
367 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
369 plug(robot.ffdc.gainRight, robot.contactRF.task.controlGain)
370 plug(robot.wp.footRightDes, robot.contactRF.feature.faMfbDes)
371 plug(robot.ffdc.vRight, robot.contactRF.feature.faNufafbDes)
372 robot.device.before.addSignal(
373 robot.contactRF.feature.name +
".faNufafbDes"
375 robot.contactRF.task.setWithDerivative(
True)
376 locals()[
"contactRF"] = robot.contactRF
379 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
380 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
381 robot.taskComH.task.controlGain.value = 100.0
382 robot.taskComH.feature.selec.value =
"100"
385 robot.taskCom = MetaTaskKineCom(robot.dynamic)
386 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
387 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
388 robot.taskCom.task.controlGain.value = 100.0
389 robot.taskCom.task.setWithDerivative(
True)
390 robot.taskCom.feature.selec.value =
"011"
393 robot.keepWaist = MetaTaskKine6d(
394 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
396 robot.keepWaist.feature.frame(
"desired")
397 robot.keepWaist.gain.setConstant(300)
398 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
399 robot.keepWaist.feature.selec.value =
"111000"
400 locals()[
"keepWaist"] = robot.keepWaist
403 robot.sot = SOT(
"sot")
404 robot.sot.setSize(robot.dynamic.getDimension())
407 plug(robot.sot.control, robot.cm.ctrl_sot_input)
408 plug(robot.cm.u_safe, robot.device.control)
410 robot.sot.push(robot.taskUpperBody.name)
411 robot.sot.push(robot.contactRF.task.name)
412 robot.sot.push(robot.contactLF.task.name)
413 robot.sot.push(robot.taskComH.task.name)
414 robot.sot.push(robot.taskCom.task.name)
415 robot.sot.push(robot.keepWaist.task.name)
420 plug(robot.device.velocity, robot.dynamic.velocity)
421 robot.dvdt = Derivator_of_Vector(
"dv_dt")
422 robot.dvdt.dt.value = dt
423 plug(robot.device.velocity, robot.dvdt.sin)
424 plug(robot.dvdt.sout, robot.dynamic.acceleration)
431 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
433 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
438 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
441 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
444 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
448 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
452 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
455 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
460 robot.com_admittance_control,
466 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
470 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
473 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
477 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
480 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
483 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
486 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
490 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
493 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
496 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
508 "surfaceWrenchRight",
513 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
523 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
527 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
530 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
534 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
537 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
541 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
544 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"
548 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
551 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"
def create_imu_filters(robot, dt)
def create_base_estimator(robot, dt, conf, robot_name="robot")
def create_ctrl_manager(conf, dt, robot_name="robot")
def create_rospublish(robot, name)
def create_parameter_server(conf, dt, robot_name="robot")
def create_pose_rpy_trajectory_generator(dt, robot, signal_name)
def create_scalar_trajectory_generator(dt, init_value, name)
def create_ft_calibrator(robot, conf)
def create_zmp_trajectory_generator(dt, robot)
def create_device_filters(robot, dt)
def create_orientation_rpy_trajectory_generator(dt, robot, signal_name)
def create_simple_distribute_wrench(name="distribute")
def create_com_trajectory_generator(dt, robot)
def create_topic(rospub, entity, signalName, robot=None, data_type="vector")