sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
appli_dcm_estimator.py
Go to the documentation of this file.
1 # flake8: noqa
2 from math import sqrt
3 
4 from dynamic_graph import plug
5 from dynamic_graph.sot.core import SOT, Derivator_of_Vector
6 from dynamic_graph.sot.core.meta_tasks_kine import (
7  MetaTaskKine6d,
8  MetaTaskKineCom,
9  gotoNd,
10 )
11 from dynamic_graph.sot.dynamic_pinocchio import DynamicPinocchio
12 from dynamic_graph.tracer_real_time import TracerRealTime
13 
14 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf as base_estimator_conf
15 import dynamic_graph.sot_talos_balance.talos.control_manager_conf as cm_conf
16 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf as ft_conf
17 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf as param_server_conf
19 
20 robot.timeStep = robot.device.getTimeStep()
21 dt = robot.timeStep
22 
23 # -------------------------- DESIRED TRAJECTORY --------------------------
24 
25 robot.comTrajGen = create_com_trajectory_generator(dt, robot)
26 
27 # --- Pendulum parameters
28 robot_name = "robot"
29 robotDim = robot.dynamic.getDimension()
30 mass = robot.dynamic.data.mass[0]
31 h = robot.dynamic.com.value[2]
32 g = 9.81
33 omega = sqrt(g / h)
34 
35 # -------------------------- ESTIMATION --------------------------
36 
37 # --- Base Estimation
38 robot.param_server = create_parameter_server(param_server_conf, dt)
39 robot.device_filters = create_device_filters(robot, dt)
40 robot.imu_filters = create_imu_filters(robot, dt)
41 robot.base_estimator = create_base_estimator(robot, dt, base_estimator_conf)
42 # robot.be_filters = create_be_filters(robot, dt)
43 
44 # --- Conversion
45 e2q = EulerToQuat("e2q")
46 plug(robot.base_estimator.q, e2q.euler)
47 robot.e2q = e2q
48 
49 # --- Kinematic computations
50 robot.rdynamic = DynamicPinocchio("real_dynamics")
51 robot.rdynamic.setModel(robot.dynamic.model)
52 robot.rdynamic.setData(robot.rdynamic.model.createData())
53 plug(robot.base_estimator.q, robot.rdynamic.position)
54 robot.rdynamic.velocity.value = [0.0] * robotDim
55 robot.rdynamic.acceleration.value = [0.0] * robotDim
56 
57 # --- CoM Estimation
58 cdc_estimator = DcmEstimator("cdc_estimator")
59 cdc_estimator.init(dt, robot_name)
60 plug(robot.e2q.quaternion, cdc_estimator.q)
61 plug(robot.base_estimator.v, cdc_estimator.v)
62 robot.cdc_estimator = cdc_estimator
63 
64 # --- DCM Estimation
65 estimator = DummyDcmEstimator("dummy")
66 estimator.omega.value = omega
67 estimator.mass.value = 1.0
68 plug(robot.cdc_estimator.c, estimator.com)
69 plug(robot.cdc_estimator.dc, estimator.momenta)
70 estimator.init()
71 robot.estimator = estimator
72 
73 # --- Force calibration
74 robot.ftc = create_ft_calibrator(robot, ft_conf)
75 
76 # --- ZMP estimation (disconnected)
77 zmp_estimator = SimpleZmpEstimator("zmpEst")
78 robot.rdynamic.createOpPoint("sole_LF", "left_sole_link")
79 robot.rdynamic.createOpPoint("sole_RF", "right_sole_link")
80 plug(robot.rdynamic.sole_LF, zmp_estimator.poseLeft)
81 plug(robot.rdynamic.sole_RF, zmp_estimator.poseRight)
82 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
83 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
84 zmp_estimator.init()
85 robot.zmp_estimator = zmp_estimator
86 
87 # --- Control Manager
88 robot.cm = create_ctrl_manager(cm_conf, dt, robot_name="robot")
89 robot.cm.addCtrlMode("sot_input")
90 robot.cm.setCtrlMode("all", "sot_input")
91 robot.cm.addEmergencyStopSIN("zmp")
92 
93 # -------------------------- SOT CONTROL --------------------------
94 
95 # --- CONTACTS
96 # define contactLF and contactRF
97 robot.contactLF = MetaTaskKine6d(
98  "contactLF", robot.dynamic, "LF", robot.OperationalPointsMap["left-ankle"]
99 )
100 robot.contactLF.feature.frame("desired")
101 robot.contactLF.gain.setConstant(100)
102 robot.contactLF.keep()
103 locals()["contactLF"] = robot.contactLF
104 
105 robot.contactRF = MetaTaskKine6d(
106  "contactRF", robot.dynamic, "RF", robot.OperationalPointsMap["right-ankle"]
107 )
108 robot.contactRF.feature.frame("desired")
109 robot.contactRF.gain.setConstant(100)
110 robot.contactRF.keep()
111 locals()["contactRF"] = robot.contactRF
112 
113 # --- COM
114 robot.taskCom = MetaTaskKineCom(robot.dynamic)
115 robot.dynamic.com.recompute(0)
116 robot.taskCom.featureDes.errorIN.value = robot.dynamic.com.value
117 robot.taskCom.task.controlGain.value = 10
118 
119 # --- SOT solver
120 robot.sot = SOT("sot")
121 robot.sot.setSize(robot.dynamic.getDimension())
122 
123 # --- Plug SOT control to device through control manager
124 plug(robot.sot.control, robot.cm.ctrl_sot_input)
125 plug(robot.cm.u_safe, robot.device.control)
126 
127 plug(robot.comTrajGen.x, robot.taskCom.featureDes.errorIN)
128 
129 robot.sot.push(robot.contactRF.task.name)
130 robot.sot.push(robot.contactLF.task.name)
131 robot.sot.push(robot.taskCom.task.name)
132 robot.device.control.recompute(0)
133 
134 # --- Fix robot.dynamic inputs
135 plug(robot.device.velocity, robot.dynamic.velocity)
136 robot.dvdt = Derivator_of_Vector("dv_dt")
137 robot.dvdt.dt.value = dt
138 plug(robot.device.velocity, robot.dvdt.sin)
139 plug(robot.dvdt.sout, robot.dynamic.acceleration)
140 
141 # -------------------------- PLOTS --------------------------
142 
143 # --- ROS PUBLISHER
144 robot.publisher = create_rospublish(robot, "robot_publisher")
145 
147  robot.publisher, robot.cdc_estimator, "c", robot=robot, data_type="vector"
148 ) # estimated CoM
150  robot.publisher, robot.cdc_estimator, "dc", robot=robot, data_type="vector"
151 ) # estimated CoM velocity
153  robot.publisher, robot.estimator, "dcm", robot=robot, data_type="vector"
154 ) # estimated DCM
155 
157  robot.publisher, robot.zmp_estimator, "zmp", robot=robot, data_type="vector"
158 ) # estimated ZMP
160  robot.publisher,
161  robot.zmp_estimator,
162  "emergencyStop",
163  robot=robot,
164  data_type="boolean",
165 ) # ZMP emergency stop
167  robot.publisher, robot.dynamic, "com", robot=robot, data_type="vector"
168 ) # SOT CoM
170  robot.publisher, robot.dynamic, "zmp", robot=robot, data_type="vector"
171 ) # SOT ZMP
173  robot.publisher, robot.device, "forceLLEG", robot=robot, data_type="vector"
174 ) # force on left foot
176  robot.publisher, robot.device, "forceRLEG", robot=robot, data_type="vector"
177 ) # force on right foot
178 
179 # create_topic(robot.publisher, robot.device, 'forceLLEG', robot = robot, data_type='vector') # measured left wrench
180 # create_topic(robot.publisher, robot.device, 'forceRLEG', robot = robot, data_type='vector') # measured right wrench
181 
182 # create_topic(robot.publisher, robot.device_filters.ft_LF_filter, 'x_filtered', robot = robot, data_type='vector') # filtered left wrench
183 # create_topic(robot.publisher, robot.device_filters.ft_RF_filter, 'x_filtered', robot = robot, data_type='vector') # filtered right wrench
184 
186  robot.publisher, robot.ftc, "left_foot_force_out", robot=robot, data_type="vector"
187 ) # calibrated left wrench
189  robot.publisher, robot.ftc, "right_foot_force_out", robot=robot, data_type="vector"
190 ) # calibrated right wrench
sot_talos_balance.create_entities_utils.create_ctrl_manager
def create_ctrl_manager(conf, dt, robot_name="robot")
Definition: create_entities_utils.py:341
create_entities_utils
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_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_com_trajectory_generator
def create_com_trajectory_generator(dt, robot)
Definition: create_entities_utils.py:120
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_parameter_server
def create_parameter_server(conf, dt, robot_name="robot")
Definition: create_entities_utils.py:619
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_rospublish
def create_rospublish(robot, name)
Definition: create_entities_utils.py:446
sot_talos_balance.create_entities_utils.create_device_filters
def create_device_filters(robot, dt)
Definition: create_entities_utils.py:279