5 from dynamic_graph
import plug
6 from dynamic_graph.sot.core
import SOT, Derivator_of_Vector, FeaturePosture, Task
7 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
8 from dynamic_graph.sot.core.meta_tasks_kine
import (
13 from dynamic_graph.sot.core.operator
import Multiply_double_vector
14 from dynamic_graph.sot.dynamic_pinocchio
import DynamicPinocchio
15 from dynamic_graph.tracer_real_time
import TracerRealTime
17 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
18 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
19 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
20 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
22 from dynamic_graph.sot_talos_balance.meta_task_joint
import MetaTaskKineJoint
24 cm_conf.CTRL_MAX = 10.0
26 robot.timeStep = robot.device.getTimeStep()
31 robot.dynamic.com.recompute(0)
32 robotDim = robot.dynamic.getDimension()
33 mass = robot.dynamic.data.mass[0]
34 h = robot.dynamic.com.value[2]
42 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
43 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
44 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
45 robot.dynamic.LF.recompute(0)
46 robot.dynamic.RF.recompute(0)
47 robot.dynamic.WT.recompute(0)
59 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
60 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
65 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
66 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
72 robot.waistMix = Mix_of_vector(
"waistMix")
73 robot.waistMix.setSignalNumber(3)
74 robot.waistMix.addSelec(1, 0, 3)
75 robot.waistMix.addSelec(2, 3, 3)
76 robot.waistMix.default.value = [0.0] * 6
77 robot.waistMix.signal(
"sin1").value = [0.0] * 3
78 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
80 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
81 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
85 robot.rhoScalar = Component_of_vector(
"rho_scalar")
86 robot.rhoScalar.setIndex(0)
87 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
91 robot.phaseScalar = Component_of_vector(
"phase_scalar")
92 robot.phaseScalar.setIndex(0)
93 plug(robot.phaseTrajGen.x, robot.phaseScalar.sin)
97 wp = DummyWalkingPatternGenerator(
"dummy_wp")
99 wp.omega.value = omega
100 plug(robot.waistToMatrix.sout, wp.waist)
101 plug(robot.lfToMatrix.sout, wp.footLeft)
102 plug(robot.rfToMatrix.sout, wp.footRight)
103 plug(robot.comTrajGen.x, wp.com)
104 plug(robot.comTrajGen.dx, wp.vcom)
105 plug(robot.comTrajGen.ddx, wp.acom)
110 robot.wp.comDes.recompute(0)
111 robot.wp.dcmDes.recompute(0)
112 robot.wp.zmpDes.recompute(0)
124 rf = SimpleReferenceFrame(
"rf")
126 plug(robot.dynamic.LF, rf.footLeft)
127 plug(robot.dynamic.RF, rf.footRight)
131 stf = StateTransformation(
"stf")
133 plug(robot.rf.referenceFrame, stf.referenceFrame)
134 plug(robot.base_estimator.q, stf.q_in)
135 plug(robot.base_estimator.v, stf.v_in)
139 e2q = EulerToQuat(
"e2q")
140 plug(robot.stf.q, e2q.euler)
144 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
145 robot.rdynamic.setModel(robot.dynamic.model)
146 robot.rdynamic.setData(robot.rdynamic.model.createData())
147 plug(robot.stf.q, robot.rdynamic.position)
148 robot.rdynamic.velocity.value = [0.0] * robotDim
149 robot.rdynamic.acceleration.value = [0.0] * robotDim
152 cdc_estimator = DcmEstimator(
"cdc_estimator")
153 cdc_estimator.init(dt, robot_name)
154 plug(robot.e2q.quaternion, cdc_estimator.q)
155 plug(robot.stf.v, cdc_estimator.v)
156 robot.cdc_estimator = cdc_estimator
159 estimator = DummyDcmEstimator(
"dummy")
160 estimator.omega.value = omega
161 estimator.mass.value = 1.0
162 plug(robot.cdc_estimator.c, estimator.com)
163 plug(robot.cdc_estimator.dc, estimator.momenta)
165 robot.estimator = estimator
171 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
172 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
173 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
174 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
175 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
176 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
177 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
179 robot.zmp_estimator = zmp_estimator
184 Kp_dcm = [5.0, 5.0, 5.0]
185 Ki_dcm = [0.0, 0.0, 0.0]
188 dcm_controller = DcmController(
"dcmCtrl")
190 dcm_controller.Kp.value = Kp_dcm
191 dcm_controller.Ki.value = Ki_dcm
192 dcm_controller.decayFactor.value = gamma_dcm
193 dcm_controller.mass.value = mass
194 dcm_controller.omega.value = omega
196 plug(robot.cdc_estimator.c, dcm_controller.com)
197 plug(robot.estimator.dcm, dcm_controller.dcm)
199 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
200 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
202 dcm_controller.init(dt)
204 robot.dcm_control = dcm_controller
206 Ki_dcm = [1.0, 1.0, 1.0]
210 plug(robot.e2q.quaternion, distribute.q)
211 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
212 plug(robot.rhoScalar.sout, distribute.rho)
213 distribute.init(robot_name)
214 robot.distribute = distribute
222 Kp_ankles = [1e-3] * 2
225 controller = AnkleAdmittanceController(
"rightController")
226 plug(robot.ftc.right_foot_force_out, controller.wrench)
227 controller.gainsXY.value = Kp_ankles
228 plug(robot.distribute.copRight, controller.pRef)
230 robot.rightAnkleController = controller
233 robot.rightPitchSelec = Selec_of_vector(
"rightPitchSelec")
234 robot.rightPitchSelec.selec(1, 2)
235 plug(robot.rightAnkleController.dRP, robot.rightPitchSelec.sin)
237 robot.rightAnklePitchTask = MetaTaskKineJoint(robot.dynamic, RightPitchJoint + 6)
238 robot.rightAnklePitchTask.task.controlGain.value = 0
239 robot.rightAnklePitchTask.task.setWithDerivative(
True)
240 robot.rightAnklePitchTask.featureDes.errorIN.value = [0.0]
241 plug(robot.rightPitchSelec.sout, robot.rightAnklePitchTask.featureDes.errordotIN)
244 robot.rightRollSelec = Selec_of_vector(
"rightRollSelec")
245 robot.rightRollSelec.selec(0, 1)
246 plug(robot.rightAnkleController.dRP, robot.rightRollSelec.sin)
248 robot.rightAnkleRollTask = MetaTaskKineJoint(robot.dynamic, RightRollJoint + 6)
249 robot.rightAnkleRollTask.task.controlGain.value = 0
250 robot.rightAnkleRollTask.task.setWithDerivative(
True)
251 robot.rightAnkleRollTask.featureDes.errorIN.value = [0.0]
252 plug(robot.rightRollSelec.sout, robot.rightAnkleRollTask.featureDes.errordotIN)
256 robot.cm.addCtrlMode(
"sot_input")
257 robot.cm.setCtrlMode(
"all",
"sot_input")
258 robot.cm.addEmergencyStopSIN(
"zmp")
259 robot.cm.addEmergencyStopSIN(
"distribute")
264 robot.taskUpperBody = Task(
"task_upper_body")
265 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
267 q = list(robot.dynamic.position.value)
268 robot.taskUpperBody.feature.state.value = q
269 robot.taskUpperBody.feature.posture.value = q
272 robot.taskUpperBody.feature.selectDof(18,
True)
273 robot.taskUpperBody.feature.selectDof(19,
True)
274 robot.taskUpperBody.feature.selectDof(20,
True)
275 robot.taskUpperBody.feature.selectDof(21,
True)
276 robot.taskUpperBody.feature.selectDof(22,
True)
277 robot.taskUpperBody.feature.selectDof(23,
True)
278 robot.taskUpperBody.feature.selectDof(24,
True)
279 robot.taskUpperBody.feature.selectDof(25,
True)
280 robot.taskUpperBody.feature.selectDof(26,
True)
281 robot.taskUpperBody.feature.selectDof(27,
True)
282 robot.taskUpperBody.feature.selectDof(28,
True)
283 robot.taskUpperBody.feature.selectDof(29,
True)
284 robot.taskUpperBody.feature.selectDof(30,
True)
285 robot.taskUpperBody.feature.selectDof(31,
True)
286 robot.taskUpperBody.feature.selectDof(32,
True)
287 robot.taskUpperBody.feature.selectDof(33,
True)
288 robot.taskUpperBody.feature.selectDof(34,
True)
289 robot.taskUpperBody.feature.selectDof(35,
True)
290 robot.taskUpperBody.feature.selectDof(36,
True)
291 robot.taskUpperBody.feature.selectDof(37,
True)
293 robot.taskUpperBody.controlGain.value = 100.0
294 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
295 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
299 robot.contactLF = MetaTaskKine6d(
300 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
302 robot.contactLF.feature.frame(
"desired")
303 robot.contactLF.gain.setConstant(300)
304 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
305 locals()[
"contactLF"] = robot.contactLF
307 robot.contactRF = MetaTaskKine6d(
308 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
310 robot.contactRF.feature.frame(
"desired")
311 robot.contactRF.gain.setConstant(300)
312 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
314 locals()[
"contactRF"] = robot.contactRF
317 robot.taskCom = MetaTaskKineCom(robot.dynamic)
318 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
319 robot.taskCom.task.controlGain.value = 10
320 robot.taskCom.feature.selec.value =
"100"
323 robot.keepWaist = MetaTaskKine6d(
324 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
326 robot.keepWaist.feature.frame(
"desired")
327 robot.keepWaist.gain.setConstant(300)
328 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
329 robot.keepWaist.feature.selec.value =
"111000"
330 locals()[
"keepWaist"] = robot.keepWaist
333 robot.sot = SOT(
"sot")
334 robot.sot.setSize(robot.dynamic.getDimension())
337 plug(robot.sot.control, robot.cm.ctrl_sot_input)
338 plug(robot.cm.u_safe, robot.device.control)
340 robot.sot.push(robot.taskUpperBody.name)
341 robot.sot.push(robot.contactRF.task.name)
342 robot.sot.push(robot.contactLF.task.name)
343 robot.sot.push(robot.taskCom.task.name)
344 robot.sot.push(robot.rightAnklePitchTask.task.name)
345 robot.sot.push(robot.rightAnkleRollTask.task.name)
346 robot.sot.push(robot.keepWaist.task.name)
349 plug(robot.device.velocity, robot.dynamic.velocity)
350 robot.dvdt = Derivator_of_Vector(
"dv_dt")
351 robot.dvdt.dt.value = dt
352 plug(robot.device.velocity, robot.dvdt.sin)
353 plug(robot.dvdt.sout, robot.dynamic.acceleration)
361 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
365 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
368 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
372 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
376 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
379 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
383 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
386 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
389 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
392 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
396 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
399 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
402 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
405 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
415 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
418 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
422 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
425 robot.publisher, robot.rightAnkleController,
"pRef", robot=robot, data_type=
"vector"
428 robot.publisher, robot.rightAnkleController,
"dRP", robot=robot, data_type=
"vector"