sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
create_entities_utils.py
Go to the documentation of this file.
1 from time import sleep
2 
3 import numpy as np
4 from dynamic_graph import plug
5 from dynamic_graph.sot.core.madgwickahrs import MadgwickAHRS
6 from dynamic_graph.sot.core.operator import Mix_of_vector, Selec_of_vector
7 from dynamic_graph.sot.core.parameter_server import ParameterServer
8 from dynamic_graph.sot_talos_balance.admittance_controller_end_effector import (
9  AdmittanceControllerEndEffector,
10 )
11 from dynamic_graph.sot_talos_balance.ankle_admittance_controller import (
12  AnkleAdmittanceController,
13 )
14 from dynamic_graph.sot_talos_balance.com_admittance_controller import (
15  ComAdmittanceController,
16 )
17 from dynamic_graph.sot_talos_balance.dcm_com_controller import DcmComController
18 from dynamic_graph.sot_talos_balance.dcm_controller import DcmController
19 from dynamic_graph.sot_talos_balance.dcm_estimator import DcmEstimator
20 from dynamic_graph.sot_talos_balance.distribute_wrench import DistributeWrench
21 from dynamic_graph.sot_talos_balance.dummy_dcm_estimator import DummyDcmEstimator
22 from dynamic_graph.sot_talos_balance.example import Example
23 from dynamic_graph.sot_talos_balance.ft_calibration import FtCalibration
24 from dynamic_graph.sot_talos_balance.ft_wrist_calibration import FtWristCalibration
25 from dynamic_graph.sot_talos_balance.hip_flexibility_compensation import (
26  HipFlexibilityCompensation,
27 )
28 from dynamic_graph.sot_talos_balance.joint_position_controller import (
29  JointPositionController,
30 )
31 from dynamic_graph.sot_talos_balance.nd_trajectory_generator import (
32  NdTrajectoryGenerator,
33 )
34 from dynamic_graph.sot_talos_balance.qualisys_client import QualisysClient
35 from dynamic_graph.sot_talos_balance.simple_admittance_controller import (
36  SimpleAdmittanceController,
37 )
38 from dynamic_graph.sot_talos_balance.simple_distribute_wrench import (
39  SimpleDistributeWrench,
40 )
41 from dynamic_graph.sot_talos_balance.simple_zmp_estimator import SimpleZmpEstimator
42 from dynamic_graph.sot_talos_balance.talos_base_estimator import TalosBaseEstimator
43 from dynamic_graph.sot_talos_balance.talos_control_manager import TalosControlManager
44 
45 # python
46 from dynamic_graph.sot_talos_balance.utils import filter_utils
47 from dynamic_graph.sot_talos_balance.utils.sot_utils import Bunch
48 from dynamic_graph.tracer_real_time import TracerRealTime
49 
50 N_JOINTS = 32
51 
52 
54  mocap = QualisysClient("mocap")
55  mocap.setMocapIPAdress(address)
56  mocap.init()
57  return mocap
58 
59 
60 # helper function. May need to move somewhere else
62  rx = np.arctan2(R[2, 1], R[2, 2])
63  ry = np.arctan2(-R[2, 0], np.sqrt(R[2, 1] * R[2, 1] + R[2, 2] * R[2, 2]))
64  rz = np.arctan2(R[1, 0], R[0, 0])
65 
66  return (rx, ry, rz)
67 
68 
69 def create_extend_mix(n_in, n_out):
70  assert n_out > n_in
71  mix_of_vector = Mix_of_vector("mix " + str(n_in) + "-" + str(n_out))
72 
73  mix_of_vector.setSignalNumber(3)
74 
75  n_diff = n_out - n_in
76  mix_of_vector.addSelec(1, 0, n_diff)
77  mix_of_vector.addSelec(2, n_diff, n_in)
78 
79  mix_of_vector.default.value = [0.0] * n_out
80  mix_of_vector.signal("sin1").value = [0.0] * n_diff
81  mix_of_vector.signal("sin2").value = [2.0] * n_in
82 
83  return mix_of_vector
84 
85 
86 def create_scalar_trajectory_generator(dt, init_value, name):
87  trajGen = NdTrajectoryGenerator(name)
88  trajGen.initial_value.value = [init_value]
89  trajGen.trigger.value = 1
90  trajGen.init(dt, 1)
91  return trajGen
92 
93 
95  jtg = NdTrajectoryGenerator("jtg")
96  jtg.initial_value.value = robot.device.state.value[6:]
97  jtg.trigger.value = 1
98  jtg.init(dt, N_JOINTS)
99  return jtg
100 
101 
103  N_CONFIG = N_JOINTS + 6
104  jtg = NdTrajectoryGenerator("jtg")
105  jtg.initial_value.value = robot.device.state.value
106  jtg.trigger.value = 1
107  jtg.init(dt, N_CONFIG)
108  return jtg
109 
110 
112  N_CONFIG = N_JOINTS + 6
113  jtg = NdTrajectoryGenerator("torqueTrajGen")
114  jtg.initial_value.value = [0.0] * N_CONFIG
115  jtg.trigger.value = 1
116  jtg.init(dt, N_CONFIG)
117  return jtg
118 
119 
121  comTrajGen = NdTrajectoryGenerator("comTrajGen")
122  comTrajGen.initial_value.value = robot.dynamic.com.value
123  comTrajGen.trigger.value = 1
124  comTrajGen.init(dt, 3)
125  return comTrajGen
126 
127 
129  comTrajGen = NdTrajectoryGenerator("zmpTrajGen")
130  zmp = list(robot.dynamic.com.value)
131  zmp[2] = 0.0
132  comTrajGen.initial_value.value = np.array(zmp)
133  comTrajGen.trigger.value = 1
134  comTrajGen.init(dt, 3)
135  return comTrajGen
136 
137 
138 def create_position_trajectory_generator(dt, robot, signal_name):
139  trajGen = NdTrajectoryGenerator(signal_name + "PosTrajGen")
140 
141  M = robot.dynamic.signal(signal_name).value
142  v = [M[i][3] for i in range(3)]
143  trajGen.initial_value.value = v
144 
145  trajGen.trigger.value = 1
146  trajGen.init(dt, 3)
147  return trajGen
148 
149 
151  trajGen = NdTrajectoryGenerator(signal_name + "OrientationTrajGen")
152 
153  M = robot.dynamic.signal(signal_name).value
154  v = list(rotation_matrix_to_rpy(np.array(M)[:3, :3]))
155  trajGen.initial_value.value = np.array(v)
156 
157  trajGen.trigger.value = 1
158  trajGen.init(dt, 3)
159  return trajGen
160 
161 
162 def create_pose_rpy_trajectory_generator(dt, robot, signal_name):
163  trajGen = NdTrajectoryGenerator(signal_name + "TrajGen")
164 
165  M = robot.dynamic.signal(signal_name).value
166  pos = [M[i][3] for i in range(3)]
167  euler = list(rotation_matrix_to_rpy(np.array(M)[:3, :3]))
168  v = pos + euler
169  trajGen.initial_value.value = np.array(v)
170 
171  trajGen.trigger.value = 1
172  trajGen.init(dt, 6)
173  return trajGen
174 
175 
177  controller = JointPositionController("posctrl")
178  controller.Kp.value = Kp
179  return controller
180 
181 
182 def create_end_effector_admittance_controller(robot, endEffector, name):
183  timeStep = robot.timeStep
184  controller = AdmittanceControllerEndEffector(name)
185 
186  # Filter and plug the force from force calibrator
187  if endEffector == "rightWrist":
188  plug(robot.forceCalibrator.rightWristForceOut, controller.force)
189  elif endEffector == "leftWrist":
190  plug(robot.forceCalibrator.leftWristForceOut, controller.force)
191  else:
192  print(
193  "Error in create_end_effector_admittance_controller : end \
194  effector unknown"
195  )
196 
197  plug(robot.e2q.quaternion, controller.q)
198 
199  controller.Kp.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
200  controller.Kd.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
201  controller.w_forceDes.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
202  controller.dqSaturation.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
203 
204  if endEffector == "rightWrist":
205  controller.init(timeStep, "wrist_right_ft_link", "arm_right_7_joint")
206  elif endEffector == "leftWrist":
207  controller.init(timeStep, "wrist_left_ft_link", "arm_left_7_joint")
208  else:
209  print(
210  "Error in create_end_effector_admittance_controller : end \
211  effector unknown"
212  )
213 
214  return controller
215 
216 
217 def create_joint_admittance_controller(joint, Kp, dt, robot, filter=False):
218  controller = SimpleAdmittanceController("jadmctrl")
219  controller.Kp.value = Kp
220 
221  robot.stateselec = Selec_of_vector("state_selec")
222  robot.stateselec.selec(joint + 6, joint + 7)
223  plug(robot.device.state, robot.stateselec.sin)
224  plug(robot.stateselec.sout, controller.state)
225 
226  robot.tauselec = Selec_of_vector("tau_selec")
227  robot.tauselec.selec(joint, joint + 1)
228  if filter and hasattr(robot, "device_filters"):
229  plug(robot.device_filters.torque_filter.x_filtered, robot.tauselec.sin)
230  else:
231  plug(robot.device.ptorque, robot.tauselec.sin)
232  plug(robot.tauselec.sout, controller.tau)
233 
234  controller.tauDes.value = [0.0]
235  controller.init(dt, 1)
236  controller.setPosition([robot.device.state.value[joint + 6]])
237  return controller
238 
239 
240 def create_hip_flexibility_compensation(robot, conf, robot_name="robot"):
241  timeStep = robot.timeStep
242  hipComp = HipFlexibilityCompensation("hipFlexCompensation")
243  hipComp.K_l.value = conf.flexibility_left
244  hipComp.K_r.value = conf.flexibility_right
245  hipComp.q_des.value = robot.dynamic.getDimension() * [0.0]
246  plug(robot.device.ptorque, hipComp.tau)
247  hipComp.init(timeStep, robot_name)
248 
249  hipComp.setAngularSaturation(conf.angular_saturation)
250  hipComp.setRateLimiter(conf.rate_limiter)
251  hipComp.setTorqueLowPassFilterFrequency(conf.torque_low_pass_freq)
252  return hipComp
253 
254 
255 def create_ankle_admittance_controller(gains, robot, side, name):
256  controller = AnkleAdmittanceController(name)
257 
258  # Filter and plug the force from force calibrator
259  if side == "right":
260  plug(robot.ftc.right_foot_force_out, controller.wrench)
261  elif side == "left":
262  plug(robot.ftc.left_foot_force_out, controller.wrench)
263  else:
264  print("Error in create_ankle_admittance_controller : side unknown")
265 
266  controller.gainsXY.value = gains
267  if side == "right":
268  plug(robot.wrenchDistributor.copRight, controller.pRef)
269  elif side == "left":
270  plug(robot.wrenchDistributor.copLeft, controller.pRef)
271  else:
272  print("Error in create_ankle_admittance_controller : side unknown")
273 
274  controller.init()
275 
276  return controller
277 
278 
279 def create_device_filters(robot, dt):
280  robot.pselec = Selec_of_vector("pselec")
281  robot.pselec.selec(6, 6 + N_JOINTS)
282  plug(robot.device.state, robot.pselec.sin)
283 
284  robot.vselec = Selec_of_vector("vselec")
285  robot.vselec.selec(6, 6 + N_JOINTS)
286  plug(robot.device.velocity, robot.vselec.sin)
287 
288  filters = Bunch()
289  filters.joints_kin = filter_utils.create_chebi1_checby2_series_filter(
290  "joints_kin", dt, N_JOINTS
291  )
292  filters.ft_RF_filter = filter_utils.create_butter_lp_filter_Wn_04_N_2(
293  "ft_RF_filter", dt, 6
294  )
295  filters.ft_LF_filter = filter_utils.create_butter_lp_filter_Wn_04_N_2(
296  "ft_LF_filter", dt, 6
297  )
298  filters.ft_RH_filter = filter_utils.create_butter_lp_filter_Wn_04_N_2(
299  "ft_RH_filter", dt, 6
300  )
301  filters.ft_LH_filter = filter_utils.create_butter_lp_filter_Wn_04_N_2(
302  "ft_LH_filter", dt, 6
303  )
304  filters.torque_filter = filter_utils.create_chebi1_checby2_series_filter(
305  "ptorque_filter", dt, N_JOINTS
306  )
307  filters.acc_filter = filter_utils.create_chebi1_checby2_series_filter(
308  "acc_filter", dt, 3
309  )
310  filters.gyro_filter = filter_utils.create_chebi1_checby2_series_filter(
311  "gyro_filter", dt, 3
312  )
313  filters.vel_filter = filter_utils.create_butter_lp_filter_Wn_04_N_2(
314  "vel_filter", dt, N_JOINTS
315  )
316 
317  # plug(robot.pselec.sout, filters.joints_kin.x)
318  plug(robot.device.joint_angles, filters.joints_kin.x)
319  plug(robot.device.forceRLEG, filters.ft_RF_filter.x)
320  plug(robot.device.forceLLEG, filters.ft_LF_filter.x)
321  plug(robot.device.forceRARM, filters.ft_RH_filter.x)
322  plug(robot.device.forceLARM, filters.ft_LH_filter.x)
323  plug(robot.device.ptorque, filters.torque_filter.x)
324  plug(robot.vselec.sout, filters.vel_filter.x)
325 
326  plug(robot.device.accelerometer, filters.acc_filter.x)
327  plug(robot.device.gyrometer, filters.gyro_filter.x)
328 
329  return filters
330 
331 
332 def create_be_filters(robot, dt):
333  be_filters = Bunch()
334  be_filters.test = filter_utils.create_chebi1_checby2_series_filter(
335  "test_filter", dt, N_JOINTS
336  )
337  plug(robot.base_estimator.q, be_filters.test.x)
338  return be_filters
339 
340 
341 def create_ctrl_manager(conf, dt, robot_name="robot"):
342  ctrl_manager = TalosControlManager("ctrl_man")
343  ctrl_manager.add_commands()
344  ctrl_manager.add_signals()
345  ctrl_manager.init(dt, robot_name)
346  ctrl_manager.u_max.value = np.array(conf.NJ * (conf.CTRL_MAX,))
347  # Init should be called before addCtrlMode
348  # because the size of state vector must be known.
349  return ctrl_manager
350 
351 
352 def create_base_estimator(robot, dt, conf, robot_name="robot"):
353  base_estimator = TalosBaseEstimator("base_estimator")
354  base_estimator.init(dt, robot_name)
355  # device.state, device.joint_angles or device.motor_angles ?
356  # plug(robot.pselec.sout, base_estimator.joint_positions)
357  plug(robot.device.joint_angles, base_estimator.joint_positions)
358  plug(robot.device_filters.ft_LF_filter.x_filtered, base_estimator.forceLLEG)
359  plug(robot.device_filters.ft_RF_filter.x_filtered, base_estimator.forceRLEG)
360  plug(robot.device_filters.ft_LF_filter.dx, base_estimator.dforceLLEG)
361  plug(robot.device_filters.ft_RF_filter.dx, base_estimator.dforceRLEG)
362 
363  plug(robot.vselec.sout, base_estimator.joint_velocities)
364  # plug(robot.device_filters.vel_filter.x_filtered, base_estimator.joint_velocities)
365  plug(robot.imu_filters.imu_quat, base_estimator.imu_quaternion)
366  plug(robot.device_filters.gyro_filter.x_filtered, base_estimator.gyroscope)
367  plug(robot.device_filters.acc_filter.x_filtered, base_estimator.accelerometer)
368  base_estimator.K_fb_feet_poses.value = conf.K_fb_feet_poses
369  # base_estimator.w_lf_in.value = conf.w_lf_in
370  # base_estimator.w_rf_in.value = conf.w_rf_in
371  base_estimator.set_imu_weight(conf.w_imu)
372  base_estimator.set_stiffness_right_foot(np.array(conf.K))
373  base_estimator.set_stiffness_left_foot(np.array(conf.K))
374  base_estimator.set_zmp_std_dev_right_foot(conf.std_dev_zmp)
375  base_estimator.set_zmp_std_dev_left_foot(conf.std_dev_zmp)
376  base_estimator.set_normal_force_std_dev_right_foot(conf.std_dev_fz)
377  base_estimator.set_normal_force_std_dev_left_foot(conf.std_dev_fz)
378  base_estimator.set_zmp_margin_right_foot(conf.zmp_margin)
379  base_estimator.set_zmp_margin_left_foot(conf.zmp_margin)
380  base_estimator.set_normal_force_margin_right_foot(conf.normal_force_margin)
381  base_estimator.set_normal_force_margin_left_foot(conf.normal_force_margin)
382  base_estimator.set_right_foot_sizes(np.array(conf.RIGHT_FOOT_SIZES))
383  base_estimator.set_left_foot_sizes(np.array(conf.LEFT_FOOT_SIZES))
384 
385  return base_estimator
386 
387 
388 def create_imu_filters(robot, dt):
389  imu_filter = MadgwickAHRS("imu_filter")
390  imu_filter.init(dt)
391  imu_filter.set_imu_quat(np.array([0.0, 1.0, 0.0, 0.0])) # [w, x, y, z]
392  imu_filter.setBeta(1e-3)
393  plug(
394  robot.device_filters.acc_filter.x_filtered, imu_filter.accelerometer
395  ) # no IMU compensation
396  plug(
397  robot.device_filters.gyro_filter.x_filtered, imu_filter.gyroscope
398  ) # no IMU compensation
399  return imu_filter
400 
401 
402 def addTrace(tracer, entity, signalName):
403  """
404  Add a signal to a tracer
405  """
406  signal = "{0}.{1}".format(entity.name, signalName)
407  filename = "{0}-{1}".format(entity.name, signalName)
408  tracer.add(signal, filename)
409 
410 
411 def addSignalsToTracer(tracer, device, outputs):
412  for sign in outputs:
413  addTrace(tracer, device, sign)
414  return
415 
416 
417 def create_tracer(robot, entity, tracer_name, outputs=None):
418  tracer = TracerRealTime(tracer_name)
419  tracer.setBufferSize(80 * (2**20))
420  tracer.open("/tmp", "dg_", ".dat")
421  robot.device.after.addSignal("{0}.triger".format(tracer.name))
422  if outputs is not None:
423  addSignalsToTracer(tracer, entity, outputs)
424  return tracer
425 
426 
427 def reset_tracer(device, tracer):
428  tracer.stop()
429  sleep(0.2)
430  tracer.close()
431  sleep(0.2)
432  tracer.clear()
433  sleep(0.2)
434  tracer = create_tracer(device, tracer.name)
435  return tracer
436 
437 
438 def dump_tracer(tracer):
439  tracer.stop()
440  sleep(0.2)
441  tracer.dump()
442  sleep(0.2)
443  tracer.close()
444 
445 
446 def create_rospublish(robot, name):
447  from dynamic_graph.ros import RosPublish
448 
449  rospub = RosPublish(name)
450  robot.device.after.addSignal(rospub.name + ".trigger")
451  return rospub
452 
453 
454 def create_topic(rospub, entity, signalName, robot=None, data_type="vector"):
455  # check needed to prevent creation of broken topic
456  if not entity.hasSignal(signalName):
457  raise AttributeError(
458  "Entity %s does not have signal %s" % (entity.name, signalName)
459  )
460  rospub_signalName = "{0}_{1}".format(entity.name, signalName)
461  topicname = "/sot/{0}/{1}".format(entity.name, signalName)
462  rospub.add(data_type, rospub_signalName, topicname)
463  plug(entity.signal(signalName), rospub.signal(rospub_signalName))
464  if robot is not None:
465  robot.device.after.addSignal("{0}.{1}".format(entity.name, signalName))
466 
467 
469  from math import sqrt
470 
471  estimator = DummyDcmEstimator("dummy")
472  robot.dynamic.com.recompute(0)
473  mass = robot.dynamic.data.mass[0]
474  h = robot.dynamic.com.value[2]
475  g = 9.81
476  omega = sqrt(g / h)
477 
478  estimator.mass.value = mass
479  estimator.omega.value = omega
480  plug(robot.dynamic.com, estimator.com)
481  plug(robot.dynamic.momenta, estimator.momenta)
482  estimator.init()
483  return estimator
484 
485 
487  from math import sqrt
488 
489  estimator = DummyDcmEstimator("dummy")
490  robot.dynamic.com.recompute(0)
491  h = robot.dynamic.com.value[2]
492  g = 9.81
493  omega = sqrt(g / h)
494 
495  estimator.mass.value = 1.0
496  estimator.omega.value = omega
497  plug(robot.cdc_estimator.c, estimator.com)
498  plug(robot.cdc_estimator.dc, estimator.momenta)
499  estimator.init()
500  return estimator
501 
502 
504  controller = ComAdmittanceController("comAdmCtrl")
505  controller.Kp.value = Kp
506  plug(robot.dynamic.zmp, controller.zmp)
507  robot.dynamic.zmp.recompute(0)
508  controller.zmpDes.value = robot.dynamic.zmp.value
509  controller.ddcomDes.value = [0.0, 0.0, 0.0]
510 
511  controller.init(dt)
512  robot.dynamic.com.recompute(0)
513  controller.setState(robot.dynamic.com.value, [0.0, 0.0, 0.0])
514  return controller
515 
516 
517 def create_dcm_controller(Kp, Ki, dt, robot, dcmSignal):
518  from math import sqrt
519 
520  controller = DcmController("dcmCtrl")
521  robot.dynamic.com.recompute(0)
522  mass = robot.dynamic.data.mass[0]
523  h = robot.dynamic.com.value[2]
524  g = 9.81
525  omega = sqrt(g / h)
526 
527  controller.Kp.value = Kp
528  controller.Ki.value = Ki
529  controller.decayFactor.value = 0.2
530  controller.mass.value = mass
531  controller.omega.value = omega
532 
533  plug(robot.dynamic.com, controller.com)
534  plug(dcmSignal, controller.dcm)
535 
536  robot.dynamic.zmp.recompute(0)
537  controller.zmpDes.value = robot.dynamic.zmp.value
538  controller.dcmDes.value = robot.dynamic.zmp.value
539 
540  controller.init(dt)
541  return controller
542 
543 
544 def create_dcm_com_controller(Kp, Ki, dt, robot, dcmSignal):
545  from math import sqrt
546 
547  controller = DcmComController("dcmComCtrl")
548  robot.dynamic.com.recompute(0)
549  mass = robot.dynamic.data.mass[0]
550  h = robot.dynamic.com.value[2]
551  g = 9.81
552  omega = sqrt(g / h)
553 
554  controller.Kp.value = Kp
555  controller.Ki.value = Ki
556  controller.decayFactor.value = 0.2
557  controller.mass.value = mass
558  controller.omega.value = omega
559 
560  controller.ddcomDes.value = [0.0, 0.0, 0.0]
561 
562  plug(dcmSignal, controller.dcm)
563 
564  robot.dynamic.com.recompute(0)
565  controller.comDes.value = robot.dynamic.com.value
566  controller.dcmDes.value = (
567  robot.dynamic.com.value[0],
568  robot.dynamic.com.value[1],
569  0.0,
570  )
571 
572  controller.init(dt)
573  return controller
574 
575 
576 def fill_parameter_server(param_server, conf, dt, robot_name="robot"):
577  # Init should be called before addCtrlMode
578  # because the size of state vector must be known.
579  param_server.init(dt, conf.urdfFileName, robot_name)
580 
581  # Set the map from joint name to joint ID
582  for key in conf.mapJointNameToID:
583  param_server.setNameToId(key, conf.mapJointNameToID[key])
584 
585  # Set the map joint limits for each id
586  for key in conf.mapJointLimits:
587  param_server.setJointLimitsFromId(
588  key, conf.mapJointLimits[key][0], conf.mapJointLimits[key][1]
589  )
590 
591  # Set the force limits for each id
592  for key in conf.mapForceIdToForceLimits:
593  param_server.setForceLimitsFromId(
594  key,
595  np.array(conf.mapForceIdToForceLimits[key][0]),
596  np.array(conf.mapForceIdToForceLimits[key][1]),
597  )
598 
599  # Set the force sensor id for each sensor name
600  for key in conf.mapNameToForceId:
601  param_server.setForceNameToForceId(key, conf.mapNameToForceId[key])
602 
603  # Set the map from the urdf joint list to the sot joint list
604  param_server.setJointsUrdfToSot(np.array(conf.urdftosot))
605 
606  # Set the foot frame name
607  for key in conf.footFrameNames:
608  param_server.setFootFrameName(key, conf.footFrameNames[key])
609 
610  # Set IMU hosting joint name
611  param_server.setImuJointName(conf.ImuJointName)
612 
613  param_server.setRightFootForceSensorXYZ(np.array(conf.rightFootSensorXYZ))
614  param_server.setRightFootSoleXYZ(np.array(conf.rightFootSoleXYZ))
615 
616  return param_server
617 
618 
619 def create_parameter_server(conf, dt, robot_name="robot"):
620  param_server = ParameterServer("param_server")
621  fill_parameter_server(param_server, conf, dt, robot_name)
622 
623 
624 def create_example(robot_name="robot", firstAdd=0.0, secondAdd=0.0):
625  example = Example("example")
626  example.firstAddend.value = firstAdd
627  example.secondAddend.value = secondAdd
628  example.init(robot_name)
629  return example
630 
631 
632 def create_dcm_estimator(robot, dt, robot_name="robot"):
633  dcm_estimator = DcmEstimator("dcm_estimator")
634  dcm_estimator.init(dt, robot_name)
635  plug(robot.base_estimator.q, dcm_estimator.q)
636  plug(robot.base_estimator.v, dcm_estimator.v)
637  return dcm_estimator
638 
639 
641  distribute = DistributeWrench("distribute")
642 
643  distribute.phase.value = 0
644  distribute.rho.value = 0.5
645 
646  distribute.setMinPressure(conf.minPressure)
647  distribute.frictionCoefficient.value = conf.frictionCoefficient
648  distribute.wSum.value = conf.wSum
649  distribute.wNorm.value = conf.wNorm
650  distribute.wRatio.value = conf.wRatio
651  distribute.wAnkle.value = np.array(conf.wAnkle)
652 
653  distribute.set_right_foot_sizes(np.array(conf.RIGHT_FOOT_SIZES))
654  distribute.set_left_foot_sizes(np.array(conf.LEFT_FOOT_SIZES))
655 
656  return distribute
657 
658 
659 def create_simple_distribute_wrench(name="distribute"):
660  distribute = SimpleDistributeWrench(name)
661 
662  distribute.phase.value = 0
663  distribute.rho.value = 0.5
664 
665  return distribute
666 
667 
668 def create_zmp_estimator(robot, filter=False):
669  estimator = SimpleZmpEstimator("zmpEst")
670  plug(robot.dynamic.LF, estimator.poseLeft)
671  plug(robot.dynamic.RF, estimator.poseRight)
672  if filter and hasattr(robot, "device_filters"):
673  plug(robot.device_filters.ft_LF_filter.x_filtered, estimator.wrenchLeft)
674  plug(robot.device_filters.ft_RF_filter.x_filtered, estimator.wrenchRight)
675  else:
676  plug(robot.device.forceLLEG, estimator.wrenchLeft)
677  plug(robot.device.forceRLEG, estimator.wrenchRight)
678 
679  estimator.init()
680  return estimator
681 
682 
683 def create_ft_calibrator(robot, conf):
684  ftc = FtCalibration("ftc")
685  ftc.init(robot.name)
686  ftc.setRightFootWeight(conf.rfw)
687  ftc.setLeftFootWeight(conf.lfw)
688  plug(robot.device_filters.ft_RF_filter.x_filtered, ftc.right_foot_force_in)
689  plug(robot.device_filters.ft_LF_filter.x_filtered, ftc.left_foot_force_in)
690  return ftc
691 
692 
693 def create_ft_wrist_calibrator(robot, endEffectorWeight, rightOC, leftOC):
694  forceCalibrator = FtWristCalibration("forceCalibrator")
695  forceCalibrator.init(robot.name)
696  forceCalibrator.setRightHandConf(endEffectorWeight, rightOC)
697  forceCalibrator.setLeftHandConf(endEffectorWeight, leftOC)
698  forceCalibrator.setRemoveWeight(True)
699  plug(robot.e2q.quaternion, forceCalibrator.q)
700  plug(
701  robot.device_filters.ft_RH_filter.x_filtered, forceCalibrator.rightWristForceIn
702  )
703  plug(robot.device_filters.ft_LH_filter.x_filtered, forceCalibrator.leftWristForceIn)
704  return forceCalibrator
705 
706 
707 def set_trigger(robot, on):
708  robot.triggerTrajGen.sin.value = 1.0 if on else 0.0
709 
710 
711 def get_trigger(robot):
712  val = robot.triggerTrajGen.sin.value
713  if val == 1:
714  return True
715  elif val == 0:
716  return False
717  else:
718  raise RuntimeError("Bad trigger")
719 
720 
721 def load_folder(robot, folder, zmp=False):
722  if get_trigger(robot):
723  print("Warning: trigger is still active. Not loading folder")
724  return
725  if folder is not None:
726  robot.comTrajGen.playTrajectoryFile(folder + "CoM.dat")
727  robot.lfTrajGen.playTrajectoryFile(folder + "LeftFoot.dat")
728  robot.rfTrajGen.playTrajectoryFile(folder + "RightFoot.dat")
729  if zmp:
730  robot.zmpTrajGen.playTrajectoryFile(folder + "ZMP.dat")
731  robot.waistTrajGen.playTrajectoryFile(folder + "WaistOrientation.dat")
732  try:
733  robot.rhoTrajGen.playTrajectoryFile(folder + "Rho.dat")
734  except AttributeError:
735  pass
736  try:
737  robot.phaseTrajGen.playTrajectoryFile(folder + "Phase.dat")
738  except AttributeError:
739  pass
740  try:
741  robot.torqueTrajGen.playTrajectoryFile(folder + "Torques.dat")
742  except AttributeError:
743  pass
744 
745 
746 def reload_folder(robot, folder, zmp=False):
747  set_trigger(robot, False)
748  load_folder(robot, folder, zmp)
749  set_trigger(robot, True)
sot_talos_balance.create_entities_utils.create_dcm_com_controller
def create_dcm_com_controller(Kp, Ki, dt, robot, dcmSignal)
Definition: create_entities_utils.py:544
sot_talos_balance.create_entities_utils.create_distribute_wrench
def create_distribute_wrench(conf)
Definition: create_entities_utils.py:640
sot_talos_balance.create_entities_utils.set_trigger
def set_trigger(robot, on)
Definition: create_entities_utils.py:707
sot_talos_balance.create_entities_utils.create_ankle_admittance_controller
def create_ankle_admittance_controller(gains, robot, side, name)
Definition: create_entities_utils.py:255
sot_talos_balance.create_entities_utils.create_simple_distribute_wrench
def create_simple_distribute_wrench(name="distribute")
Definition: create_entities_utils.py:659
sot_talos_balance.create_entities_utils.create_ctrl_manager
def create_ctrl_manager(conf, dt, robot_name="robot")
Definition: create_entities_utils.py:341
sot_talos_balance.create_entities_utils.create_ft_calibrator
def create_ft_calibrator(robot, conf)
Definition: create_entities_utils.py:683
sot_talos_balance.create_entities_utils.create_zmp_estimator
def create_zmp_estimator(robot, filter=False)
Definition: create_entities_utils.py:668
sot_talos_balance.create_entities_utils.reset_tracer
def reset_tracer(device, tracer)
Definition: create_entities_utils.py:427
sot_talos_balance.create_entities_utils.create_base_estimator
def create_base_estimator(robot, dt, conf, robot_name="robot")
Definition: create_entities_utils.py:352
sot_talos_balance.create_entities_utils.create_extend_mix
def create_extend_mix(n_in, n_out)
Definition: create_entities_utils.py:69
sot_talos_balance.create_entities_utils.create_com_admittance_controller
def create_com_admittance_controller(Kp, dt, robot)
Definition: create_entities_utils.py:503
sot_talos_balance.create_entities_utils.create_ft_wrist_calibrator
def create_ft_wrist_calibrator(robot, endEffectorWeight, rightOC, leftOC)
Definition: create_entities_utils.py:693
sot_talos_balance.create_entities_utils.reload_folder
def reload_folder(robot, folder, zmp=False)
Definition: create_entities_utils.py:746
sot_talos_balance.create_entities_utils.create_cdc_dcm_estimator
def create_cdc_dcm_estimator(robot)
Definition: create_entities_utils.py:486
sot_talos_balance.create_entities_utils.create_com_trajectory_generator
def create_com_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:120
sot_talos_balance.create_entities_utils.addTrace
def addTrace(tracer, entity, signalName)
Definition: create_entities_utils.py:402
sot_talos_balance.create_entities_utils.create_pose_rpy_trajectory_generator
def create_pose_rpy_trajectory_generator(dt, robot, signal_name)
Definition: create_entities_utils.py:162
sot_talos_balance.create_entities_utils.create_zmp_trajectory_generator
def create_zmp_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:128
sot_talos_balance.create_entities_utils.create_hip_flexibility_compensation
def create_hip_flexibility_compensation(robot, conf, robot_name="robot")
Definition: create_entities_utils.py:240
sot_talos_balance.create_entities_utils.create_joint_admittance_controller
def create_joint_admittance_controller(joint, Kp, dt, robot, filter=False)
Definition: create_entities_utils.py:217
sot_talos_balance.create_entities_utils.create_topic
def create_topic(rospub, entity, signalName, robot=None, data_type="vector")
Definition: create_entities_utils.py:454
sot_talos_balance.create_entities_utils.create_scalar_trajectory_generator
def create_scalar_trajectory_generator(dt, init_value, name)
Definition: create_entities_utils.py:86
sot_talos_balance.create_entities_utils.create_dummy_dcm_estimator
def create_dummy_dcm_estimator(robot)
Definition: create_entities_utils.py:468
sot_talos_balance.create_entities_utils.create_torque_trajectory_generator
def create_torque_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:111
sot_talos_balance.create_entities_utils.dump_tracer
def dump_tracer(tracer)
Definition: create_entities_utils.py:438
sot_talos_balance.create_entities_utils.create_be_filters
def create_be_filters(robot, dt)
Definition: create_entities_utils.py:332
sot_talos_balance.create_entities_utils.create_position_trajectory_generator
def create_position_trajectory_generator(dt, robot, signal_name)
Definition: create_entities_utils.py:138
sot_talos_balance.create_entities_utils.create_tracer
def create_tracer(robot, entity, tracer_name, outputs=None)
Definition: create_entities_utils.py:417
sot_talos_balance.create_entities_utils.create_config_trajectory_generator
def create_config_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:102
sot_talos_balance.create_entities_utils.create_end_effector_admittance_controller
def create_end_effector_admittance_controller(robot, endEffector, name)
Definition: create_entities_utils.py:182
sot_talos_balance.create_entities_utils.addSignalsToTracer
def addSignalsToTracer(tracer, device, outputs)
Definition: create_entities_utils.py:411
sot_talos_balance.create_entities_utils.create_orientation_rpy_trajectory_generator
def create_orientation_rpy_trajectory_generator(dt, robot, signal_name)
Definition: create_entities_utils.py:150
sot_talos_balance.create_entities_utils.fill_parameter_server
def fill_parameter_server(param_server, conf, dt, robot_name="robot")
Definition: create_entities_utils.py:576
sot_talos_balance.create_entities_utils.create_dcm_estimator
def create_dcm_estimator(robot, dt, robot_name="robot")
Definition: create_entities_utils.py:632
sot_talos_balance.create_entities_utils.create_parameter_server
def create_parameter_server(conf, dt, robot_name="robot")
Definition: create_entities_utils.py:619
sot_talos_balance.create_entities_utils.create_dcm_controller
def create_dcm_controller(Kp, Ki, dt, robot, dcmSignal)
Definition: create_entities_utils.py:517
sot_talos_balance.create_entities_utils.create_example
def create_example(robot_name="robot", firstAdd=0.0, secondAdd=0.0)
Definition: create_entities_utils.py:624
sot_talos_balance.create_entities_utils.create_joint_controller
def create_joint_controller(Kp)
Definition: create_entities_utils.py:176
sot_talos_balance.create_entities_utils.create_imu_filters
def create_imu_filters(robot, dt)
Definition: create_entities_utils.py:388
sot_talos_balance.create_entities_utils.create_qualisys_client
def create_qualisys_client(address)
Definition: create_entities_utils.py:53
sot_talos_balance.create_entities_utils.create_rospublish
def create_rospublish(robot, name)
Definition: create_entities_utils.py:446
sot_talos_balance.create_entities_utils.get_trigger
def get_trigger(robot)
Definition: create_entities_utils.py:711
sot_talos_balance.create_entities_utils.load_folder
def load_folder(robot, folder, zmp=False)
Definition: create_entities_utils.py:721
sot_talos_balance.create_entities_utils.create_device_filters
def create_device_filters(robot, dt)
Definition: create_entities_utils.py:279
sot_talos_balance.create_entities_utils.rotation_matrix_to_rpy
def rotation_matrix_to_rpy(R)
Definition: create_entities_utils.py:61
sot_talos_balance.create_entities_utils.create_joint_trajectory_generator
def create_joint_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:94