导航菜单

机器人运动学与动力学

运动学基础

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 T

2. 逆运动学

逆运动学研究如何从末端执行器的位置和姿态计算关节角度。 通常使用解析法或数值法求解。

解析法
  • 几何法:利用几何关系直接求解
  • 代数法:通过代数方程求解
  • 适用于简单机器人结构
数值法
  • 雅可比矩阵法
  • 优化方法
  • 适用于复杂机器人结构
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.x

3. 雅可比矩阵

雅可比矩阵描述了关节速度与末端执行器速度之间的关系, 在速度控制和奇异点分析中起重要作用。

应用场景
  • 速度控制
  • 奇异点分析
  • 工作空间分析
  • 力控制
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