sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
appli_simple_ankle_admittance.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, FeaturePosture, Task
4 from dynamic_graph.sot.core.meta_tasks_kine import (
5  MetaTaskKine6d,
6  MetaTaskKineCom,
7  gotoNd,
8 )
9 from dynamic_graph.sot.core.operator import Selec_of_vector
10 
11 from dynamic_graph.sot_talos_balance.meta_task_joint import MetaTaskKineJoint
12 from dynamic_graph.sot_talos_balance.simple_admittance_controller import (
13  SimpleAdmittanceController,
14 )
15 
16 N_JOINTS = 32
17 N_CONFIG = N_JOINTS + 6
18 
19 robot.timeStep = robot.device.getTimeStep()
20 timeStep = robot.timeStep
21 
22 RightPitchJoint = 10
23 RightRollJoint = 11
24 LeftPitchJoint = 4
25 LeftRollJoint = 5
26 
27 Kp = [0.00005]
28 
29 # --- Ankle admittance foot
30 # --- RIGHT ANKLE PITCH
31 controller = SimpleAdmittanceController("rightPitchAnkleController")
32 controller.Kp.value = Kp
33 
34 robot.stateselecRP = Selec_of_vector("stateselecRP")
35 robot.stateselecRP.selec(RightPitchJoint + 6, RightPitchJoint + 7)
36 plug(robot.device.state, robot.stateselecRP.sin)
37 plug(robot.stateselecRP.sout, controller.state)
38 
39 robot.tauselecRP = Selec_of_vector("tauselecRP")
40 robot.tauselecRP.selec(RightPitchJoint, RightPitchJoint + 1)
41 plug(robot.device.ptorque, robot.tauselecRP.sin)
42 plug(robot.tauselecRP.sout, controller.tau)
43 
44 controller.tauDes.value = [0.0]
45 controller.init(timeStep, 1)
46 controller.setPosition([robot.device.state.value[RightPitchJoint + 6]])
47 robot.rightPitchAnkleController = controller
48 
49 robot.rightAnklePitchTask = MetaTaskKineJoint(robot.dynamic, RightPitchJoint)
50 robot.rightAnklePitchTask.task.controlGain.value = 0
51 robot.rightAnklePitchTask.task.setWithDerivative(True)
52 plug(robot.rightPitchAnkleController.qRef, robot.rightAnklePitchTask.featureDes.errorIN)
53 plug(
54  robot.rightPitchAnkleController.dqRef,
55  robot.rightAnklePitchTask.featureDes.errordotIN,
56 )
57 
58 # --- RIGHT ANKLE ROLL
59 controller = SimpleAdmittanceController("rightRollAnkleController")
60 controller.Kp.value = Kp
61 
62 robot.stateselecRR = Selec_of_vector("stateselecRR")
63 robot.stateselecRR.selec(RightRollJoint + 6, RightRollJoint + 7)
64 plug(robot.device.state, robot.stateselecRR.sin)
65 plug(robot.stateselecRR.sout, controller.state)
66 
67 robot.tauselecRR = Selec_of_vector("tauselecRR")
68 robot.tauselecRR.selec(RightRollJoint, RightRollJoint + 1)
69 plug(robot.device.ptorque, robot.tauselecRR.sin)
70 plug(robot.tauselecRR.sout, controller.tau)
71 
72 controller.tauDes.value = [0.0]
73 controller.init(timeStep, 1)
74 controller.setPosition([robot.device.state.value[RightRollJoint + 6]])
75 robot.rightRollAnkleController = controller
76 
77 robot.rightAnkleRollTask = MetaTaskKineJoint(robot.dynamic, RightRollJoint)
78 robot.rightAnkleRollTask.task.controlGain.value = 0
79 robot.rightAnkleRollTask.task.setWithDerivative(True)
80 plug(robot.rightRollAnkleController.qRef, robot.rightAnkleRollTask.featureDes.errorIN)
81 plug(
82  robot.rightRollAnkleController.dqRef, robot.rightAnkleRollTask.featureDes.errordotIN
83 )
84 
85 # --- LEFT ANKLE PITCH
86 controller = SimpleAdmittanceController("leftPitchAnkleController")
87 controller.Kp.value = Kp
88 
89 robot.stateselecLP = Selec_of_vector("stateselecLP")
90 robot.stateselecLP.selec(LeftPitchJoint + 6, LeftPitchJoint + 7)
91 plug(robot.device.state, robot.stateselecLP.sin)
92 plug(robot.stateselecLP.sout, controller.state)
93 
94 robot.tauselecLP = Selec_of_vector("tauselecLP")
95 robot.tauselecLP.selec(LeftPitchJoint, LeftPitchJoint + 1)
96 plug(robot.device.ptorque, robot.tauselecLP.sin)
97 plug(robot.tauselecLP.sout, controller.tau)
98 
99 controller.tauDes.value = [0.0]
100 controller.init(timeStep, 1)
101 controller.setPosition([robot.device.state.value[LeftPitchJoint + 6]])
102 robot.leftPitchAnkleController = controller
103 
104 robot.leftAnklePitchTask = MetaTaskKineJoint(robot.dynamic, LeftPitchJoint)
105 robot.leftAnklePitchTask.task.controlGain.value = 0
106 robot.leftAnklePitchTask.task.setWithDerivative(True)
107 plug(robot.leftPitchAnkleController.qRef, robot.leftAnklePitchTask.featureDes.errorIN)
108 plug(
109  robot.leftPitchAnkleController.dqRef, robot.leftAnklePitchTask.featureDes.errordotIN
110 )
111 
112 # --- LEFT ANKLE ROLL
113 controller = SimpleAdmittanceController("leftRollAnkleController")
114 controller.Kp.value = Kp
115 
116 robot.stateselecLR = Selec_of_vector("stateselecLP")
117 robot.stateselecLR.selec(LeftRollJoint + 6, LeftRollJoint + 7)
118 plug(robot.device.state, robot.stateselecLR.sin)
119 plug(robot.stateselecLR.sout, controller.state)
120 
121 robot.tauselecLR = Selec_of_vector("tauselecLP")
122 robot.tauselecLR.selec(LeftRollJoint, LeftRollJoint + 1)
123 plug(robot.device.ptorque, robot.tauselecLR.sin)
124 plug(robot.tauselecLR.sout, controller.tau)
125 
126 controller.tauDes.value = [0.0]
127 controller.init(timeStep, 1)
128 controller.setPosition([robot.device.state.value[LeftRollJoint + 6]])
129 robot.leftRollAnkleController = controller
130 
131 robot.leftAnkleRollTask = MetaTaskKineJoint(robot.dynamic, LeftRollJoint)
132 robot.leftAnkleRollTask.task.controlGain.value = 0
133 robot.leftAnkleRollTask.task.setWithDerivative(True)
134 plug(robot.leftRollAnkleController.qRef, robot.leftAnkleRollTask.featureDes.errorIN)
135 plug(robot.leftRollAnkleController.dqRef, robot.leftAnkleRollTask.featureDes.errordotIN)
136 
137 # -------------------------- SOT CONTROL --------------------------
138 # --- Posture
139 robot.taskPosture = Task("taskPosture")
140 robot.taskPosture.feature = FeaturePosture("featurePosture")
141 
142 q = list(robot.dynamic.position.value)
143 robot.taskPosture.feature.state.value = q
144 robot.taskPosture.feature.posture.value = q
145 
146 for i in range(18, 38):
147  robot.taskPosture.feature.selectDof(i, True)
148 
149 robot.taskPosture.controlGain.value = 100.0
150 robot.taskPosture.add(robot.taskPosture.feature.name)
151 plug(robot.dynamic.position, robot.taskPosture.feature.state)
152 
153 # --- CONTACTS
154 # define contactLF and contactRF
155 robot.contactLF = MetaTaskKine6d(
156  "contactLF", robot.dynamic, "LF", robot.OperationalPointsMap["left-ankle"]
157 )
158 robot.contactLF.feature.frame("desired")
159 robot.contactLF.gain.setConstant(100)
160 robot.contactLF.keep()
161 locals()["contactLF"] = robot.contactLF
162 
163 robot.contactRF = MetaTaskKine6d(
164  "contactRF", robot.dynamic, "RF", robot.OperationalPointsMap["right-ankle"]
165 )
166 robot.contactRF.feature.frame("desired")
167 robot.contactRF.gain.setConstant(100)
168 robot.contactRF.keep()
169 locals()["contactRF"] = robot.contactRF
170 
171 # --- SOT
172 
173 robot.sot = SOT("sot")
174 robot.sot.setSize(robot.dynamic.getDimension())
175 plug(robot.sot.control, robot.device.control)
176 
177 robot.sot.push(robot.taskPosture.name)
178 robot.sot.push(robot.contactRF.task.name)
179 robot.sot.push(robot.contactLF.task.name)
180 robot.device.control.recompute(0)