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
233 Kp_adm = [0.0, 0.0, 0.0]
235 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
236 com_admittance_control.Kp.value = Kp_adm
237 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
238 com_admittance_control.zmpDes.value = (
239 robot.wp.zmpDes.value
241 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
243 com_admittance_control.init(dt)
244 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
246 robot.com_admittance_control = com_admittance_control
248 Kp_adm = [20.0, 10.0, 0.0]
256 Kp_ankles = [-1e-3] * 2
259 controller = AnkleAdmittanceController(
"rightController")
260 plug(robot.ftc.right_foot_force_out, controller.wrench)
261 controller.gainsXY.value = [0.0] * 2
262 plug(robot.distribute.copRight, controller.pRef)
264 robot.rightAnkleController = controller
267 controller = AnkleAdmittanceController(
"leftController")
268 plug(robot.ftc.left_foot_force_out, controller.wrench)
269 controller.gainsXY.value = [0.0] * 2
270 plug(robot.distribute.copLeft, controller.pRef)
272 robot.leftAnkleController = controller
276 robot.cm.addCtrlMode(
"sot_input")
277 robot.cm.setCtrlMode(
"all",
"sot_input")
278 robot.cm.addEmergencyStopSIN(
"zmp")
279 robot.cm.addEmergencyStopSIN(
"distribute")
284 robot.taskUpperBody = Task(
"task_upper_body")
285 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
287 q = list(robot.dynamic.position.value)
288 robot.taskUpperBody.feature.state.value = q
289 robot.taskUpperBody.feature.posture.value = q
292 robot.taskUpperBody.feature.selectDof(18,
True)
293 robot.taskUpperBody.feature.selectDof(19,
True)
294 robot.taskUpperBody.feature.selectDof(20,
True)
295 robot.taskUpperBody.feature.selectDof(21,
True)
296 robot.taskUpperBody.feature.selectDof(22,
True)
297 robot.taskUpperBody.feature.selectDof(23,
True)
298 robot.taskUpperBody.feature.selectDof(24,
True)
299 robot.taskUpperBody.feature.selectDof(25,
True)
300 robot.taskUpperBody.feature.selectDof(26,
True)
301 robot.taskUpperBody.feature.selectDof(27,
True)
302 robot.taskUpperBody.feature.selectDof(28,
True)
303 robot.taskUpperBody.feature.selectDof(29,
True)
304 robot.taskUpperBody.feature.selectDof(30,
True)
305 robot.taskUpperBody.feature.selectDof(31,
True)
306 robot.taskUpperBody.feature.selectDof(32,
True)
307 robot.taskUpperBody.feature.selectDof(33,
True)
308 robot.taskUpperBody.feature.selectDof(34,
True)
309 robot.taskUpperBody.feature.selectDof(35,
True)
310 robot.taskUpperBody.feature.selectDof(36,
True)
311 robot.taskUpperBody.feature.selectDof(37,
True)
313 robot.taskUpperBody.controlGain.value = 100.0
314 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
315 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
319 robot.contactLF = MetaTaskKine6d(
320 "contactLF", robot.rdynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
322 robot.contactLF.feature.frame(
"desired")
323 robot.contactLF.gain.setConstant(0)
324 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
325 plug(robot.leftAnkleController.vDes, robot.contactLF.featureDes.velocity)
326 robot.contactLF.task.setWithDerivative(
True)
327 locals()[
"contactLF"] = robot.contactLF
329 robot.contactRF = MetaTaskKine6d(
330 "contactRF", robot.rdynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
332 robot.contactRF.feature.frame(
"desired")
333 robot.contactRF.gain.setConstant(0)
334 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
335 plug(robot.rightAnkleController.vDes, robot.contactRF.featureDes.velocity)
336 robot.contactRF.task.setWithDerivative(
True)
337 locals()[
"contactRF"] = robot.contactRF
340 robot.taskComH = MetaTaskKineCom(robot.rdynamic, name=
"comH")
341 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
342 robot.taskComH.task.controlGain.value = 1.0
343 robot.taskComH.feature.selec.value =
"100"
346 robot.taskCom = MetaTaskKineCom(robot.rdynamic)
347 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
348 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
349 robot.taskCom.task.controlGain.value = 0
350 robot.taskCom.task.setWithDerivative(
True)
351 robot.taskCom.feature.selec.value =
"011"
354 robot.keepWaist = MetaTaskKine6d(
355 "keepWaist", robot.rdynamic,
"WT", robot.OperationalPointsMap[
"waist"]
357 robot.keepWaist.feature.frame(
"desired")
358 robot.keepWaist.gain.setConstant(1.0)
359 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
360 robot.keepWaist.feature.selec.value =
"111000"
361 locals()[
"keepWaist"] = robot.keepWaist
364 robot.sot = SOT(
"sot")
365 robot.sot.setSize(robot.dynamic.getDimension())
368 plug(robot.sot.control, robot.cm.ctrl_sot_input)
369 plug(robot.cm.u_safe, robot.device.control)
371 robot.sot.push(robot.taskUpperBody.name)
372 robot.sot.push(robot.contactRF.task.name)
373 robot.sot.push(robot.contactLF.task.name)
374 robot.sot.push(robot.taskComH.task.name)
375 robot.sot.push(robot.taskCom.task.name)
376 robot.sot.push(robot.keepWaist.task.name)
380 plug(robot.device.velocity, robot.dynamic.velocity)
381 robot.dvdt = Derivator_of_Vector(
"dv_dt")
382 robot.dvdt.dt.value = dt
383 plug(robot.device.velocity, robot.dvdt.sin)
384 plug(robot.dvdt.sout, robot.dynamic.acceleration)
392 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
396 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
399 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
403 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
407 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
410 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
414 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
417 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
420 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
423 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
427 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
430 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
433 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
436 robot.publisher, robot.distribute,
"wrenchRef", robot=robot, data_type=
"vector"
446 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
449 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
453 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
456 robot.publisher, robot.rightAnkleController,
"pRef", robot=robot, data_type=
"vector"
459 robot.publisher, robot.rightAnkleController,
"dRP", robot=robot, data_type=
"vector"
463 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"
466 robot.publisher, robot.leftAnkleController,
"pRef", robot=robot, data_type=
"vector"
469 robot.publisher, robot.leftAnkleController,
"dRP", robot=robot, data_type=
"vector"