74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
import pandas as pd
|
||
import numpy as np
|
||
import matplotlib.pyplot as plt
|
||
|
||
CSV = '/home/lgv/cmvr/cmvr-es/data/ik_psi_sweep.csv'
|
||
df = pd.read_csv(CSV)
|
||
|
||
# ---- 曲线图:q1~q7 (+ 可选 psi) vs index ----
|
||
joint_cols_expect = ['q1','q2','q3','q4','q5','q6','q7']
|
||
joint_cols = [c for c in joint_cols_expect if c in df.columns]
|
||
assert len(joint_cols) == 7, f"CSV 缺少关节列,期望 {joint_cols_expect},实际 {list(df.columns)}"
|
||
|
||
x = np.arange(len(df))
|
||
plt.figure(figsize=(12, 5))
|
||
for c in joint_cols:
|
||
plt.plot(x, df[c].to_numpy(), label=c, linewidth=1.2)
|
||
|
||
if 'psi' in df.columns:
|
||
plt.plot(x, df['psi'].to_numpy(), '--', label='psi', linewidth=1.2)
|
||
|
||
plt.xlabel('index')
|
||
plt.ylabel('angle (rad)')
|
||
plt.title('q1..q7 (and psi) vs index')
|
||
plt.grid(True, alpha=0.35)
|
||
plt.legend(ncol=4, fontsize=9)
|
||
plt.tight_layout()
|
||
plt.show()
|
||
|
||
# ---- 柱状图:最近限位距离(选“最危险帧”) ----
|
||
limits = np.array([
|
||
[-0.26, 1.57],
|
||
[-0.78, 1.57],
|
||
[-np.pi, np.pi],
|
||
[ 0.00, 2.05],
|
||
[-3.00, 3.00],
|
||
[-2.00, 2.00],
|
||
[-0.57, 1.57],
|
||
])
|
||
|
||
Q = df[joint_cols].to_numpy() # [N,7]
|
||
lo = limits[:, 0][None, :] # [1,7]
|
||
hi = limits[:, 1][None, :]
|
||
|
||
dist_low = Q - lo # 到下限的距离
|
||
dist_high = hi - Q # 到上限的距离
|
||
nearest = np.minimum(dist_low, dist_high) # 最近限位(可为负,负值=超限)
|
||
|
||
# 找“最危险”的 index(全关节最小裕度最小)
|
||
min_margin_per_row = nearest.min(axis=1) # 每帧的最小关节裕度
|
||
worst_idx = int(np.argmin(min_margin_per_row))
|
||
vals = nearest[worst_idx, :]
|
||
|
||
psi_text = f", psi={df['psi'].iloc[worst_idx]:.4f}" if 'psi' in df.columns else ""
|
||
|
||
plt.figure(figsize=(9, 4.5))
|
||
plt.bar(joint_cols, vals)
|
||
plt.axhline(0.0, linewidth=1, color='k')
|
||
plt.ylabel('Nearest distance to limit (rad)')
|
||
plt.title(f'Per-joint margin at worst frame (index={worst_idx}{psi_text})')
|
||
plt.grid(True, axis='y', alpha=0.35)
|
||
plt.tight_layout()
|
||
plt.show()
|
||
|
||
# ---- 可选:整段最小裕度曲线(帮助定位危险段)----
|
||
plt.figure(figsize=(12, 3.2))
|
||
plt.plot(min_margin_per_row, linewidth=1.2)
|
||
plt.axhline(0.0, linewidth=1, color='k')
|
||
plt.xlabel('index')
|
||
plt.ylabel('min margin (rad)')
|
||
plt.title('Minimum per-frame joint margin over sweep (rad)')
|
||
plt.grid(True, alpha=0.35)
|
||
plt.tight_layout()
|
||
plt.show()
|