机器人运动学与动力学
运动学基础
1. 正运动学
正运动学研究如何从关节角度计算末端执行器的位置和姿态。 使用DH参数法和齐次变换矩阵进行描述。
DH参数法
- 连杆长度(a):相邻关节轴之间的公垂线长度
- 连杆扭角(α):相邻关节轴之间的夹角
- 连杆偏移(d):相邻连杆之间的偏移距离
- 关节角度(θ):相邻连杆之间的旋转角度
Python实现示例:
import numpy as np
from scipy.spatial.transform import Rotation
class ForwardKinematics:
def __init__(self):
self.dh_params = [] # DH参数表
def set_dh_params(self, dh_params):
self.dh_params = dh_params
def transform_matrix(self, a, alpha, d, theta):
"""计算单个关节的变换矩阵"""
ct = np.cos(theta)
st = np.sin(theta)
ca = np.cos(alpha)
sa = 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]
])
def forward_kinematics(self, joint_angles):
"""计算正运动学"""
T = np.eye(4)
for i, (a, alpha, d, theta) in enumerate(self.dh_params):
theta = theta + joint_angles[i]
T = T @ self.transform_matrix(a, alpha, d, theta)
return T2. 逆运动学
逆运动学研究如何从末端执行器的位置和姿态计算关节角度。 通常使用解析法或数值法求解。
解析法
- 几何法:利用几何关系直接求解
- 代数法:通过代数方程求解
- 适用于简单机器人结构
数值法
- 雅可比矩阵法
- 优化方法
- 适用于复杂机器人结构
Python实现示例:
import numpy as np
from scipy.optimize import minimize
class InverseKinematics:
def __init__(self, robot):
self.robot = robot
def objective_function(self, joint_angles, target_pose):
"""目标函数:最小化末端执行器位置误差"""
current_pose = self.robot.forward_kinematics(joint_angles)
position_error = np.linalg.norm(current_pose[:3, 3] - target_pose[:3, 3])
orientation_error = np.linalg.norm(current_pose[:3, :3] - target_pose[:3, :3])
return position_error + orientation_error
def solve_ik(self, target_pose, initial_angles=None):
"""求解逆运动学"""
if initial_angles is None:
initial_angles = np.zeros(self.robot.num_joints)
result = minimize(
self.objective_function,
initial_angles,
args=(target_pose,),
method='SLSQP',
bounds=[(-np.pi, np.pi) for _ in range(self.robot.num_joints)]
)
return result.x3. 雅可比矩阵
雅可比矩阵描述了关节速度与末端执行器速度之间的关系, 在速度控制和奇异点分析中起重要作用。
应用场景
- 速度控制
- 奇异点分析
- 工作空间分析
- 力控制
Python实现示例:
import numpy as np
class Jacobian:
def __init__(self, robot):
self.robot = robot
def compute_jacobian(self, joint_angles):
"""计算雅可比矩阵"""
n = len(joint_angles)
J = np.zeros((6, n))
T = np.eye(4)
z_axes = []
origins = []
# 计算每个关节的变换矩阵和z轴
for i in range(n):
T = T @ self.robot.transform_matrix(i, joint_angles[i])
z_axes.append(T[:3, 2])
origins.append(T[:3, 3])
# 计算雅可比矩阵
for i in range(n):
J[:3, i] = np.cross(z_axes[i], origins[-1] - origins[i])
J[3:, i] = z_axes[i]
return J
def check_singularity(self, joint_angles, threshold=1e-6):
"""检查奇异点"""
J = self.compute_jacobian(joint_angles)
det = np.linalg.det(J[:3, :3])
return abs(det) < threshold