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.ft_calibration_conf
as ft_conf
25 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
28 robot.timeStep = robot.device.getTimeStep()
33 robot.dynamic.com.recompute(0)
34 robotDim = robot.dynamic.getDimension()
35 mass = robot.dynamic.data.mass[0]
36 h = robot.dynamic.com.value[2]
44 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
45 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
46 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
47 robot.dynamic.LF.recompute(0)
48 robot.dynamic.RF.recompute(0)
49 robot.dynamic.WT.recompute(0)
61 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
62 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
67 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
68 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
74 robot.waistMix = Mix_of_vector(
"waistMix")
75 robot.waistMix.setSignalNumber(3)
76 robot.waistMix.addSelec(1, 0, 3)
77 robot.waistMix.addSelec(2, 3, 3)
78 robot.waistMix.default.value = [0.0] * 6
79 robot.waistMix.signal(
"sin1").value = [0.0] * 3
80 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
82 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
83 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
87 wp = DummyWalkingPatternGenerator(
"dummy_wp")
89 wp.omega.value = omega
90 plug(robot.waistToMatrix.sout, wp.waist)
91 plug(robot.lfToMatrix.sout, wp.footLeft)
92 plug(robot.rfToMatrix.sout, wp.footRight)
93 plug(robot.comTrajGen.x, wp.com)
94 plug(robot.comTrajGen.dx, wp.vcom)
95 plug(robot.comTrajGen.ddx, wp.acom)
100 robot.wp.comDes.recompute(0)
101 robot.wp.dcmDes.recompute(0)
102 robot.wp.zmpDes.recompute(0)
111 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
112 plug(robot.dynamic.LF, robot.m2qLF.sin)
113 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
114 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
115 plug(robot.dynamic.RF, robot.m2qRF.sin)
116 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
138 e2q = EulerToQuat(
"e2q")
139 plug(robot.base_estimator.q, e2q.euler)
143 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
144 robot.rdynamic.setModel(robot.dynamic.model)
145 robot.rdynamic.setData(robot.rdynamic.model.createData())
146 plug(robot.base_estimator.q, robot.rdynamic.position)
147 robot.rdynamic.velocity.value = [0.0] * robotDim
148 robot.rdynamic.acceleration.value = [0.0] * robotDim
151 cdc_estimator = DcmEstimator(
"cdc_estimator")
152 cdc_estimator.init(dt, robot_name)
153 plug(robot.e2q.quaternion, cdc_estimator.q)
154 plug(robot.base_estimator.v, cdc_estimator.v)
155 robot.cdc_estimator = cdc_estimator
158 estimator = DummyDcmEstimator(
"dummy")
159 estimator.omega.value = omega
160 estimator.mass.value = 1.0
161 plug(robot.cdc_estimator.c, estimator.com)
162 plug(robot.cdc_estimator.dc, estimator.momenta)
164 robot.estimator = estimator
170 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
171 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
172 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
173 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
174 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
175 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
176 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
178 robot.zmp_estimator = zmp_estimator
183 Kp_dcm = [5.0, 5.0, 5.0]
184 Ki_dcm = [0.0, 0.0, 0.0]
187 dcm_controller = DcmController(
"dcmCtrl")
189 dcm_controller.Kp.value = Kp_dcm
190 dcm_controller.Ki.value = Ki_dcm
191 dcm_controller.decayFactor.value = gamma_dcm
192 dcm_controller.mass.value = mass
193 dcm_controller.omega.value = omega
195 plug(robot.cdc_estimator.c, dcm_controller.com)
196 plug(robot.estimator.dcm, dcm_controller.dcm)
198 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
199 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
201 dcm_controller.init(dt)
203 robot.dcm_control = dcm_controller
205 Ki_dcm = [1.0, 1.0, 1.0]
208 Kp_adm = [0.0, 0.0, 0.0]
210 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
211 com_admittance_control.Kp.value = Kp_adm
212 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
213 com_admittance_control.zmpDes.value = (
214 robot.wp.zmpDes.value
216 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
218 com_admittance_control.init(dt)
219 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
221 robot.com_admittance_control = com_admittance_control
223 Kp_adm = [20.0, 10.0, 0.0]
227 robot.cm.addCtrlMode(
"sot_input")
228 robot.cm.setCtrlMode(
"all",
"sot_input")
229 robot.cm.addEmergencyStopSIN(
"zmp")
234 robot.taskUpperBody = Task(
"task_upper_body")
235 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
237 q = list(robot.dynamic.position.value)
238 robot.taskUpperBody.feature.state.value = q
239 robot.taskUpperBody.feature.posture.value = q
242 robot.taskUpperBody.feature.selectDof(18,
True)
243 robot.taskUpperBody.feature.selectDof(19,
True)
244 robot.taskUpperBody.feature.selectDof(20,
True)
245 robot.taskUpperBody.feature.selectDof(21,
True)
246 robot.taskUpperBody.feature.selectDof(22,
True)
247 robot.taskUpperBody.feature.selectDof(23,
True)
248 robot.taskUpperBody.feature.selectDof(24,
True)
249 robot.taskUpperBody.feature.selectDof(25,
True)
250 robot.taskUpperBody.feature.selectDof(26,
True)
251 robot.taskUpperBody.feature.selectDof(27,
True)
252 robot.taskUpperBody.feature.selectDof(28,
True)
253 robot.taskUpperBody.feature.selectDof(29,
True)
254 robot.taskUpperBody.feature.selectDof(30,
True)
255 robot.taskUpperBody.feature.selectDof(31,
True)
256 robot.taskUpperBody.feature.selectDof(32,
True)
257 robot.taskUpperBody.feature.selectDof(33,
True)
258 robot.taskUpperBody.feature.selectDof(34,
True)
259 robot.taskUpperBody.feature.selectDof(35,
True)
260 robot.taskUpperBody.feature.selectDof(36,
True)
261 robot.taskUpperBody.feature.selectDof(37,
True)
263 robot.taskUpperBody.controlGain.value = 100.0
264 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
265 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
269 robot.contactLF = MetaTaskKine6d(
270 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
272 robot.contactLF.feature.frame(
"desired")
273 robot.contactLF.gain.setConstant(300)
274 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
275 locals()[
"contactLF"] = robot.contactLF
277 robot.contactRF = MetaTaskKine6d(
278 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
280 robot.contactRF.feature.frame(
"desired")
281 robot.contactRF.gain.setConstant(300)
282 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
283 locals()[
"contactRF"] = robot.contactRF
286 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
287 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
288 robot.taskComH.task.controlGain.value = 100.0
289 robot.taskComH.feature.selec.value =
"100"
292 robot.taskCom = MetaTaskKineCom(robot.dynamic)
293 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
294 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
295 robot.taskCom.task.controlGain.value = 0
296 robot.taskCom.task.setWithDerivative(
True)
297 robot.taskCom.feature.selec.value =
"011"
300 robot.keepWaist = MetaTaskKine6d(
301 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
303 robot.keepWaist.feature.frame(
"desired")
304 robot.keepWaist.gain.setConstant(300)
305 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
306 robot.keepWaist.feature.selec.value =
"111000"
307 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.wp,
"comDes", robot=robot, data_type=
"vector"
395 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
398 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
403 robot.com_admittance_control,
409 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
413 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
416 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
420 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
423 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
426 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
429 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
439 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
442 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
446 robot.tracer = TracerRealTime(
"com_tracer")
447 robot.tracer.setBufferSize(80 * (2**20))
448 robot.tracer.open(
"/tmp",
"dg_",
".dat")
449 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
451 addTrace(robot.tracer, robot.wp,
"comDes")
453 addTrace(robot.tracer, robot.cdc_estimator,
"c")
454 addTrace(robot.tracer, robot.cdc_estimator,
"dc")
456 addTrace(robot.tracer, robot.com_admittance_control,
"comRef")
457 addTrace(robot.tracer, robot.dynamic,
"com")
459 addTrace(robot.tracer, robot.dcm_control,
"dcmDes")
460 addTrace(robot.tracer, robot.estimator,
"dcm")
462 addTrace(robot.tracer, robot.dcm_control,
"zmpDes")
463 addTrace(robot.tracer, robot.dynamic,
"zmp")
464 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
465 addTrace(robot.tracer, robot.dcm_control,
"zmpRef")
467 addTrace(robot.tracer, robot.ftc,
"left_foot_force_out")
468 addTrace(robot.tracer, robot.ftc,
"right_foot_force_out")