5 from dynamic_graph
import plug
6 from dynamic_graph.sot.core
import (
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)
57 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
58 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
61 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
62 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
66 wp = DummyWalkingPatternGenerator(
"dummy_wp")
68 wp.omega.value = omega
70 robot.dynamic.WT.value
72 plug(robot.lfToMatrix.sout, wp.footLeft)
73 plug(robot.rfToMatrix.sout, wp.footRight)
74 plug(robot.comTrajGen.x, wp.com)
75 plug(robot.comTrajGen.dx, wp.vcom)
76 plug(robot.comTrajGen.ddx, wp.acom)
80 robot.wp.comDes.recompute(0)
81 robot.wp.dcmDes.recompute(0)
82 robot.wp.zmpDes.recompute(0)
94 rf = SimpleReferenceFrame(
"rf")
96 plug(robot.dynamic.LF, rf.footLeft)
97 plug(robot.dynamic.RF, rf.footRight)
101 stf = StateTransformation(
"stf")
103 plug(robot.rf.referenceFrame, stf.referenceFrame)
104 plug(robot.base_estimator.q, stf.q_in)
105 plug(robot.base_estimator.v, stf.v_in)
109 e2q = EulerToQuat(
"e2q")
110 plug(robot.stf.q, e2q.euler)
114 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
115 robot.rdynamic.setModel(robot.dynamic.model)
116 robot.rdynamic.setData(robot.rdynamic.model.createData())
117 plug(robot.stf.q, robot.rdynamic.position)
118 robot.rdynamic.velocity.value = [0.0] * robotDim
119 robot.rdynamic.acceleration.value = [0.0] * robotDim
122 cdc_estimator = DcmEstimator(
"cdc_estimator")
123 cdc_estimator.init(dt, robot_name)
124 plug(robot.e2q.quaternion, cdc_estimator.q)
125 plug(robot.stf.v, cdc_estimator.v)
126 robot.cdc_estimator = cdc_estimator
129 estimator = DummyDcmEstimator(
"dummy")
130 estimator.omega.value = omega
131 estimator.mass.value = 1.0
132 plug(robot.cdc_estimator.c, estimator.com)
133 plug(robot.cdc_estimator.dc, estimator.momenta)
135 robot.estimator = estimator
141 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
142 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
143 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
144 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
145 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
146 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
147 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
149 robot.zmp_estimator = zmp_estimator
154 Kp_com = [0.0] * 2 + [4.0]
156 comErr = operator.Substract_of_vector(
"comErr")
157 plug(robot.wp.comDes, comErr.sin1)
158 plug(robot.cdc_estimator.c, comErr.sin2)
159 robot.comErr = comErr
161 comControl = operator.Multiply_of_vector(
"comControl")
162 comControl.sin0.value = Kp_com
163 plug(robot.comErr.sout, comControl.sin1)
164 robot.comControl = comControl
166 forceControl = operator.Add_of_vector(
"forceControl")
167 plug(robot.comControl.sout, forceControl.sin1)
168 forceControl.sin2.value = [0.0, 0.0, mass * g]
169 robot.forceControl = forceControl
171 wrenchControl = operator.Mix_of_vector(
"wrenchControl")
172 wrenchControl.setSignalNumber(3)
173 wrenchControl.addSelec(1, 0, 3)
174 wrenchControl.addSelec(2, 3, 3)
175 wrenchControl.default.value = [0.0] * 6
176 plug(robot.forceControl.sout, wrenchControl.signal(
"sin1"))
177 wrenchControl.signal(
"sin2").value = [0.0] * 3
178 robot.wrenchControl = wrenchControl
181 distribute = SimpleDistributeWrench(
"distribute")
182 plug(robot.e2q.quaternion, distribute.q)
183 distribute.rho.value = 0.5
184 plug(robot.wrenchControl.sout, distribute.wrenchDes)
185 distribute.init(robot_name)
186 robot.distribute = distribute
189 robot.admBF_Kp = Selec_of_vector(
"admBF_Kp")
190 robot.admBF_Kp.selec(0, 6)
191 robot.admBF_Kp.sin.value = [0.0] * 2 + [3.0] + [0.0] * 3
193 robot.admBF_dqSaturation = Selec_of_vector(
"admBF_dqSaturation")
194 robot.admBF_dqSaturation.selec(0, 6)
195 robot.admBF_dqSaturation.sin.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
198 controller = AdmittanceControllerEndEffector(
"admLF")
200 plug(robot.ftc.left_foot_force_out, controller.force)
201 plug(robot.e2q.quaternion, controller.q)
202 plug(robot.admBF_Kp.sout, controller.Kp)
203 controller.Kd.value = [1.0] * 6
204 plug(robot.distribute.wrenchLeft, controller.w_forceDes)
205 plug(robot.admBF_dqSaturation.sout, controller.dqSaturation)
207 controller.init(dt,
"right_sole_link",
"leg_right_6_joint")
209 robot.admLF = controller
212 controller = AdmittanceControllerEndEffector(
"admRF")
214 plug(robot.ftc.right_foot_force_out, controller.force)
215 plug(robot.e2q.quaternion, controller.q)
216 plug(robot.admBF_Kp.sout, controller.Kp)
217 controller.Kd.value = [1.0] * 6
218 plug(robot.distribute.wrenchRight, controller.w_forceDes)
219 plug(robot.admBF_dqSaturation.sout, controller.dqSaturation)
221 controller.init(dt,
"left_sole_link",
"leg_right_6_joint")
223 robot.admRF = controller
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)
271 robot.contactLF = MetaTaskKine6d(
272 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
277 robot.contactLF.feature.frame(
"desired")
279 robot.contactLF.task.setWithDerivative(
True)
280 robot.contactLF.task.controlGain.value = 0
281 robot.contactLF.feature.position.value = np.eye(4)
282 robot.contactLF.feature.velocity.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
283 robot.contactLF.featureDes.position.value = np.eye(4)
286 plug(robot.admLF.dq, robot.contactLF.featureDes.velocity)
287 locals()[
"contactLF"] = robot.contactLF
290 robot.contactRF = MetaTaskKine6d(
291 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
296 robot.contactRF.feature.frame(
"desired")
298 robot.contactRF.task.setWithDerivative(
True)
299 robot.contactRF.task.controlGain.value = 0
300 robot.contactRF.feature.position.value = np.eye(4)
301 robot.contactRF.feature.velocity.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
302 robot.contactRF.featureDes.position.value = np.eye(4)
305 plug(robot.admRF.dq, robot.contactRF.featureDes.velocity)
306 locals()[
"contactRF"] = robot.contactRF
309 robot.taskCom = MetaTaskKineCom(robot.dynamic)
310 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
311 robot.taskCom.task.controlGain.value = 10
312 robot.taskCom.feature.selec.value =
"011"
315 robot.keepWaist = MetaTaskKine6d(
316 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
318 robot.keepWaist.feature.frame(
"desired")
319 robot.keepWaist.gain.setConstant(300)
320 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
321 robot.keepWaist.feature.selec.value =
"111000"
322 locals()[
"keepWaist"] = robot.keepWaist
371 robot.sot = SOT(
"sot")
372 robot.sot.setSize(robot.dynamic.getDimension())
375 plug(robot.sot.control, robot.cm.ctrl_sot_input)
376 plug(robot.cm.u_safe, robot.device.control)
378 robot.sot.push(robot.taskUpperBody.name)
379 robot.sot.push(robot.contactRF.task.name)
380 robot.sot.push(robot.contactLF.task.name)
381 robot.sot.push(robot.taskCom.task.name)
382 robot.sot.push(robot.keepWaist.task.name)
387 plug(robot.device.velocity, robot.dynamic.velocity)
388 robot.dvdt = Derivator_of_Vector(
"dv_dt")
389 robot.dvdt.dt.value = dt
390 plug(robot.device.velocity, robot.dvdt.sin)
391 plug(robot.dvdt.sout, robot.dynamic.acceleration)
399 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
403 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
406 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
410 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
414 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
418 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
421 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
431 robot.publisher, robot.distribute,
"wrenchLeft", robot=robot, data_type=
"vector"
434 robot.publisher, robot.distribute,
"wrenchRight", robot=robot, data_type=
"vector"
438 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
441 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
445 robot.tracer = TracerRealTime(
"com_tracer")
446 robot.tracer.setBufferSize(80 * (2**20))
447 robot.tracer.open(
"/tmp",
"dg_",
".dat")
448 robot.device.after.addSignal(
"{0}.triger".format(robot.tracer.name))
450 addTrace(robot.tracer, robot.wp,
"comDes")
452 addTrace(robot.tracer, robot.cdc_estimator,
"c")
453 addTrace(robot.tracer, robot.cdc_estimator,
"dc")
455 addTrace(robot.tracer, robot.dynamic,
"com")
457 addTrace(robot.tracer, robot.estimator,
"dcm")
459 addTrace(robot.tracer, robot.dynamic,
"zmp")
460 addTrace(robot.tracer, robot.zmp_estimator,
"zmp")
462 addTrace(robot.tracer, robot.ftc,
"left_foot_force_out")
463 addTrace(robot.tracer, robot.ftc,
"right_foot_force_out")