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
21 from rospkg
import RosPack
23 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
24 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_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
29 cm_conf.CTRL_MAX = 100.0
31 robot.timeStep = robot.device.getTimeStep()
36 robot.dynamic.com.recompute(0)
37 robotDim = robot.dynamic.getDimension()
38 mass = robot.dynamic.data.mass[0]
39 h = robot.dynamic.com.value[2]
47 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
48 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
49 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
50 robot.dynamic.LF.recompute(0)
51 robot.dynamic.RF.recompute(0)
52 robot.dynamic.WT.recompute(0)
58 data_folder = rospack.get_path(
"sot-talos-balance") +
"/data/"
59 folder = data_folder + test_folder +
"/"
64 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
65 robot.triggerTrajGen.sin.value = 0
69 robot.comTrajGen.x.recompute(0)
70 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
71 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
75 robot.lfTrajGen.x.recompute(0)
77 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
78 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
79 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
80 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
84 robot.rfTrajGen.x.recompute(0)
86 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
87 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
88 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
89 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
93 robot.zmpTrajGen.x.recompute(0)
95 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
99 robot.waistTrajGen.x.recompute(0)
101 robot.waistMix = Mix_of_vector(
"waistMix")
102 robot.waistMix.setSignalNumber(3)
103 robot.waistMix.addSelec(1, 0, 3)
104 robot.waistMix.addSelec(2, 3, 3)
105 robot.waistMix.default.value = [0.0] * 6
106 robot.waistMix.signal(
"sin1").value = [0.0] * 3
107 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
109 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
110 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
111 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
112 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
116 wp = DummyWalkingPatternGenerator(
"dummy_wp")
118 wp.omega.value = omega
125 plug(robot.waistToMatrix.sout, wp.waist)
126 plug(robot.lfToMatrix.sout, wp.footLeft)
127 plug(robot.rfToMatrix.sout, wp.footRight)
128 plug(robot.comTrajGen.x, wp.com)
129 plug(robot.comTrajGen.dx, wp.vcom)
130 plug(robot.comTrajGen.ddx, wp.acom)
136 robot.wp.comDes.recompute(0)
137 robot.wp.dcmDes.recompute(0)
138 robot.wp.zmpDes.recompute(0)
147 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
148 plug(robot.dynamic.LF, robot.m2qLF.sin)
149 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
150 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
151 plug(robot.dynamic.RF, robot.m2qRF.sin)
152 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
174 e2q = EulerToQuat(
"e2q")
175 plug(robot.base_estimator.q, e2q.euler)
179 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
180 robot.rdynamic.setModel(robot.dynamic.model)
181 robot.rdynamic.setData(robot.rdynamic.model.createData())
182 plug(robot.base_estimator.q, robot.rdynamic.position)
183 robot.rdynamic.velocity.value = [0.0] * robotDim
184 robot.rdynamic.acceleration.value = [0.0] * robotDim
187 cdc_estimator = DcmEstimator(
"cdc_estimator")
188 cdc_estimator.init(dt, robot_name)
189 plug(robot.e2q.quaternion, cdc_estimator.q)
190 plug(robot.base_estimator.v, cdc_estimator.v)
191 robot.cdc_estimator = cdc_estimator
194 estimator = DummyDcmEstimator(
"dummy")
195 estimator.omega.value = omega
196 estimator.mass.value = 1.0
197 plug(robot.cdc_estimator.c, estimator.com)
198 plug(robot.cdc_estimator.dc, estimator.momenta)
200 robot.estimator = estimator
206 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
207 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
208 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
209 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
210 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
211 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
212 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
214 robot.zmp_estimator = zmp_estimator
220 Ki_dcm = [0.0, 0.0, 0.0]
223 dcm_controller = DcmController(
"dcmCtrl")
225 dcm_controller.Kp.value = Kp_dcm
226 dcm_controller.Ki.value = Ki_dcm
227 dcm_controller.decayFactor.value = gamma_dcm
228 dcm_controller.mass.value = mass
229 dcm_controller.omega.value = omega
231 plug(robot.cdc_estimator.c, dcm_controller.com)
232 plug(robot.estimator.dcm, dcm_controller.dcm)
234 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
235 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
237 dcm_controller.init(dt)
239 robot.dcm_control = dcm_controller
241 Ki_dcm = [1.0, 1.0, 1.0]
244 Kp_adm = [0.0, 0.0, 0.0]
246 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
247 com_admittance_control.Kp.value = Kp_adm
248 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
249 com_admittance_control.zmpDes.value = (
250 robot.wp.zmpDes.value
252 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
254 com_admittance_control.init(dt)
255 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
257 robot.com_admittance_control = com_admittance_control
259 Kp_adm = [15.0, 15.0, 0.0]
263 robot.cm.addCtrlMode(
"sot_input")
264 robot.cm.setCtrlMode(
"all",
"sot_input")
265 robot.cm.addEmergencyStopSIN(
"zmp")
270 robot.taskUpperBody = Task(
"task_upper_body")
271 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
273 q = list(robot.dynamic.position.value)
274 robot.taskUpperBody.feature.state.value = q
275 robot.taskUpperBody.feature.posture.value = q
278 robot.taskUpperBody.feature.selectDof(18,
True)
279 robot.taskUpperBody.feature.selectDof(19,
True)
280 robot.taskUpperBody.feature.selectDof(20,
True)
281 robot.taskUpperBody.feature.selectDof(21,
True)
282 robot.taskUpperBody.feature.selectDof(22,
True)
283 robot.taskUpperBody.feature.selectDof(23,
True)
284 robot.taskUpperBody.feature.selectDof(24,
True)
285 robot.taskUpperBody.feature.selectDof(25,
True)
286 robot.taskUpperBody.feature.selectDof(26,
True)
287 robot.taskUpperBody.feature.selectDof(27,
True)
288 robot.taskUpperBody.feature.selectDof(28,
True)
289 robot.taskUpperBody.feature.selectDof(29,
True)
290 robot.taskUpperBody.feature.selectDof(30,
True)
291 robot.taskUpperBody.feature.selectDof(31,
True)
292 robot.taskUpperBody.feature.selectDof(32,
True)
293 robot.taskUpperBody.feature.selectDof(33,
True)
294 robot.taskUpperBody.feature.selectDof(34,
True)
295 robot.taskUpperBody.feature.selectDof(35,
True)
296 robot.taskUpperBody.feature.selectDof(36,
True)
297 robot.taskUpperBody.feature.selectDof(37,
True)
299 robot.taskUpperBody.controlGain.value = 100.0
300 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
301 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
305 robot.contactLF = MetaTaskKine6d(
306 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
308 robot.contactLF.feature.frame(
"desired")
309 robot.contactLF.gain.setConstant(300)
310 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
311 locals()[
"contactLF"] = robot.contactLF
313 robot.contactRF = MetaTaskKine6d(
314 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
316 robot.contactRF.feature.frame(
"desired")
317 robot.contactRF.gain.setConstant(300)
318 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
319 locals()[
"contactRF"] = robot.contactRF
322 robot.taskComH = MetaTaskKineCom(robot.dynamic, name=
"comH")
323 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
324 robot.taskComH.task.controlGain.value = 100.0
325 robot.taskComH.feature.selec.value =
"100"
328 robot.taskCom = MetaTaskKineCom(robot.dynamic)
329 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
330 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
331 robot.taskCom.task.controlGain.value = 0
332 robot.taskCom.task.setWithDerivative(
True)
333 robot.taskCom.feature.selec.value =
"011"
336 robot.keepWaist = MetaTaskKine6d(
337 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
339 robot.keepWaist.feature.frame(
"desired")
340 robot.keepWaist.gain.setConstant(300)
341 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
342 robot.keepWaist.feature.selec.value =
"111000"
343 locals()[
"keepWaist"] = robot.keepWaist
392 robot.sot = SOT(
"sot")
393 robot.sot.setSize(robot.dynamic.getDimension())
396 plug(robot.sot.control, robot.cm.ctrl_sot_input)
397 plug(robot.cm.u_safe, robot.device.control)
399 robot.sot.push(robot.taskUpperBody.name)
400 robot.sot.push(robot.contactRF.task.name)
401 robot.sot.push(robot.contactLF.task.name)
402 robot.sot.push(robot.taskComH.task.name)
403 robot.sot.push(robot.taskCom.task.name)
404 robot.sot.push(robot.keepWaist.task.name)
409 plug(robot.device.velocity, robot.dynamic.velocity)
410 robot.dvdt = Derivator_of_Vector(
"dv_dt")
411 robot.dvdt.dt.value = dt
412 plug(robot.device.velocity, robot.dvdt.sin)
413 plug(robot.dvdt.sout, robot.dynamic.acceleration)
420 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
422 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
427 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
430 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
433 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
437 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
441 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
444 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
449 robot.com_admittance_control,
455 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
459 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
462 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
466 robot.publisher, robot.zmpTrajGen,
"x", robot=robot, data_type=
"vector"
469 robot.publisher, robot.wp,
"zmpDes", robot=robot, data_type=
"vector"
472 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
475 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
478 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
488 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
492 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
495 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
499 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
502 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
506 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
509 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"
513 robot.tracer = TracerRealTime(
"com_tracer")
514 robot.tracer.setBufferSize(80 * (2**20))
515 robot.tracer.open(
"/tmp",
"dg_",
".dat")
516 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
518 addTrace(robot.tracer, robot.wp,
"comDes")
520 addTrace(robot.tracer, robot.cdc_estimator,
"c")
521 addTrace(robot.tracer, robot.cdc_estimator,
"dc")
523 addTrace(robot.tracer, robot.com_admittance_control,
"comRef")
524 addTrace(robot.tracer, robot.dynamic,
"com")
526 addTrace(robot.tracer, robot.dcm_control,
"dcmDes")
527 addTrace(robot.tracer, robot.estimator,
"dcm")
529 addTrace(robot.tracer, robot.dcm_control,
"zmpDes")
530 addTrace(robot.tracer, robot.dynamic,
"zmp")
531 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
532 addTrace(robot.tracer, robot.dcm_control,
"zmpRef")
534 addTrace(robot.tracer, robot.ftc,
"left_foot_force_out")
535 addTrace(robot.tracer, robot.ftc,
"right_foot_force_out")
537 addTrace(robot.tracer, robot.dynamic,
"LF")
538 addTrace(robot.tracer, robot.dynamic,
"RF")