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
27 from dynamic_graph.sot_talos_balance.simple_controller_6d
import SimpleController6d
29 cm_conf.CTRL_MAX = 1000.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)
64 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
65 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
70 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
71 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
77 robot.waistMix = Mix_of_vector(
"waistMix")
78 robot.waistMix.setSignalNumber(3)
79 robot.waistMix.addSelec(1, 0, 3)
80 robot.waistMix.addSelec(2, 3, 3)
81 robot.waistMix.default.value = [0.0] * 6
82 robot.waistMix.signal(
"sin1").value = [0.0] * 3
83 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
85 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
86 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
90 robot.rhoScalar = Component_of_vector(
"rho_scalar")
91 robot.rhoScalar.setIndex(0)
92 plug(robot.rhoTrajGen.x, robot.rhoScalar.sin)
96 wp = DummyWalkingPatternGenerator(
"dummy_wp")
98 wp.omega.value = omega
99 plug(robot.waistToMatrix.sout, wp.waist)
100 plug(robot.lfToMatrix.sout, wp.footLeft)
101 plug(robot.rfToMatrix.sout, wp.footRight)
102 plug(robot.comTrajGen.x, wp.com)
103 plug(robot.comTrajGen.dx, wp.vcom)
104 plug(robot.comTrajGen.ddx, wp.acom)
109 robot.wp.comDes.recompute(0)
110 robot.wp.dcmDes.recompute(0)
111 robot.wp.zmpDes.recompute(0)
120 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
121 plug(robot.dynamic.LF, robot.m2qLF.sin)
122 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
123 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
124 plug(robot.dynamic.RF, robot.m2qRF.sin)
125 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
147 e2q = EulerToQuat(
"e2q")
148 plug(robot.base_estimator.q, e2q.euler)
152 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
153 robot.rdynamic.setModel(robot.dynamic.model)
154 robot.rdynamic.setData(robot.rdynamic.model.createData())
157 robot.baseselec = Selec_of_vector(
"base_selec")
158 robot.baseselec.selec(0, 6)
159 plug(robot.base_estimator.q, robot.baseselec.sin)
160 plug(robot.baseselec.sout, robot.rdynamic.ffposition)
162 plug(robot.device.state, robot.rdynamic.position)
163 robot.rdynamic.velocity.value = [0.0] * robotDim
164 robot.rdynamic.acceleration.value = [0.0] * robotDim
167 cdc_estimator = DcmEstimator(
"cdc_estimator")
168 cdc_estimator.init(dt, robot_name)
169 plug(robot.e2q.quaternion, cdc_estimator.q)
170 plug(robot.base_estimator.v, cdc_estimator.v)
171 robot.cdc_estimator = cdc_estimator
174 estimator = DummyDcmEstimator(
"dummy")
175 estimator.omega.value = omega
176 estimator.mass.value = 1.0
177 plug(robot.cdc_estimator.c, estimator.com)
178 plug(robot.cdc_estimator.dc, estimator.momenta)
180 robot.estimator = estimator
186 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
187 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
188 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
189 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
190 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
191 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
192 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
194 robot.zmp_estimator = zmp_estimator
199 Kp_dcm = [5.0, 5.0, 5.0]
200 Ki_dcm = [0.0, 0.0, 0.0]
203 dcm_controller = DcmController(
"dcmCtrl")
205 dcm_controller.Kp.value = Kp_dcm
206 dcm_controller.Ki.value = Ki_dcm
207 dcm_controller.decayFactor.value = gamma_dcm
208 dcm_controller.mass.value = mass
209 dcm_controller.omega.value = omega
211 plug(robot.cdc_estimator.c, dcm_controller.com)
212 plug(robot.estimator.dcm, dcm_controller.dcm)
214 plug(robot.wp.zmpDes, dcm_controller.zmpDes)
215 plug(robot.wp.dcmDes, dcm_controller.dcmDes)
217 dcm_controller.init(dt)
219 robot.dcm_control = dcm_controller
221 Ki_dcm = [1.0, 1.0, 1.0]
224 Kp_adm = [0.0, 0.0, 0.0]
226 com_admittance_control = ComAdmittanceController(
"comAdmCtrl")
227 com_admittance_control.Kp.value = Kp_adm
228 plug(robot.zmp_estimator.zmp, com_admittance_control.zmp)
229 com_admittance_control.zmpDes.value = (
230 robot.wp.zmpDes.value
232 plug(robot.wp.acomDes, com_admittance_control.ddcomDes)
234 com_admittance_control.init(dt)
235 com_admittance_control.setState(robot.wp.comDes.value, [0.0, 0.0, 0.0])
237 robot.com_admittance_control = com_admittance_control
239 Kp_adm = [20.0, 10.0, 0.0]
243 robot.cm.addCtrlMode(
"sot_input")
244 robot.cm.setCtrlMode(
"all",
"sot_input")
245 robot.cm.addEmergencyStopSIN(
"zmp")
250 robot.taskUpperBody = Task(
"task_upper_body")
251 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
253 q = list(robot.dynamic.position.value)
254 robot.taskUpperBody.feature.state.value = q
255 robot.taskUpperBody.feature.posture.value = q
258 robot.taskUpperBody.feature.selectDof(18,
True)
259 robot.taskUpperBody.feature.selectDof(19,
True)
260 robot.taskUpperBody.feature.selectDof(20,
True)
261 robot.taskUpperBody.feature.selectDof(21,
True)
262 robot.taskUpperBody.feature.selectDof(22,
True)
263 robot.taskUpperBody.feature.selectDof(23,
True)
264 robot.taskUpperBody.feature.selectDof(24,
True)
265 robot.taskUpperBody.feature.selectDof(25,
True)
266 robot.taskUpperBody.feature.selectDof(26,
True)
267 robot.taskUpperBody.feature.selectDof(27,
True)
268 robot.taskUpperBody.feature.selectDof(28,
True)
269 robot.taskUpperBody.feature.selectDof(29,
True)
270 robot.taskUpperBody.feature.selectDof(30,
True)
271 robot.taskUpperBody.feature.selectDof(31,
True)
272 robot.taskUpperBody.feature.selectDof(32,
True)
273 robot.taskUpperBody.feature.selectDof(33,
True)
274 robot.taskUpperBody.feature.selectDof(34,
True)
275 robot.taskUpperBody.feature.selectDof(35,
True)
276 robot.taskUpperBody.feature.selectDof(36,
True)
277 robot.taskUpperBody.feature.selectDof(37,
True)
279 robot.taskUpperBody.controlGain.value = 100.0
280 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
281 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
285 robot.contactLF = MetaTaskKine6d(
286 "contactLF", robot.rdynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
288 robot.contactLF.feature.frame(
"desired")
289 robot.contactLF.gain.setConstant(0)
290 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
291 locals()[
"contactLF"] = robot.contactLF
293 robot.contactRF = MetaTaskKine6d(
294 "contactRF", robot.rdynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
296 robot.contactRF.feature.frame(
"desired")
297 robot.contactRF.gain.setConstant(0)
298 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
299 locals()[
"contactRF"] = robot.contactRF
302 robot.taskComH = MetaTaskKineCom(robot.rdynamic, name=
"comH")
303 plug(robot.wp.comDes, robot.taskComH.featureDes.errorIN)
304 robot.taskComH.task.controlGain.value = 1.0
305 robot.taskComH.feature.selec.value =
"100"
308 robot.taskCom = MetaTaskKineCom(robot.rdynamic)
309 plug(robot.com_admittance_control.comRef, robot.taskCom.featureDes.errorIN)
310 plug(robot.com_admittance_control.dcomRef, robot.taskCom.featureDes.errordotIN)
311 robot.taskCom.task.controlGain.value = 0
312 robot.taskCom.task.setWithDerivative(
True)
313 robot.taskCom.feature.selec.value =
"011"
316 robot.keepWaist = MetaTaskKine6d(
317 "keepWaist", robot.rdynamic,
"WT", robot.OperationalPointsMap[
"waist"]
319 robot.keepWaist.feature.frame(
"desired")
320 robot.keepWaist.gain.setConstant(1.0)
321 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
322 robot.keepWaist.feature.selec.value =
"111000"
323 locals()[
"keepWaist"] = robot.keepWaist
326 robot.sot = SOT(
"sot")
327 robot.sot.setSize(robot.dynamic.getDimension())
330 plug(robot.sot.control, robot.cm.ctrl_sot_input)
331 plug(robot.cm.u_safe, robot.device.control)
333 robot.sot.push(robot.taskUpperBody.name)
334 robot.sot.push(robot.contactRF.task.name)
335 robot.sot.push(robot.contactLF.task.name)
336 robot.sot.push(robot.taskComH.task.name)
337 robot.sot.push(robot.taskCom.task.name)
338 robot.sot.push(robot.keepWaist.task.name)
342 plug(robot.device.velocity, robot.dynamic.velocity)
343 robot.dvdt = Derivator_of_Vector(
"dv_dt")
344 robot.dvdt.dt.value = dt
345 plug(robot.device.velocity, robot.dvdt.sin)
346 plug(robot.dvdt.sout, robot.dynamic.acceleration)
354 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
358 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
361 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
365 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
369 robot.publisher, robot.dcm_control,
"dcmDes", robot=robot, data_type=
"vector"
372 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
376 robot.publisher, robot.dcm_control,
"zmpDes", robot=robot, data_type=
"vector"
379 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
382 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
385 robot.publisher, robot.dcm_control,
"zmpRef", robot=robot, data_type=
"vector"
389 robot.publisher, robot.dcm_control,
"wrenchRef", robot=robot, data_type=
"vector"
399 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
402 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
406 robot.publisher, robot.zmp_estimator,
"copRight", robot=robot, data_type=
"vector"
409 robot.publisher, robot.zmp_estimator,
"copLeft", robot=robot, data_type=
"vector"