雅可比矩阵描述关节速度与末端速度的线性映射。
import numpy as np
def dh_matrix(theta,d,a,alpha):
ct,st=np.cos(theta),np.sin(theta); ca,sa=np.cos(alpha),np.sin(alpha)
return np.array([[ct,-st*ca,st*sa,a*ct],[st,ct*ca,-ct*sa,a*st],[0,sa,ca,d],[0,0,0,1]])
class JacAna:
def __init__(self,dh,jt=None):
self.dh=dh; self.n=len(dh); self.jt=jt or ['R']*self.n
def fk_all(self,q):
T=np.eye(4); frames=[T.copy()]
for i in range(self.n):
a,al,d_off,th_off=self.dh[i]
if self.jt[i]=='R': theta=q[i]+th_off; d=d_off
else: theta=th_off; d=q[i]+d_off
T=T@dh_matrix(theta,d,a,al); frames.append(T.copy())
return frames
def jac(self,q):
frames=self.fk_all(q); pn=frames[-1][:3,3]; J=np.zeros((6,self.n))
for i in range(self.n):
z=frames[i][:3,2]; p=frames[i][:3,3]
if self.jt[i]=='R': J[:3,i]=np.cross(z,pn-p); J[3:,i]=z
else: J[:3,i]=z
return J
def jac_num(self,q,delta=1e-7):
frames0=self.fk_all(q); pos0=frames0[-1][:3,3]; J=np.zeros((6,self.n))
for i in range(self.n):
qp=q.copy(); qp[i]+=delta; frames_p=self.fk_all(qp)
J[:3,i]=(frames_p[-1][:3,3]-pos0)/delta
return J
a2r=JacAna([(1.0,0,0,0),(0.8,0,0,0)])
q=np.array([np.pi/4,np.pi/6]); Ja=a2r.jac(q); Jn=a2r.jac_num(q)
print("雅可比矩阵分析"); print("="*55)
print(f"解析雅可比(6×2):\n{np.round(Ja,4)}")
print(f"解析vs数值误差: {np.max(np.abs(Ja-Jn)):.2e}")
Jv=Ja[:2,:]; print(f"线速度雅可比 det={np.linalg.det(Jv):.4f}")
F=np.array([10,5,0]); tau=Jv.T@F[:2]
dq=np.array([0.1,0.2]); dx=Jv@dq; Wj=tau@dq; We=F[:2]@dx
print(f"静力验证: τ=JᵀF→({tau[0]:.2f},{tau[1]:.2f})")
print(f"虚功: 关节={Wj:.4f}, 末端={We:.4f}, 一致={'✓' if abs(Wj-We)<1e-10 else '✗'}")import numpy as np
L1,L2=1.,0.8
def jac(q): return np.array([[-L1*np.sin(q[0])-L2*np.sin(q[0]+q[1]),-L2*np.sin(q[0]+q[1])],[L1*np.cos(q[0])+L2*np.cos(q[0]+q[1]),L2*np.cos(q[0]+q[1])]])
for t2d in [0,30,60,90,120,150,180]:
q=np.array([0,np.radians(t2d)]); J=jac(q); JJT=J@J.T; manip=np.sqrt(np.linalg.det(JJT))
eig=np.linalg.eigvalsh(JJT)
print(f"θ₂={t2d:3d}°: μ={manip:.4f}, σ=({np.sqrt(eig[0]):.3f},{np.sqrt(eig[1]):.3f})")可操作度椭球的形状反映不同方向的运动能力:长轴方向灵活,短轴方向受限。θ₂=90°时各向同性最好。
本课程按"运动学→动力学→力控制→感知规划→实战项目"组织,每课都建立在前面知识基础上。理解本课后,你将:
完成本课后,你应该能够:
完成练习后,继续下一课的学习。本课内容将在后续课程中被反复使用和扩展。
齐次变换矩阵是描述三维空间中刚体位姿的数学工具。一个4×4的齐次变换矩阵T同时包含了旋转信息(3×3旋转矩阵R)和平移信息(3×1位置向量p):
旋转矩阵R是正交矩阵(RᵀR=I,det(R)=1),有3个自由度;位置向量p有3个自由度。因此一个刚体在三维空间中有6个自由度。
旋转有多种等价表示:
DH参数法为每个连杆建立一个坐标系,建立规则如下:
当相邻z轴平行或相交时,需要特殊处理。
实际机器人的运动学参数与设计值有偏差,需要通过运动学标定来补偿。标定流程:
标定后定位精度可从毫米级提升到0.1mm级别。
本课涉及的技术在以下场景中有重要应用:
理解理论与实践的差距,是成为优秀机器人工程师的关键。
仿真验证的算法通常需要以下适配才能部署到实际机器人:参数标定、实时性优化、异常处理、安全保护。仿真与现实的差距(sim-to-real gap)是机器人领域的重要挑战。
Python适合算法验证和原型开发,但生产级控制器通常用C++实现。Python的NumPy/SciPy计算效率约为C++的1/10到1/100,对于1kHz控制频率可能不够。可以使用Cython、Numba或直接C++重写来加速。
推荐步骤:(1) Python仿真验证算法正确性;(2) 添加传感器噪声和延迟模型测试鲁棒性;(3) 用C++重写核心计算模块;(4) 在低速度下实际测试;(5) 逐步提高速度和负载。安全永远是第一位的。
掌握解析和数值两种雅可比计算,理解速度与静力学的对偶关系!
在实际机器人上实验时,请始终遵循以下安全规则: