正运动学(FK)解决:已知关节变量,求末端位姿。这是机械臂控制的基础。
正运动学解:
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 RobotArm:
def __init__(self,dh,jt=None):
self.dh=dh; self.n=len(dh); self.jt=jt or ['R']*self.n
def fk(self,q):
T=np.eye(4); transforms=[T]
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
Ti=dh_matrix(theta,d,a,al); T=T@Ti; transforms.append(T)
return T,transforms
def pos(self,q): T,_=self.fk(q); return T[:3,3]
arm2r=RobotArm([(1.0,0,0,0),(0.8,0,0,0)])
configs=[[0,0],[np.pi/4,np.pi/6],[np.pi/2,-np.pi/4],[np.pi,np.pi/2]]
print("2R平面臂正运动学"); print("="*50)
for q in configs:
p=arm2r.pos(q); T,_=arm2r.fk(q)
print(f"θ=({q[0]:.4f},{q[1]:.4f})→pos=({p[0]:.4f},{p[1]:.4f},{p[2]:.4f})")
L1,L2=1.0,0.8; r_max=L1+L2; r_min=abs(L1-L2)
area=np.pi*(r_max**2-r_min**2)
print(f"\n工作空间: r∈[{r_min:.2f},{r_max:.2f}]m, 面积≈{area:.2f}m²")
np.random.seed(42); ok=0
for _ in range(1000):
q=np.random.uniform(-np.pi,np.pi,2); r=np.sqrt((L1*np.cos(q[0])+L2*np.cos(q[0]+q[1]))**2+(L1*np.sin(q[0])+L2*np.sin(q[0]+q[1]))**2)
if r_min<=r<=r_max: ok+=1
print(f"随机采样验证: {ok}/1000点在可达范围内")import numpy as np
L1,L2=1.0,0.8; N=10000
np.random.seed(0); q1=np.random.uniform(-np.pi,np.pi,N); q2=np.random.uniform(-np.pi,np.pi,N)
x=L1*np.cos(q1)+L2*np.cos(q1+q2); y=L1*np.sin(q1)+L2*np.sin(q1+q2)
r=np.sqrt(x**2+y**2)
print(f"蒙特卡洛采样(N={N})")
print(f" x:[{x.min():.3f},{x.max():.3f}] y:[{y.min():.3f},{y.max():.3f}]")
print(f" r:[{r.min():.3f},{r.max():.3f}] 理论:[{abs(L1-L2):.3f},{L1+L2:.3f}]")蒙特卡洛采样通过大量随机关节角探索工作空间形状,是可视化复杂机械臂工作空间的标准方法。
本课程按"运动学→动力学→力控制→感知规划→实战项目"组织,每课都建立在前面知识基础上。理解本课后,你将:
完成本课后,你应该能够:
完成练习后,继续下一课的学习。本课内容将在后续课程中被反复使用和扩展。
齐次变换矩阵是描述三维空间中刚体位姿的数学工具。一个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) 逐步提高速度和负载。安全永远是第一位的。
掌握从关节空间到笛卡尔空间的映射!
在实际机器人上实验时,请始终遵循以下安全规则: