60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# pip install toppra numpy scipy pandas matplotlib
|
||
import numpy as np
|
||
import pandas as pd
|
||
import matplotlib.pyplot as plt
|
||
import toppra as ta
|
||
import toppra.algorithm as algo
|
||
import toppra.constraint as constraint
|
||
import toppra.interpolator as interp
|
||
|
||
# === 1) 读取 CSV(只取 q1..q7)===
|
||
CSV_PATH = "/home/lgv/cmvr/cmvr-es/data/ik_psi_sweep.csv" #
|
||
joint_cols = ["q1","q2","q3","q4","q5","q6","q7"]
|
||
df = pd.read_csv(CSV_PATH)
|
||
assert all(c in df.columns for c in joint_cols), "CSV 缺少关节列 q1..q7"
|
||
waypoints = df[joint_cols].to_numpy()
|
||
N, dof = waypoints.shape
|
||
assert N >= 2, "至少需要两行关节路点"
|
||
|
||
# === 2) 构造样条路径(路径参数 s∈[0,1])===
|
||
s_grid = np.linspace(0, 1, N)
|
||
path = interp.SplineInterpolator(s_grid, waypoints)
|
||
|
||
# === 3) 约束(示例值:请改成你的真实上限)===
|
||
vmax = np.array([1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5]) # rad/s
|
||
amax = np.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]) # rad/s^2
|
||
vlim = np.vstack([-vmax, vmax]).T
|
||
alim = np.vstack([-amax, amax]).T
|
||
pc_vel = constraint.JointVelocityConstraint(vlim)
|
||
pc_acc = constraint.JointAccelerationConstraint(alim)
|
||
|
||
# === 4) toppra 时间最优轨迹(起止速度=0)===
|
||
topp = algo.TOPPRA([pc_vel, pc_acc], path, solver_wrapper="seidel")
|
||
traj = topp.compute_trajectory(0.0, 0.0)
|
||
T = traj.get_duration()
|
||
print(f"Total duration: {T:.4f} s")
|
||
|
||
# === 5) 采样并绘图 ===
|
||
ts = np.linspace(0, T, 300)
|
||
q = traj.eval(ts) # (300,7)
|
||
qd = traj.evald(ts)
|
||
qdd = traj.evaldd(ts)
|
||
|
||
# 位置
|
||
plt.figure()
|
||
for i in range(dof):
|
||
plt.plot(ts, q[:, i], label=f"q{i+1}")
|
||
plt.xlabel("Time (s)"); plt.ylabel("Position (rad)"); plt.title("Joint Positions"); plt.legend(); plt.tight_layout(); plt.show()
|
||
|
||
# 速度
|
||
plt.figure()
|
||
for i in range(dof):
|
||
plt.plot(ts, qd[:, i], label=f"qd{i+1}")
|
||
plt.xlabel("Time (s)"); plt.ylabel("Velocity (rad/s)"); plt.title("Joint Velocities"); plt.legend(); plt.tight_layout(); plt.show()
|
||
|
||
# 加速度
|
||
plt.figure()
|
||
for i in range(dof):
|
||
plt.plot(ts, qdd[:, i], label=f"qdd{i+1}")
|
||
plt.xlabel("Time (s)"); plt.ylabel("Acceleration (rad/s²)"); plt.title("Joint Accelerations"); plt.legend(); plt.tight_layout(); plt.show()
|