sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
appli_admittance_end_effector.py
Go to the documentation of this file.
1 # flake8: noqa
2 import math
3 
4 import numpy as np
5 from dynamic_graph import plug
6 from dynamic_graph.ros import RosPublish, RosSubscribe
7 from dynamic_graph.sot.core import SOT, FeaturePosture, GainAdaptive, Task
8 from dynamic_graph.sot.core.matrix_util import matrixToTuple
9 from dynamic_graph.sot.core.meta_tasks_kine import MetaTaskKine6d
10 from dynamic_graph.tracer_real_time import TracerRealTime
11 
12 import dynamic_graph.sot_talos_balance.talos.base_estimator_conf as baseEstimatorConf
13 import dynamic_graph.sot_talos_balance.talos.control_manager_conf as controlManagerConfig
14 import dynamic_graph.sot_talos_balance.talos.ft_wrist_calibration_conf as forceConf
15 import dynamic_graph.sot_talos_balance.talos.parameter_server_conf as paramServerConfig
17 
18 robot.timeStep = robot.device.getTimeStep()
19 
20 # --- EXPERIMENTAL SET UP ------------------------------------------------------
21 
22 device = "simu"
23 endEffector = "rightWrist"
24 endEffectorWeight = forceConf.handWeight[device]
25 rightOC = forceConf.rightLeverArm
26 leftOC = forceConf.leftLeverArm
27 
28 # --- SET INITIAL CONFIGURATION ------------------------------------------------
29 
30 q = [0.0, 0.0, 1.018213, 0.0, 0.0, 0.0] # Base
31 q += [0.0, 0.0, -0.411354, 0.859395, -0.448041, -0.001708] # Left Leg
32 q += [0.0, 0.0, -0.411354, 0.859395, -0.448041, -0.001708] # Right Leg
33 q += [0.0, 0.006761] # Chest
34 q += [0.25847, 0.173046, -0.0002, -0.525366, 0.0, 0.0, 0.1, -0.005] # Left Arm
35 # q += [-0.25847, -0.173046, 0.0002, -0.525366, 0., 0., 0.1, -0.005] # Right Arm
36 # q += [-0.25847, -0.0, 0.19, -1.61, 0., 0., 0.1, -0.005] # Right Arm
37 q += [-0.0, -0.01, 0.00, -1.58, -0.01, 0.0, 0.0, -0.005] # Right Arm
38 q += [0.0, 0.0] # Head
39 robot.device.set(q)
40 
41 # --- CREATE ENTITIES ----------------------------------------------------------
42 
43 robot.param_server = create_parameter_server(paramServerConfig, robot.timeStep)
44 robot.device_filters = create_device_filters(robot, robot.timeStep)
45 robot.imu_filters = create_imu_filters(robot, robot.timeStep)
46 robot.baseEstimator = create_base_estimator(robot, robot.timeStep, baseEstimatorConf)
47 
48 # Get configuration vector
49 robot.e2q = EulerToQuat("e2q")
50 plug(robot.baseEstimator.q, robot.e2q.euler)
51 
52 robot.forceCalibrator = create_ft_wrist_calibrator(
53  robot, endEffectorWeight, rightOC, leftOC
54 )
56  robot, endEffector, "EEAdmittance"
57 )
58 
59 robot.controlManager = create_ctrl_manager(controlManagerConfig, robot.timeStep)
60 robot.controlManager.addCtrlMode("sot_input")
61 robot.controlManager.setCtrlMode("all", "sot_input")
62 
63 # --- HAND TASK ----------------------------------------------------------------
64 
65 taskRightHand = MetaTaskKine6d("rh", robot.dynamic, "rh", "arm_right_7_joint")
66 handMgrip = np.eye(4)
67 handMgrip[0:3, 3] = (0.1, 0, 0)
68 taskRightHand.opmodif = matrixToTuple(handMgrip)
69 taskRightHand.feature.frame("desired")
70 taskRightHand.feature.selec.value = "111111"
71 taskRightHand.task.setWithDerivative(True)
72 taskRightHand.task.controlGain.value = 0
73 taskRightHand.feature.position.value = np.eye(4)
74 taskRightHand.feature.velocity.value = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
75 taskRightHand.featureDes.position.value = np.eye(4)
76 plug(robot.controller.dq, taskRightHand.featureDes.velocity)
77 
78 # --- BASE TASK ----------------------------------------------------------------
79 
80 taskWaist = MetaTaskKine6d(
81  "taskWaist", robot.dynamic, "WT", robot.OperationalPointsMap["waist"]
82 )
83 taskWaist.feature.frame("desired")
84 taskWaist.gain.setConstant(300)
85 taskWaist.keep()
86 taskWaist.feature.selec.value = "111111"
87 locals()["taskWaist"] = taskWaist
88 
89 # --- POSTURE TASK -------------------------------------------------------------
90 
91 robot.taskPosture = Task("task_posture")
92 robot.taskPosture.controlGain.value = 100.0
93 robot.taskPosture.feature = FeaturePosture("feature_posture")
94 
95 q = list(robot.dynamic.position.value)
96 robot.taskPosture.feature.state.value = q
97 robot.taskPosture.feature.posture.value = q
98 
99 robot.taskPosture.feature.selectDof(6, True)
100 robot.taskPosture.feature.selectDof(7, True)
101 robot.taskPosture.feature.selectDof(8, True)
102 robot.taskPosture.feature.selectDof(9, True)
103 robot.taskPosture.feature.selectDof(10, True)
104 robot.taskPosture.feature.selectDof(11, True)
105 robot.taskPosture.feature.selectDof(12, True)
106 robot.taskPosture.feature.selectDof(13, True)
107 robot.taskPosture.feature.selectDof(14, True)
108 robot.taskPosture.feature.selectDof(15, True)
109 robot.taskPosture.feature.selectDof(16, True)
110 robot.taskPosture.feature.selectDof(17, True)
111 robot.taskPosture.feature.selectDof(18, True)
112 robot.taskPosture.feature.selectDof(19, True)
113 
114 robot.taskPosture.add(robot.taskPosture.feature.name)
115 plug(robot.dynamic.position, robot.taskPosture.feature.state)
116 
117 robot.sot = SOT("sot")
118 robot.sot.setSize(robot.dynamic.getDimension())
119 
120 # Plug SOT control to device through control manager
121 plug(robot.sot.control, robot.controlManager.ctrl_sot_input)
122 plug(robot.controlManager.u_safe, robot.device.control)
123 # plug(robot.sot.control, robot.device.control)
124 
125 # --- PUSH THE TASKS -----------------------------------------------------------
126 
127 robot.sot.push(robot.taskPosture.name)
128 robot.sot.push(taskRightHand.task.name)
129 robot.sot.push(taskWaist.task.name)
130 
131 # # --- ROS PUBLISHER ----------------------------------------------------------
132 
133 robot.publisher = create_rospublish(robot, "robot_publisher")
135  robot.publisher, robot.controller, "w_force", robot=robot, data_type="vector"
136 )
138  robot.publisher, robot.controller, "force", robot=robot, data_type="vector"
139 )
140 create_topic(robot.publisher, robot.controller, "dq", robot=robot, data_type="vector")
141 create_topic(robot.publisher, robot.controller, "w_dq", robot=robot, data_type="vector")
143  robot.publisher, robot.controller, "w_forceDes", robot=robot, data_type="vector"
144 )
146  robot.publisher,
147  robot.forceCalibrator,
148  "leftWristForceOut",
149  robot=robot,
150  data_type="vector",
151 ) # calibrated left wrench
153  robot.publisher,
154  robot.forceCalibrator,
155  "rightWristForceOut",
156  robot=robot,
157  data_type="vector",
158 ) # calibrated right wrench
159 
160 # # --- ROS SUBSCRIBER
161 robot.subscriber = RosSubscribe("end_effector_subscriber")
162 robot.subscriber.add("vector", "w_force", "/sot/controller/w_force")
163 robot.subscriber.add("vector", "force", "/sot/controller/force")
164 robot.subscriber.add("vector", "dq", "/sot/controller/dq")
165 robot.subscriber.add("vector", "w_dq", "/sot/controller/w_dq")
166 robot.subscriber.add("vector", "w_forceDes", "/sot/controller/w_forceDes")
167 robot.subscriber.add(
168  "vector", "leftWristForceOut", "/sot/forceCalibrator/leftWristForceOut"
169 )
170 robot.subscriber.add(
171  "vector", "rightWristForceOut", "/sot/forceCalibrator/rightWristForceOut"
172 )
173 
174 # --- TRACER ------------------------------------------------------------------
175 
176 robot.tracer = TracerRealTime("force_tracer")
177 robot.tracer.setBufferSize(80 * (2**20))
178 robot.tracer.open("/tmp", "dg_", ".dat")
179 robot.device.after.addSignal("{0}.triger".format(robot.tracer.name))
180 
181 addTrace(robot.tracer, robot.controller, "force")
182 addTrace(robot.tracer, robot.controller, "w_force")
183 addTrace(robot.tracer, robot.controller, "w_dq")
184 addTrace(robot.tracer, robot.controller, "dq")
185 
186 robot.tracer.start()
def create_base_estimator(robot, dt, conf, robot_name="robot")
def create_ctrl_manager(conf, dt, robot_name="robot")
def create_parameter_server(conf, dt, robot_name="robot")
def addTrace(tracer, entity, signalName)
def create_ft_wrist_calibrator(robot, endEffectorWeight, rightOC, leftOC)
def create_topic(rospub, entity, signalName, robot=None, data_type="vector")
def create_end_effector_admittance_controller(robot, endEffector, name)