3 Created on Wed Apr 17 22:31:22 2019 11 from tkinter
import HORIZONTAL, Button, Entry, Frame, Label, Scale, Tk, mainloop
14 import pinocchio
as pin
15 import talos_conf
as conf
19 from tsid_biped
import TsidBiped
21 AXES = [
"X",
"Y",
"Z"]
25 def __init__(self, master, name, from_, to, tickinterval, length, orient, command):
30 label=
"%s %s" % (name, AXES[i]),
33 tickinterval=tickinterval[i],
39 separator =
Frame(height=2, bd=1, relief=tk.SUNKEN)
40 separator.pack(fill=tk.X, padx=5, pady=5)
50 Label(master, text=
"%s %s" % (name, AXES[i])).pack()
51 self.
s[i] = Entry(master, width=5)
53 separator =
Frame(height=1, bd=1, relief=tk.SUNKEN)
54 separator.pack(fill=tk.X, padx=2, pady=2)
58 return [float(self.
s[i].
get())
for i
in range(3)]
61 "could not convert string to float", [self.
s[i].
get()
for i
in range(3)]
66 scale_com, scale_RF, scale_LF =
None,
None,
None 67 button_contact_RF, button_contact_LF =
None,
None 68 push_robot_active, push_robot_com_vel, com_vel_entry =
False, 3 * [0.0],
None 72 x, y, z = scale_com.get()
73 tsid.trajCom.setReference(com_0 + np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T)
77 x, y, z = scale_RF.get()
78 H_rf_ref = H_rf_0.copy()
79 H_rf_ref.translation += +np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T
80 tsid.trajRF.setReference(H_rf_ref)
84 x, y, z = scale_LF.get()
85 H_lf_ref = H_lf_0.copy()
86 H_lf_ref.translation += +np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T
87 tsid.trajLF.setReference(H_lf_ref)
91 if tsid.contact_RF_active:
92 tsid.remove_contact_RF()
93 button_contact_RF.config(text=
"Make contact right foot")
96 button_contact_RF.config(text=
"Break contact right foot")
100 if tsid.contact_LF_active:
101 tsid.remove_contact_LF()
102 button_contact_LF.config(text=
"Make contact left foot")
104 tsid.add_contact_LF()
105 button_contact_LF.config(text=
"Break contact left foot")
109 tsid.gui.setWireFrameMode(
"world",
"WIREFRAME")
113 global push_robot_com_vel, push_robot_active
114 push_robot_com_vel = com_vel_entry.get()
115 push_robot_active =
True 119 """thread worker function""" 120 global scale_com, scale_RF, scale_LF, button_contact_RF, button_contact_LF, com_vel_entry
121 master = Tk(className=
"TSID GUI")
130 update_com_ref_scale,
152 button_contact_RF = Button(
153 master, text=
"Break contact right foot", command=switch_contact_RF
155 button_contact_RF.pack(side=tk.LEFT)
156 button_contact_LF = Button(
157 master, text=
"Break contact left foot", command=switch_contact_LF
159 button_contact_LF.pack(side=tk.LEFT)
160 Button(master, text=
"Toggle wireframe", command=toggle_wireframe_mode).pack(
165 Button(master, text=
"Push robot CoM", command=push_robot).pack()
166 com_vel_entry =
Entry3d(master,
"CoM vel")
171 global push_robot_active
173 q, v = tsid.q, tsid.v
176 time_start = time.time()
178 tsid.comTask.setReference(tsid.trajCom.computeNext())
179 tsid.postureTask.setReference(tsid.trajPosture.computeNext())
180 tsid.rightFootTask.setReference(tsid.trajRF.computeNext())
181 tsid.leftFootTask.setReference(tsid.trajLF.computeNext())
183 HQPData = tsid.formulation.computeProblemData(t, q, v)
185 sol = tsid.solver.solve(HQPData)
187 print(
"QP problem could not be solved! Error code:", sol.status)
191 dv = tsid.formulation.getAccelerations(sol)
192 q, v = tsid.integrate_dv(q, v, dv, conf.dt)
193 i, t = i + 1, t + conf.dt
195 if push_robot_active:
196 push_robot_active =
False 197 data = tsid.formulation.data()
198 if tsid.contact_LF_active:
199 J_LF = tsid.contactLF.computeMotionTask(0.0, q, v, data).matrix
201 J_LF = np.zeros((0, tsid.model.nv))
202 if tsid.contact_RF_active:
203 J_RF = tsid.contactRF.computeMotionTask(0.0, q, v, data).matrix
205 J_RF = np.zeros((0, tsid.model.nv))
206 J = np.vstack((J_LF, J_RF))
207 J_com = tsid.comTask.compute(t, q, v, data).matrix
208 A = np.vstack((J_com, J))
209 b = np.concatenate((np.array(push_robot_com_vel), np.zeros(J.shape[0])))
210 v = np.linalg.lstsq(A, b, rcond=-1)[0]
212 if i % conf.DISPLAY_N == 0:
214 x_com = tsid.robot.com(tsid.formulation.data())
215 x_com_ref = tsid.trajCom.getSample(t).pos()
216 H_lf = tsid.robot.framePosition(tsid.formulation.data(), tsid.LF)
217 H_rf = tsid.robot.framePosition(tsid.formulation.data(), tsid.RF)
218 x_lf_ref = tsid.trajLF.getSample(t).pos()[:3]
219 x_rf_ref = tsid.trajRF.getSample(t).pos()[:3]
221 tsid.viz,
"world/com", x_com.tolist() + [0, 0, 0, 1.0]
224 tsid.viz,
"world/com_ref", x_com_ref.tolist() + [0, 0, 0, 1.0]
227 tsid.viz,
"world/rf", pin.SE3ToXYZQUATtuple(H_rf)
230 tsid.viz,
"world/lf", pin.SE3ToXYZQUATtuple(H_lf)
233 tsid.viz,
"world/rf_ref", x_rf_ref.tolist() + [0, 0, 0, 1.0]
236 tsid.viz,
"world/lf_ref", x_lf_ref.tolist() + [0, 0, 0, 1.0]
241 "Average loop time: %.1f (expected is %.1f)" 242 % (1e3 * time_avg, 1e3 * conf.dt)
245 time_spent = time.time() - time_start
246 time_avg = (i * time_avg + time_spent) / (i + 1)
248 if time_avg < 0.9 * conf.dt:
249 time.sleep(10 * (conf.dt - time_avg))
252 print(
"#" * conf.LINE_WIDTH)
253 print(
" Test Task Space Inverse Dynamics ".
center(conf.LINE_WIDTH,
"#"))
254 print(
"#" * conf.LINE_WIDTH)
259 com_0 = tsid.robot.com(tsid.formulation.data())
260 H_rf_0 = tsid.robot.framePosition(
261 tsid.formulation.data(), tsid.model.getFrameId(conf.rf_frame_name)
263 H_lf_0 = tsid.robot.framePosition(
264 tsid.formulation.data(), tsid.model.getFrameId(conf.lf_frame_name)
268 tsid.viz,
"world/com", conf.SPHERE_RADIUS, conf.COM_SPHERE_COLOR
271 tsid.viz,
"world/com_ref", conf.REF_SPHERE_RADIUS, conf.COM_REF_SPHERE_COLOR
275 tsid.viz,
"world/rf_ref", conf.REF_SPHERE_RADIUS, conf.RF_REF_SPHERE_COLOR
279 tsid.viz,
"world/lf_ref", conf.REF_SPHERE_RADIUS, conf.LF_REF_SPHERE_COLOR
282 th_gui = threading.Thread(target=create_gui)
285 th_simu = threading.Thread(target=run_simu)
def __init__(self, master, name, from_, to, tickinterval, length, orient, command)
def update_LF_ref_scale(value)
def __init__(self, master, name)
def applyViewerConfiguration(viz, name, xyzquat)
def update_com_ref_scale(value)
def addViewerSphere(viz, name, size, rgba)
def toggle_wireframe_mode()
def update_RF_ref_scale(value)