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 cm_conf.CTRL_MAX = 10.0
30 robot.timeStep = robot.device.getTimeStep()
35 robot.dynamic.com.recompute(0)
36 robotDim = robot.dynamic.getDimension()
37 mass = robot.dynamic.data.mass[0]
38 h = robot.dynamic.com.value[2]
46 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
47 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
48 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
49 robot.dynamic.LF.recompute(0)
50 robot.dynamic.RF.recompute(0)
51 robot.dynamic.WT.recompute(0)
56 if test_folder
is not None:
57 if sot_talos_balance_folder:
58 from rospkg
import RosPack
62 folder = rospack.get_path(
"sot-talos-balance") +
"/data/" + test_folder
71 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
72 robot.triggerTrajGen.sin.value = 0
76 robot.comTrajGen.x.recompute(0)
77 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
81 robot.lfTrajGen.x.recompute(0)
83 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
84 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
85 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
89 robot.rfTrajGen.x.recompute(0)
91 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
92 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
93 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
97 robot.zmpTrajGen.x.recompute(0)
98 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
102 robot.waistTrajGen.x.recompute(0)
104 robot.waistMix = Mix_of_vector(
"waistMix")
105 robot.waistMix.setSignalNumber(3)
106 robot.waistMix.addSelec(1, 0, 3)
107 robot.waistMix.addSelec(2, 3, 3)
108 robot.waistMix.default.value = [0.0] * 6
109 robot.waistMix.signal(
"sin1").value = [0.0] * 3
110 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
112 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
113 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
114 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
117 if folder
is not None:
118 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
119 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
120 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
122 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
126 wp = DummyWalkingPatternGenerator(
"dummy_wp")
128 wp.omega.value = omega
129 plug(robot.waistToMatrix.sout, wp.waist)
130 plug(robot.lfToMatrix.sout, wp.footLeft)
131 plug(robot.rfToMatrix.sout, wp.footRight)
132 plug(robot.comTrajGen.x, wp.com)
133 plug(robot.comTrajGen.dx, wp.vcom)
134 plug(robot.comTrajGen.ddx, wp.acom)
141 robot.wp.comDes.recompute(0)
142 robot.wp.dcmDes.recompute(0)
143 robot.wp.zmpDes.recompute(0)
152 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
153 plug(robot.dynamic.LF, robot.m2qLF.sin)
154 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
155 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
156 plug(robot.dynamic.RF, robot.m2qRF.sin)
157 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
162 e2q = EulerToQuat(
"e2q")
163 plug(robot.base_estimator.q, e2q.euler)
167 robot.rdynamic = DynamicPinocchio(
"real_dynamics")
168 robot.rdynamic.setModel(robot.dynamic.model)
169 robot.rdynamic.setData(robot.rdynamic.model.createData())
170 plug(robot.base_estimator.q, robot.rdynamic.position)
171 robot.rdynamic.velocity.value = [0.0] * robotDim
172 robot.rdynamic.acceleration.value = [0.0] * robotDim
175 cdc_estimator = DcmEstimator(
"cdc_estimator")
176 cdc_estimator.init(dt, robot_name)
177 plug(robot.e2q.quaternion, cdc_estimator.q)
178 plug(robot.base_estimator.v, cdc_estimator.v)
179 robot.cdc_estimator = cdc_estimator
182 estimator = DummyDcmEstimator(
"dummy")
183 plug(robot.wp.omegaDes, estimator.omega)
184 estimator.mass.value = 1.0
185 plug(robot.cdc_estimator.c, estimator.com)
186 plug(robot.cdc_estimator.dc, estimator.momenta)
188 robot.estimator = estimator
194 zmp_estimator = SimpleZmpEstimator(
"zmpEst")
195 robot.rdynamic.createOpPoint(
"sole_LF",
"left_sole_link")
196 robot.rdynamic.createOpPoint(
"sole_RF",
"right_sole_link")
197 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
198 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
199 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
200 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
202 robot.zmp_estimator = zmp_estimator
206 robot.cm.addCtrlMode(
"sot_input")
207 robot.cm.setCtrlMode(
"all",
"sot_input")
208 robot.cm.addEmergencyStopSIN(
"zmp")
213 robot.taskUpperBody = Task(
"task_upper_body")
214 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
216 q = list(robot.dynamic.position.value)
217 robot.taskUpperBody.feature.state.value = q
218 robot.taskUpperBody.feature.posture.value = q
220 robotDim = robot.dynamic.getDimension()
221 for i
in range(18, robotDim):
222 robot.taskUpperBody.feature.selectDof(i,
True)
224 robot.taskUpperBody.controlGain.value = 100.0
225 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
226 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
230 robot.contactLF = MetaTaskKine6d(
231 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
233 robot.contactLF.feature.frame(
"desired")
234 robot.contactLF.gain.setConstant(300)
235 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
236 locals()[
"contactLF"] = robot.contactLF
238 robot.contactRF = MetaTaskKine6d(
239 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
241 robot.contactRF.feature.frame(
"desired")
242 robot.contactRF.gain.setConstant(300)
243 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
244 locals()[
"contactRF"] = robot.contactRF
247 robot.taskCom = MetaTaskKineCom(robot.dynamic)
248 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
250 robot.taskCom.task.controlGain.value = 100.0
254 robot.keepWaist = MetaTaskKine6d(
255 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
257 robot.keepWaist.feature.frame(
"desired")
258 robot.keepWaist.gain.setConstant(300)
259 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
260 robot.keepWaist.feature.selec.value =
"111000"
261 locals()[
"keepWaist"] = robot.keepWaist
264 robot.sot = SOT(
"sot")
265 robot.sot.setSize(robot.dynamic.getDimension())
268 plug(robot.sot.control, robot.cm.ctrl_sot_input)
269 plug(robot.cm.u_safe, robot.device.control)
271 robot.sot.push(robot.taskUpperBody.name)
272 robot.sot.push(robot.contactRF.task.name)
273 robot.sot.push(robot.contactLF.task.name)
274 robot.sot.push(robot.taskCom.task.name)
275 robot.sot.push(robot.keepWaist.task.name)
280 plug(robot.device.velocity, robot.dynamic.velocity)
281 robot.dvdt = Derivator_of_Vector(
"dv_dt")
282 robot.dvdt.dt.value = dt
283 plug(robot.device.velocity, robot.dvdt.sin)
284 plug(robot.dvdt.sout, robot.dynamic.acceleration)
291 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
293 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
297 robot.publisher, robot.comTrajGen,
"x", robot=robot, data_type=
"vector"
300 robot.publisher, robot.comTrajGen,
"dx", robot=robot, data_type=
"vector"
303 robot.publisher, robot.comTrajGen,
"ddx", robot=robot, data_type=
"vector"
307 robot.publisher, robot.wp,
"comDes", robot=robot, data_type=
"vector"
311 robot.publisher, robot.cdc_estimator,
"c", robot=robot, data_type=
"vector"
314 robot.publisher, robot.cdc_estimator,
"dc", robot=robot, data_type=
"vector"
318 robot.publisher, robot.dynamic,
"com", robot=robot, data_type=
"vector"
322 robot.publisher, robot.wp,
"dcmDes", robot=robot, data_type=
"vector"
325 robot.publisher, robot.estimator,
"dcm", robot=robot, data_type=
"vector"
329 robot.publisher, robot.zmpTrajGen,
"x", robot=robot, data_type=
"vector"
332 robot.publisher, robot.wp,
"zmpDes", robot=robot, data_type=
"vector"
335 robot.publisher, robot.dynamic,
"zmp", robot=robot, data_type=
"vector"
338 robot.publisher, robot.zmp_estimator,
"zmp", robot=robot, data_type=
"vector"
348 robot.publisher, robot.waistTrajGen,
"x", robot=robot, data_type=
"vector"
352 robot.publisher, robot.lfTrajGen,
"x", robot=robot, data_type=
"vector"
355 robot.publisher, robot.rfTrajGen,
"x", robot=robot, data_type=
"vector"
359 robot.publisher, robot.ftc,
"left_foot_force_out", robot=robot, data_type=
"vector"
362 robot.publisher, robot.ftc,
"right_foot_force_out", robot=robot, data_type=
"vector"
366 robot.publisher, robot.dynamic,
"LF", robot=robot, data_type=
"matrixHomo"
369 robot.publisher, robot.dynamic,
"RF", robot=robot, data_type=
"matrixHomo"