1 """Created on Wed Apr 17 22:31:22 2019
9 from tkinter
import HORIZONTAL, Button, Entry, Frame, Label, Scale, Tk, mainloop
12 import pinocchio
as pin
13 import talos_conf
as conf
17 from tsid_biped
import TsidBiped
19 AXES = [
"X",
"Y",
"Z"]
23 def __init__(self, master, name, from_, to, tickinterval, length, orient, command):
28 label=f
"{name} {AXES[i]}",
31 tickinterval=tickinterval[i],
37 separator =
Frame(height=2, bd=1, relief=tk.SUNKEN)
38 separator.pack(fill=tk.X, padx=5, pady=5)
48 Label(master, text=f
"{name} {AXES[i]}").pack()
49 self.
s[i] = Entry(master, width=5)
51 separator =
Frame(height=1, bd=1, relief=tk.SUNKEN)
52 separator.pack(fill=tk.X, padx=2, pady=2)
56 return [float(self.
s[i].
get())
for i
in range(3)]
59 "could not convert string to float", [self.
s[i].
get()
for i
in range(3)]
64 scale_com, scale_RF, scale_LF =
None,
None,
None
65 button_contact_RF, button_contact_LF =
None,
None
66 push_robot_active, push_robot_com_vel, com_vel_entry =
False, 3 * [0.0],
None
70 x, y, z = scale_com.get()
71 tsid.trajCom.setReference(com_0 + np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T)
75 x, y, z = scale_RF.get()
76 H_rf_ref = H_rf_0.copy()
77 H_rf_ref.translation += +np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T
78 tsid.trajRF.setReference(H_rf_ref)
82 x, y, z = scale_LF.get()
83 H_lf_ref = H_lf_0.copy()
84 H_lf_ref.translation += +np.array([1e-2 * x, 1e-2 * y, 1e-2 * z]).T
85 tsid.trajLF.setReference(H_lf_ref)
89 if tsid.contact_RF_active:
90 tsid.remove_contact_RF()
91 button_contact_RF.config(text=
"Make contact right foot")
94 button_contact_RF.config(text=
"Break contact right foot")
98 if tsid.contact_LF_active:
99 tsid.remove_contact_LF()
100 button_contact_LF.config(text=
"Make contact left foot")
102 tsid.add_contact_LF()
103 button_contact_LF.config(text=
"Break contact left foot")
107 tsid.gui.setWireFrameMode(
"world",
"WIREFRAME")
111 global push_robot_com_vel, push_robot_active
112 push_robot_com_vel = com_vel_entry.get()
113 push_robot_active =
True
117 """Thread worker function"""
125 master = Tk(className=
"TSID GUI")
134 update_com_ref_scale,
156 button_contact_RF = Button(
157 master, text=
"Break contact right foot", command=switch_contact_RF
159 button_contact_RF.pack(side=tk.LEFT)
160 button_contact_LF = Button(
161 master, text=
"Break contact left foot", command=switch_contact_LF
163 button_contact_LF.pack(side=tk.LEFT)
164 Button(master, text=
"Toggle wireframe", command=toggle_wireframe_mode).pack(
169 Button(master, text=
"Push robot CoM", command=push_robot).pack()
170 com_vel_entry =
Entry3d(master,
"CoM vel")
175 global push_robot_active
177 q, v = tsid.q, tsid.v
180 time_start = time.time()
182 tsid.comTask.setReference(tsid.trajCom.computeNext())
183 tsid.postureTask.setReference(tsid.trajPosture.computeNext())
184 tsid.rightFootTask.setReference(tsid.trajRF.computeNext())
185 tsid.leftFootTask.setReference(tsid.trajLF.computeNext())
187 HQPData = tsid.formulation.computeProblemData(t, q, v)
189 sol = tsid.solver.solve(HQPData)
191 print(
"QP problem could not be solved! Error code:", sol.status)
195 dv = tsid.formulation.getAccelerations(sol)
196 q, v = tsid.integrate_dv(q, v, dv, conf.dt)
197 i, t = i + 1, t + conf.dt
199 if push_robot_active:
200 push_robot_active =
False
201 data = tsid.formulation.data()
202 if tsid.contact_LF_active:
203 J_LF = tsid.contactLF.computeMotionTask(0.0, q, v, data).matrix
205 J_LF = np.zeros((0, tsid.model.nv))
206 if tsid.contact_RF_active:
207 J_RF = tsid.contactRF.computeMotionTask(0.0, q, v, data).matrix
209 J_RF = np.zeros((0, tsid.model.nv))
210 J = np.vstack((J_LF, J_RF))
211 J_com = tsid.comTask.compute(t, q, v, data).matrix
212 A = np.vstack((J_com, J))
213 b = np.concatenate((np.array(push_robot_com_vel), np.zeros(J.shape[0])))
214 v = np.linalg.lstsq(A, b, rcond=-1)[0]
216 if i % conf.DISPLAY_N == 0:
218 x_com = tsid.robot.com(tsid.formulation.data())
219 x_com_ref = tsid.trajCom.getSample(t).pos()
220 H_lf = tsid.robot.framePosition(tsid.formulation.data(), tsid.LF)
221 H_rf = tsid.robot.framePosition(tsid.formulation.data(), tsid.RF)
222 x_lf_ref = tsid.trajLF.getSample(t).pos()[:3]
223 x_rf_ref = tsid.trajRF.getSample(t).pos()[:3]
225 tsid.viz,
"world/com", [*x_com.tolist(), 0, 0, 0, 1.0]
228 tsid.viz,
"world/com_ref", [*x_com_ref.tolist(), 0, 0, 0, 1.0]
231 tsid.viz,
"world/rf", pin.SE3ToXYZQUATtuple(H_rf)
234 tsid.viz,
"world/lf", pin.SE3ToXYZQUATtuple(H_lf)
237 tsid.viz,
"world/rf_ref", [*x_rf_ref.tolist(), 0, 0, 0, 1.0]
240 tsid.viz,
"world/lf_ref", [*x_lf_ref.tolist(), 0, 0, 0, 1.0]
245 f
"Average loop time: {1e3 * time_avg:.1f} (expected is {1e3 * conf.dt:.1f})"
248 time_spent = time.time() - time_start
249 time_avg = (i * time_avg + time_spent) / (i + 1)
251 if time_avg < 0.9 * conf.dt:
252 time.sleep(10 * (conf.dt - time_avg))
255 print(
"#" * conf.LINE_WIDTH)
256 print(
" Test Task Space Inverse Dynamics ".
center(conf.LINE_WIDTH,
"#"))
257 print(
"#" * conf.LINE_WIDTH)
262 com_0 = tsid.robot.com(tsid.formulation.data())
263 H_rf_0 = tsid.robot.framePosition(
264 tsid.formulation.data(), tsid.model.getFrameId(conf.rf_frame_name)
266 H_lf_0 = tsid.robot.framePosition(
267 tsid.formulation.data(), tsid.model.getFrameId(conf.lf_frame_name)
271 tsid.viz,
"world/com", conf.SPHERE_RADIUS, conf.COM_SPHERE_COLOR
274 tsid.viz,
"world/com_ref", conf.REF_SPHERE_RADIUS, conf.COM_REF_SPHERE_COLOR
278 tsid.viz,
"world/rf_ref", conf.REF_SPHERE_RADIUS, conf.RF_REF_SPHERE_COLOR
282 tsid.viz,
"world/lf_ref", conf.REF_SPHERE_RADIUS, conf.LF_REF_SPHERE_COLOR
285 th_gui = threading.Thread(target=create_gui)
288 th_simu = threading.Thread(target=run_simu)