6 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf
as base_estimator_conf
7 import dynamic_graph.sot_talos_balance.talos.control_manager_conf
as cm_conf
8 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf
as ft_conf
9 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf
as param_server_conf
10 from dynamic_graph
import plug
11 from dynamic_graph.sot.core
import (
15 MatrixHomoToPoseQuaternion,
18 from dynamic_graph.sot.core.matrix_util
import matrixToTuple
19 from dynamic_graph.sot.core.meta_tasks_kine
import (
24 from dynamic_graph.sot.dynamics_pinocchio
import DynamicPinocchio
25 from dynamic_graph.tracer_real_time
import TracerRealTime
28 robot.timeStep = robot.device.getTimeStep()
30 robot.device.setControlInputType(
"noInteg")
34 robot.dynamic.com.recompute(0)
35 robotDim = robot.dynamic.getDimension()
36 mass = robot.dynamic.data.mass[0]
37 h = robot.dynamic.com.value[2]
45 robot.dynamic.createOpPoint(
"LF", robot.OperationalPointsMap[
"left-ankle"])
46 robot.dynamic.createOpPoint(
"RF", robot.OperationalPointsMap[
"right-ankle"])
47 robot.dynamic.createOpPoint(
"WT", robot.OperationalPointsMap[
"waist"])
48 robot.dynamic.LF.recompute(0)
49 robot.dynamic.RF.recompute(0)
50 robot.dynamic.WT.recompute(0)
55 if test_folder
is not None:
56 if sot_talos_balance_folder:
57 from rospkg
import RosPack
61 folder = rospack.get_path(
"sot-talos-balance") +
"/data/" + test_folder
70 robot.triggerTrajGen = BooleanIdentity(
"triggerTrajGen")
71 robot.triggerTrajGen.sin.value = 0
75 robot.comTrajGen.x.recompute(0)
76 plug(robot.triggerTrajGen.sout, robot.comTrajGen.trigger)
80 robot.lfTrajGen.x.recompute(0)
82 robot.lfToMatrix = PoseRollPitchYawToMatrixHomo(
"lf2m")
83 plug(robot.lfTrajGen.x, robot.lfToMatrix.sin)
84 plug(robot.triggerTrajGen.sout, robot.lfTrajGen.trigger)
88 robot.rfTrajGen.x.recompute(0)
90 robot.rfToMatrix = PoseRollPitchYawToMatrixHomo(
"rf2m")
91 plug(robot.rfTrajGen.x, robot.rfToMatrix.sin)
92 plug(robot.triggerTrajGen.sout, robot.rfTrajGen.trigger)
96 robot.zmpTrajGen.x.recompute(0)
97 plug(robot.triggerTrajGen.sout, robot.zmpTrajGen.trigger)
101 robot.waistTrajGen.x.recompute(0)
103 robot.waistMix = Mix_of_vector(
"waistMix")
104 robot.waistMix.setSignalNumber(3)
105 robot.waistMix.addSelec(1, 0, 3)
106 robot.waistMix.addSelec(2, 3, 3)
107 robot.waistMix.default.value = [0.0] * 6
108 robot.waistMix.signal(
"sin1").value = [0.0] * 3
109 plug(robot.waistTrajGen.x, robot.waistMix.signal(
"sin2"))
111 robot.waistToMatrix = PoseRollPitchYawToMatrixHomo(
"w2m")
112 plug(robot.waistMix.sout, robot.waistToMatrix.sin)
113 plug(robot.triggerTrajGen.sout, robot.waistTrajGen.trigger)
116 if folder
is not None:
117 robot.comTrajGen.playTrajectoryFile(folder +
"CoM.dat")
118 robot.lfTrajGen.playTrajectoryFile(folder +
"LeftFoot.dat")
119 robot.rfTrajGen.playTrajectoryFile(folder +
"RightFoot.dat")
121 robot.waistTrajGen.playTrajectoryFile(folder +
"WaistOrientation.dat")
125 wp = DummyWalkingPatternGenerator(
"dummy_wp")
127 wp.omega.value = omega
128 plug(robot.waistToMatrix.sout, wp.waist)
129 plug(robot.lfToMatrix.sout, wp.footLeft)
130 plug(robot.rfToMatrix.sout, wp.footRight)
131 plug(robot.comTrajGen.x, wp.com)
132 plug(robot.comTrajGen.dx, wp.vcom)
133 plug(robot.comTrajGen.ddx, wp.acom)
140 robot.wp.comDes.recompute(0)
141 robot.wp.dcmDes.recompute(0)
142 robot.wp.zmpDes.recompute(0)
151 robot.m2qLF = MatrixHomoToPoseQuaternion(
"m2qLF")
152 plug(robot.dynamic.LF, robot.m2qLF.sin)
153 plug(robot.m2qLF.sout, robot.base_estimator.lf_ref_xyzquat)
154 robot.m2qRF = MatrixHomoToPoseQuaternion(
"m2qRF")
155 plug(robot.dynamic.RF, robot.m2qRF.sin)
156 plug(robot.m2qRF.sout, robot.base_estimator.rf_ref_xyzquat)
163 robot.taskUpperBody = Task(
"task_upper_body")
164 robot.taskUpperBody.feature = FeaturePosture(
"feature_upper_body")
166 q = list(robot.dynamic.position.value)
167 robot.taskUpperBody.feature.state.value = q
168 robot.taskUpperBody.feature.posture.value = q
170 robotDim = robot.dynamic.getDimension()
171 for i
in range(18, robotDim):
172 robot.taskUpperBody.feature.selectDof(i,
True)
174 robot.taskUpperBody.controlGain.value = 100.0
175 robot.taskUpperBody.add(robot.taskUpperBody.feature.name)
176 plug(robot.dynamic.position, robot.taskUpperBody.feature.state)
180 robot.contactLF = MetaTaskKine6d(
181 "contactLF", robot.dynamic,
"LF", robot.OperationalPointsMap[
"left-ankle"]
183 robot.contactLF.feature.frame(
"desired")
184 robot.contactLF.gain.setConstant(300)
185 plug(robot.wp.footLeftDes, robot.contactLF.featureDes.position)
186 locals()[
"contactLF"] = robot.contactLF
188 robot.contactRF = MetaTaskKine6d(
189 "contactRF", robot.dynamic,
"RF", robot.OperationalPointsMap[
"right-ankle"]
191 robot.contactRF.feature.frame(
"desired")
192 robot.contactRF.gain.setConstant(300)
193 plug(robot.wp.footRightDes, robot.contactRF.featureDes.position)
194 locals()[
"contactRF"] = robot.contactRF
197 robot.taskCom = MetaTaskKineCom(robot.dynamic)
198 plug(robot.wp.comDes, robot.taskCom.featureDes.errorIN)
199 robot.taskCom.task.controlGain.value = 100.0
202 robot.keepWaist = MetaTaskKine6d(
203 "keepWaist", robot.dynamic,
"WT", robot.OperationalPointsMap[
"waist"]
205 robot.keepWaist.feature.frame(
"desired")
206 robot.keepWaist.gain.setConstant(300)
207 plug(robot.wp.waistDes, robot.keepWaist.featureDes.position)
208 robot.keepWaist.feature.selec.value =
"111000"
209 locals()[
"keepWaist"] = robot.keepWaist
212 robot.sot = SOT(
"sot")
213 robot.sot.setSize(robot.dynamic.getDimension())
216 robot.integrate = SimpleStateIntegrator(
"integrate")
217 robot.integrate.init(dt)
218 robot.integrate.setState(robot.device.state.value)
219 robot.integrate.setVelocity(robot.dynamic.getDimension() * [0.0])
222 plug(robot.sot.control, robot.integrate.control)
223 plug(robot.integrate.state, robot.device.control)
225 robot.sot.push(robot.taskUpperBody.name)
226 robot.sot.push(robot.contactRF.task.name)
227 robot.sot.push(robot.contactLF.task.name)
228 robot.sot.push(robot.taskCom.task.name)
229 robot.sot.push(robot.keepWaist.task.name)
233 robot.delay_vel.setMemory(robot.dynamic.getDimension() * [0.0])
234 robot.device.before.addSignal(robot.delay_vel.name +
".current")
235 plug(robot.sot.control, robot.delay_vel.sin)
238 plug(robot.delay_vel.previous, robot.vselec.sin)
241 plug(robot.delay_vel.previous, robot.dynamic.velocity)
242 robot.dvdt = Derivator_of_Vector(
"dv_dt")
243 robot.dvdt.dt.value = dt
244 plug(robot.delay_vel.previous, robot.dvdt.sin)
245 plug(robot.dvdt.sout, robot.dynamic.acceleration)
252 create_topic(robot.publisher, robot.device,
"state", robot=robot, data_type=
"vector")
254 robot.publisher, robot.base_estimator,
"q", robot=robot, data_type=
"vector"
257 robot.publisher, robot.imu_filters,
"imu_quat", robot=robot, data_type=
"vector"
261 robot.publisher, robot.base_estimator,
"w_lf", robot=robot, data_type=
"double"
264 robot.publisher, robot.base_estimator,
"w_rf", robot=robot, data_type=
"double"
268 robot.base_estimator,
275 robot.base_estimator,
282 robot.publisher, robot.device,
"forceLLEG", robot=robot, data_type=
"vector"
286 robot.device_filters.ft_LF_filter,
293 robot.publisher, robot.device,
"forceRLEG", robot=robot, data_type=
"vector"
297 robot.device_filters.ft_RF_filter,
304 robot.publisher, robot.base_estimator,
"lf_xyzquat", robot=robot, data_type=
"vector"
307 robot.publisher, robot.base_estimator,
"rf_xyzquat", robot=robot, data_type=
"vector"