
纸必须相对于机器人基座固定,并且要知道它在哪。

在纸面坐标系里定义轨迹,轨迹最终需要转成一系列离散的末端位姿点,每个点间隔约 1~2mm,点数根据需要的平滑度确定。
在纸面坐标系中,四个角点(按顺序):
需要离散化每条边,在每条边上均匀采样 N 个点(含端点),或者用插值函数,最终的离散路径点列表就是:
[(0,0), (Δx,0), (2Δx,0), ..., (L,0), (L,Δx), ..., (L,L), (L,L-Δx), ..., (0,L), (0,L-Δx), ..., (0,0)]圆心在纸面坐标系的 (cx, cy) 处,比如 (50, 50),圆的参数方程:
让 θ 从 0 到 2π 均匀步进(例如 360 个点),得到一系列点。
在纸面上从 (x1, y1) 到 (x2, y2) 的线段,等距采样。
对于每个二维路径点 (x_paper, y_paper),要赋予完整的 6D 位姿,才能调用逆运动学。
Pinocchio 的逆运动学通常需要一个目标位姿,表达为 4×4 齐次变换矩阵,或者位置+四元数。
对于一个路径点,其末端工具的位姿构建如下:
(x_paper, y_paper, 0) 通过变换矩阵映射到基坐标系:

取的 (P_x, P_y, P_z) 是末端工具坐标系原点的位置,因为笔尖是工具末端,所以这实际是笔尖的位置。

或者直接用纸面坐标系的 X, Y 轴作为工具 X, Y,Z 为纸面法向向内。

这就是 Pinocchio 逆运动学所需的末端工具目标位姿。
注意:笔是安装在末端模组上的,笔尖到末端法兰有一个固定的偏移变换 Ttoolflange,应当先用笔尖标定出这个工具偏置,然后在轨迹规划时,把笔尖位姿 T 转换为法兰位姿送给 IK。或者,更简单地,在 Pinocchio 的 URDF 中,把笔作为一个附加的虚拟连杆,其末端就是笔尖,IK 解算时直接给笔尖坐标系的目标位姿即可。

阶段1:准备
T_paper_base。阶段2:轨迹生成脚本(Python 伪代码逻辑)
# 定义纸面轨迹 (正方形)
L = 0.1 # 100mm
paper_points = []
# 离散化四条边,step 为步长 (如 0.002m)
for p in 离散正方形点(L, step=0.002):
# p 是 [x_paper, y_paper]
# 构造纸面坐标系下的齐次位姿 (笔尖)
T_paper_tip = np.eye(4)
T_paper_tip[:3, 3] = [p[0], p[1], 0.0] # 位置
# 姿态:笔尖Z轴指向纸面法向的反方向 (即向下压),X轴沿纸面X
R_paper_tip = 由纸面X轴、Y轴和-Z方向构成的矩阵
T_paper_tip[:3, :3] = R_paper_tip
# 变换到基座标系
T_base_tip = T_paper_base @ T_paper_tip
# 调用 Pinocchio IK,传入 T_base_tip
q_sol = pinocchio.inverse_kinematics(model, data, T_base_tip, q_init)
joint_trajectory.append(q_sol)
q_init = q_sol # 用上一解作为初值,保证连续性阶段3:执行
joint_trajectory 按时间戳通过位置接口发送给机械臂,移动速度要慢且均匀(比如 20mm/s),避免笔被拖动跳跃。a 或考虑关节传动比。alpha)。这些观察可以明确调整 DH 参数表的哪一项,例如,若 100mm 边长变成了 99mm,且误差是线性的,可以在 Pinocchio 中按比例修正连杆长度,再重新测试。
