5 from dynamic_graph
import plug
6 from dynamic_graph.sot.core
import (
10 MatrixHomoToPoseQuaternion,
13 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
14 from dynamic_graph.sot.core.meta_tasks_kine
import (
19 from dynamic_graph.sot.dynamic_pinocchio
import DynamicPinocchio
20 from dynamic_graph.tracer_real_time
import TracerRealTime
22 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
23 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
24 import dynamic_graph.sot_talos_balance.talos.distribute_conf
as distribute_conf
25 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
26 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
28 from dynamic_graph.sot_talos_balance.simple_controller_6d
import SimpleController6d
30 cm_conf.CTRL_MAX = 1000.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)
65 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
66 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
71 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
72 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
78 robot.waistMix = Mix_of_vector(
"waistMix")
79 robot.waistMix.setSignalNumber(3)
80 robot.waistMix.addSelec(1, 0, 3)
81 robot.waistMix.addSelec(2, 3, 3)
82 robot.waistMix.default.value = [0.0] * 6
83 robot.waistMix.signal(
"sin1").value = [0.0] * 3
84 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
86 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
87 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
91 robot.rhoScalar = Component_of_vector(
"rho_scalar")
92 robot.rhoScalar.setIndex(0)
93 plug(robot.rhoTrajGen.x, robot.rhoScalar.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)
121 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
122 plug(robot.dynamic.LF, robot.m2qLF.sin)
123 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
124 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
125 plug(robot.dynamic.RF, robot.m2qRF.sin)
126 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
148 e2q = EulerToQuat(
"e2q")
149 plug(robot.base_estimator.q, e2q.euler)
153 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
154 robot.rdynamic.setModel(robot.dynamic.model)
155 robot.rdynamic.setData(robot.rdynamic.model.createData())
158 robot.baseselec = Selec_of_vector(
"base_selec")
159 robot.baseselec.selec(0, 6)
160 plug(robot.base_estimator.q, robot.baseselec.sin)
161 plug(robot.baseselec.sout, robot.rdynamic.ffposition)
163 plug(robot.device.state, robot.rdynamic.position)
164 robot.rdynamic.velocity.value = [0.0] * robotDim
165 robot.rdynamic.acceleration.value = [0.0] * robotDim
168 cdc_estimator = DcmEstimator(
"cdc_estimator")
169 cdc_estimator.init(dt, robot_name)
170 plug(robot.e2q.quaternion, cdc_estimator.q)
171 plug(robot.base_estimator.v, cdc_estimator.v)
172 robot.cdc_estimator = cdc_estimator
175 estimator = DummyDcmEstimator(
"dummy")
176 estimator.omega.value = omega
177 estimator.mass.value = 1.0
178 plug(robot.cdc_estimator.c, estimator.com)
179 plug(robot.cdc_estimator.dc, estimator.momenta)
181 robot.estimator = estimator
187 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
188 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
189 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
190 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
191 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
192 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
193 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
195 robot.zmp_estimator = zmp_estimator
200 Kp_dcm = [5.0, 5.0, 5.0]
201 Ki_dcm = [0.0, 0.0, 0.0]
204 dcm_controller = DcmController(
"dcmCtrl")
206 dcm_controller.Kp.value = Kp_dcm
207 dcm_controller.Ki.value = Ki_dcm
208 dcm_controller.decayFactor.value = gamma_dcm
209 dcm_controller.mass.value = mass
210 dcm_controller.omega.value = omega
212 plug(robot.cdc_estimator.c, dcm_controller.com)
213 plug(robot.estimator.dcm, dcm_controller.dcm)
215 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
216 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
218 dcm_controller.init(dt)
220 robot.dcm_control = dcm_controller
222 Ki_dcm = [1.0, 1.0, 1.0]
226 plug(robot.e2q.quaternion, distribute.q)
227 plug(robot.dcm_control.wrenchRef, distribute.wrenchDes)
228 plug(robot.rhoScalar.sout, distribute.rho)
229 distribute.init(robot_name)
230 robot.distribute = distribute
238 Kp_ankles = [1e-3] * 2
241 controller = AnkleAdmittanceController(
"rightController")
242 plug(robot.ftc.right_foot_force_out, controller.wrench)
243 controller.gainsXY.value = [0.0] * 2
244 plug(robot.distribute.copRight, controller.pRef)
246 robot.rightAnkleController = controller
249 controller = AnkleAdmittanceController(
"leftController")
250 plug(robot.ftc.left_foot_force_out, controller.wrench)
251 controller.gainsXY.value = [0.0] * 2
252 plug(robot.distribute.copLeft, controller.pRef)
254 robot.leftAnkleController = controller
258 robot.cm.addCtrlMode(
"sot_input")
259 robot.cm.setCtrlMode(
"all",
"sot_input")
260 robot.cm.addEmergencyStopSIN(
"zmp")
261 robot.cm.addEmergencyStopSIN(
"distribute")
266 robot.taskUpperBody = Task(
"task_upper_body")
267 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
269 q = list(robot.dynamic.position.value)
270 robot.taskUpperBody.feature.state.value = q
271 robot.taskUpperBody.feature.posture.value = q
274 robot.taskUpperBody.feature.selectDof(18,
True)
275 robot.taskUpperBody.feature.selectDof(19,
True)
276 robot.taskUpperBody.feature.selectDof(20,
True)
277 robot.taskUpperBody.feature.selectDof(21,
True)
278 robot.taskUpperBody.feature.selectDof(22,
True)
279 robot.taskUpperBody.feature.selectDof(23,
True)
280 robot.taskUpperBody.feature.selectDof(24,
True)
281 robot.taskUpperBody.feature.selectDof(25,
True)
282 robot.taskUpperBody.feature.selectDof(26,
True)
283 robot.taskUpperBody.feature.selectDof(27,
True)
284 robot.taskUpperBody.feature.selectDof(28,
True)
285 robot.taskUpperBody.feature.selectDof(29,
True)
286 robot.taskUpperBody.feature.selectDof(30,
True)
287 robot.taskUpperBody.feature.selectDof(31,
True)
288 robot.taskUpperBody.feature.selectDof(32,
True)
289 robot.taskUpperBody.feature.selectDof(33,
True)
290 robot.taskUpperBody.feature.selectDof(34,
True)
291 robot.taskUpperBody.feature.selectDof(35,
True)
292 robot.taskUpperBody.feature.selectDof(36,
True)
293 robot.taskUpperBody.feature.selectDof(37,
True)
295 robot.taskUpperBody.controlGain.value = 100.0
296 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
297 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
301 robot.contactLF = MetaTaskKine6d(
302 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
304 robot.contactLF.feature.frame(
"desired")
305 robot.contactLF.gain.setConstant(300)
306 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
307 plug(robot.leftAnkleController.vDes, robot.contactLF.featureDes.velocity)
308 robot.contactLF.task.setWithDerivative(
True)
309 locals()[
"contactLF"] = robot.contactLF
311 robot.contactRF = MetaTaskKine6d(
312 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
314 robot.contactRF.feature.frame(
"desired")
315 robot.contactRF.gain.setConstant(300)
316 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
317 plug(robot.rightAnkleController.vDes, robot.contactRF.featureDes.velocity)
318 robot.contactRF.task.setWithDerivative(
True)
319 locals()[
"contactRF"] = robot.contactRF
322 robot.taskCom = MetaTaskKineCom(robot.dynamic)
323 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
324 robot.taskCom.task.controlGain.value = 10
327 robot.keepWaist = MetaTaskKine6d(
328 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
330 robot.keepWaist.feature.frame(
"desired")
331 robot.keepWaist.gain.setConstant(300)
332 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
333 robot.keepWaist.feature.selec.value =
"111000"
334 locals()[
"keepWaist"] = robot.keepWaist
337 robot.sot = SOT(
"sot")
338 robot.sot.setSize(robot.dynamic.getDimension())
341 plug(robot.sot.control, robot.cm.ctrl_sot_input)
342 plug(robot.cm.u_safe, robot.device.control)
344 robot.sot.push(robot.taskUpperBody.name)
345 robot.sot.push(robot.contactRF.task.name)
346 robot.sot.push(robot.contactLF.task.name)
347 robot.sot.push(robot.taskCom.task.name)
348 robot.sot.push(robot.keepWaist.task.name)
351 plug(robot.device.velocity, robot.dynamic.velocity)
352 robot.dvdt = Derivator_of_Vector(
"dv_dt")
353 robot.dvdt.dt.value = dt
354 plug(robot.device.velocity, robot.dvdt.sin)
355 plug(robot.dvdt.sout, robot.dynamic.acceleration)
363 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
367 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
370 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
374 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
378 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
381 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
385 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
388 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
391 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
394 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
398 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
401 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
404 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
407 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
417 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
420 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
424 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
427 robot.publisher, robot.rightAnkleController,
"pRef", robot=robot, data_type=
"vector"
430 robot.publisher, robot.rightAnkleController,
"dRP", robot=robot, data_type=
"vector"
434 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"
437 robot.publisher, robot.leftAnkleController,
"pRef", robot=robot, data_type=
"vector"
440 robot.publisher, robot.leftAnkleController,
"dRP", robot=robot, data_type=
"vector"