sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
appli_zmpEstimator.py
Go to the documentation of this file.
1 # flake8: noqa
2 from dynamic_graph import plug
3 from dynamic_graph.sot.core import SOT, Derivator_of_Vector
4 from dynamic_graph.sot.core.meta_tasks_kine import (
5  MetaTaskKine6d,
6  MetaTaskKineCom,
7  gotoNd,
8 )
9 from dynamic_graph.tracer_real_time import TracerRealTime
10 
11 import dynamic_graph.sot_talos_balance.talos.control_manager_conf as cm_conf
12 import dynamic_graph.sot_talos_balance.talos.ft_calibration_conf as ft_conf
13 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf as param_server_conf
15 
16 robot.timeStep = robot.device.getTimeStep()
17 dt = robot.timeStep
18 
19 # -------------------------- DESIRED TRAJECTORY --------------------------
20 
21 robot.comTrajGen = create_com_trajectory_generator(dt, robot)
22 
23 # -------------------------- ESTIMATION --------------------------
24 
25 # --- Parameter server
26 robot.param_server = create_parameter_server(param_server_conf, dt)
27 
28 # --- filters
29 filters = Bunch()
30 filters.ft_RF_filter = create_butter_lp_filter_Wn_04_N_2("ft_RF_filter", dt, 6)
31 filters.ft_LF_filter = create_butter_lp_filter_Wn_04_N_2("ft_LF_filter", dt, 6)
32 plug(robot.device.forceRLEG, filters.ft_RF_filter.x)
33 plug(robot.device.forceLLEG, filters.ft_LF_filter.x)
34 robot.device_filters = filters
35 
36 # --- Force calibration
37 robot.ftc = create_ft_calibrator(robot, ft_conf)
38 
39 # --- ZMP estimation (disconnected)
40 zmp_estimator = SimpleZmpEstimator("zmpEst")
41 robot.dynamic.createOpPoint("sole_LF", "left_sole_link")
42 robot.dynamic.createOpPoint("sole_RF", "right_sole_link")
43 plug(robot.dynamic.sole_LF, zmp_estimator.poseLeft)
44 plug(robot.dynamic.sole_RF, zmp_estimator.poseRight)
45 plug(robot.ftc.left_foot_force_out, zmp_estimator.wrenchLeft)
46 plug(robot.ftc.right_foot_force_out, zmp_estimator.wrenchRight)
47 zmp_estimator.init()
48 robot.zmp_estimator = zmp_estimator
49 
50 # --- Control Manager
51 robot.cm = create_ctrl_manager(cm_conf, dt, robot_name="robot")
52 robot.cm.addCtrlMode("sot_input")
53 robot.cm.setCtrlMode("all", "sot_input")
54 robot.cm.addEmergencyStopSIN("zmp")
55 
56 # -------------------------- SOT CONTROL --------------------------
57 
58 # --- CONTACTS
59 # define contactLF and contactRF
60 robot.contactLF = MetaTaskKine6d(
61  "contactLF", robot.dynamic, "LF", robot.OperationalPointsMap["left-ankle"]
62 )
63 robot.contactLF.feature.frame("desired")
64 robot.contactLF.gain.setConstant(100)
65 robot.contactLF.keep()
66 locals()["contactLF"] = robot.contactLF
67 
68 robot.contactRF = MetaTaskKine6d(
69  "contactRF", robot.dynamic, "RF", robot.OperationalPointsMap["right-ankle"]
70 )
71 robot.contactRF.feature.frame("desired")
72 robot.contactRF.gain.setConstant(100)
73 robot.contactRF.keep()
74 locals()["contactRF"] = robot.contactRF
75 
76 # --- COM
77 robot.taskCom = MetaTaskKineCom(robot.dynamic)
78 robot.dynamic.com.recompute(0)
79 robot.taskCom.featureDes.errorIN.value = robot.dynamic.com.value
80 robot.taskCom.task.controlGain.value = 10
81 
82 # --- SOT solver
83 robot.sot = SOT("sot")
84 robot.sot.setSize(robot.dynamic.getDimension())
85 
86 # --- Plug SOT control to device through control manager
87 plug(robot.sot.control, robot.cm.ctrl_sot_input)
88 plug(robot.cm.u_safe, robot.device.control)
89 
90 plug(robot.comTrajGen.x, robot.taskCom.featureDes.errorIN)
91 
92 robot.sot.push(robot.contactRF.task.name)
93 robot.sot.push(robot.contactLF.task.name)
94 robot.sot.push(robot.taskCom.task.name)
95 robot.device.control.recompute(0)
96 
97 # --- Fix robot.dynamic inputs
98 plug(robot.device.velocity, robot.dynamic.velocity)
99 robot.dvdt = Derivator_of_Vector("dv_dt")
100 robot.dvdt.dt.value = dt
101 plug(robot.device.velocity, robot.dvdt.sin)
102 plug(robot.dvdt.sout, robot.dynamic.acceleration)
103 
104 # -------------------------- PLOTS --------------------------
105 
106 # --- ROS PUBLISHER
107 robot.publisher = create_rospublish(robot, "robot_publisher")
108 
110  robot.publisher, robot.zmp_estimator, "zmp", robot=robot, data_type="vector"
111 ) # estimated ZMP
113  robot.publisher,
114  robot.zmp_estimator,
115  "emergencyStop",
116  robot=robot,
117  data_type="boolean",
118 ) # ZMP emergency stop
120  robot.publisher, robot.dynamic, "com", robot=robot, data_type="vector"
121 ) # SOT CoM
123  robot.publisher, robot.dynamic, "zmp", robot=robot, data_type="vector"
124 ) # SOT ZMP
126  robot.publisher, robot.device, "forceLLEG", robot=robot, data_type="vector"
127 ) # force on left foot
129  robot.publisher, robot.device, "forceRLEG", robot=robot, data_type="vector"
130 ) # force on right foot
131 
132 # create_topic(robot.publisher, robot.device, 'forceLLEG', robot = robot, data_type='vector') # measured left wrench
133 # create_topic(robot.publisher, robot.device, 'forceRLEG', robot = robot, data_type='vector') # measured right wrench
134 
135 # create_topic(robot.publisher, robot.device_filters.ft_LF_filter, 'x_filtered', robot = robot, data_type='vector') # filtered left wrench
136 # create_topic(robot.publisher, robot.device_filters.ft_RF_filter, 'x_filtered', robot = robot, data_type='vector') # filtered right wrench
137 
139  robot.publisher, robot.ftc, "left_foot_force_out", robot=robot, data_type="vector"
140 ) # calibrated left wrench
142  robot.publisher, robot.ftc, "right_foot_force_out", robot=robot, data_type="vector"
143 ) # calibrated right wrench
144 
145 # --- TRACER
146 robot.tracer = TracerRealTime("zmp_tracer")
147 robot.tracer.setBufferSize(80 * (2**20))
148 robot.tracer.open("/tmp", "dg_", ".dat")
149 robot.device.after.addSignal("{0}.triger".format(robot.tracer.name))
150 
151 addTrace(robot.tracer, robot.zmp_estimator, "zmp")
152 addTrace(robot.tracer, robot.dynamic, "com")
153 addTrace(robot.tracer, robot.dynamic, "zmp")
154 addTrace(robot.tracer, robot.device, "forceLLEG")
155 addTrace(robot.tracer, robot.device, "forceRLEG")
156 
157 robot.tracer.start()
sot_talos_balance.utils.filter_utils.create_butter_lp_filter_Wn_04_N_2
def create_butter_lp_filter_Wn_04_N_2(name, dt, size)
Definition: filter_utils.py:40
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_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_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_rospublish
def create_rospublish(robot, name)
Definition: create_entities_utils.py:446