第1章:运动学模型——机器人运动学基础

各位同学,大家好。我是你们这门课的老朋友。

今天咱们聊点硬核的——运动学模型。说白了,就是研究机器人怎么动、动到哪、能不能动到的问题。我做了这么多年机器人抓取,发现很多同学一上来就调PID、调轨迹,结果机器人要么撞墙,要么抓不住东西。为什么?因为运动学没吃透。

1.1 正运动学:从关节到末端

正运动学,就是已知每个关节的角度,求末端执行器在空间中的位置和姿态。嗯,这个方向是确定的,没有歧义。

我记得刚入行时,带我的老工程师说:“正解是送分题,逆解才是送命题。” 后来我发现,正解虽然简单,但它是所有上层算法的基础。你连末端在哪都不知道,还谈什么轨迹跟踪?

常用的方法就是DH参数法。我习惯用改进型DH,因为它在处理树形结构机器人时更直观。来看一个简单的六轴机器人正解示例:

import numpy as np

def dh_transform(theta, d, a, alpha):
    """
    标准DH参数变换矩阵
    """
    ct = np.cos(theta)
    st = np.sin(theta)
    ca = np.cos(alpha)
    sa = np.sin(alpha)
    
    T = np.array([
        [ct, -st*ca,  st*sa, a*ct],
        [st,  ct*ca, -ct*sa, a*st],
        [0,    sa,     ca,    d],
        [0,    0,      0,     1]
    ])
    return T

# 六轴机器人正解示例
def forward_kinematics(joint_angles, dh_params):
    T = np.eye(4)
    for i in range(len(joint_angles)):
        theta = joint_angles[i] + dh_params[i]['offset']
        T = T @ dh_transform(theta, dh_params[i]['d'], 
                              dh_params[i]['a'], dh_params[i]['alpha'])
    return T

小技巧: 我建议你在调试时,先用一个已知的关节角度组合(比如所有关节归零),手动算一遍末端位置。这样能快速验证你的DH参数有没有写错。我曾经因为一个符号搞反,排查了整整两天。

1.2 逆运动学:从末端到关节

逆运动学就复杂多了。给定末端位姿,求关节角度。说白了,就是“反着算”。

为什么难?因为解不唯一。一个六轴机器人,同一个末端位置,可能有8组甚至更多解。你想想看,你的手臂够到同一个点,肘关节可以朝上也可以朝下,对吧?

我常用的方法分两种:

  • 解析法: 针对特定构型(比如有腕部偏置的机器人),可以推导出封闭解。速度快,适合实时控制。
  • 数值法: 比如牛顿-拉夫森迭代。通用性强,但需要好的初值,否则容易发散。

这里有个坑,我踩过很多次——奇异点。当机器人处于奇异位形时,逆解会失效。比如肘关节完全伸直时,你没法通过微调关节来改变末端位置。嗯,这时候雅可比矩阵就派上用场了。

1.3 雅可比矩阵:速度与力的桥梁

雅可比矩阵,说白了就是关节速度到末端速度的线性映射。它把关节空间和操作空间联系起来了。

我个人习惯把雅可比矩阵分成两部分:

  • 线性速度部分: 关节转动如何影响末端位置变化
  • 角速度部分: 关节转动如何影响末端姿态变化

来看一个简单的2自由度平面臂的雅可比矩阵推导:

def jacobian_2dof(theta1, theta2, l1, l2):
    """
    2自由度平面臂的雅可比矩阵
    """
    s1 = np.sin(theta1)
    c1 = np.cos(theta1)
    s12 = np.sin(theta1 + theta2)
    c12 = np.cos(theta1 + theta2)
    
    J = np.array([
        [-l1*s1 - l2*s12, -l2*s12],
        [ l1*c1 + l2*c12,  l2*c12]
    ])
    return J

重点: 雅可比矩阵的秩决定了机器人的灵巧度。当秩下降时,机器人就进入了奇异位形。我在做抓取规划时,一定会避开这些区域,否则末端速度会突然变得很大,导致抓取失败。

1.4 速度与加速度约束

光有运动学还不够,你还得考虑机器人的物理限制。每个关节都有最大速度、最大加速度。你想想看,如果轨迹规划出来的速度超过了电机能承受的范围,那结果就是——电机过载、报警、停机。

我一般会在轨迹生成阶段就加入这些约束:

  • 关节速度约束: 每个关节的角速度不能超过额定值
  • 关节加速度约束: 防止冲击和振动
  • 末端速度约束: 根据抓取任务调整,比如抓鸡蛋时末端速度不能超过0.1m/s

这里有个经验值:我通常把加速度限制在额定值的70%左右,留出余量。为什么?因为实际负载和摩擦会消耗一部分能力。我曾经在产线上遇到过,理论计算没问题,但实际跑起来电机发烫严重。后来发现是加速度设得太极限了。

1.5 运动学模型在轨迹跟踪中的作用

好了,前面讲了这么多基础,现在说说它们怎么用在轨迹跟踪上。

轨迹跟踪的核心,就是让机器人末端按照预定的路径运动。但控制器是在关节空间里工作的,而路径是在操作空间里定义的。怎么办?

答案就是:通过运动学模型来回转换。

  1. 正向映射: 把期望的关节轨迹映射到操作空间,验证是否满足末端路径要求
  2. 逆向映射: 把操作空间的路径误差映射回关节空间,生成关节补偿量
  3. 雅可比转置: 把操作空间的力映射为关节力矩,实现力控抓取

我常用的一个框架是这样的:

# 轨迹跟踪中的运动学应用示例
def trajectory_control(joint_angles, desired_pose, Kp, dt):
    # 1. 正解:计算当前末端位姿
    current_pose = forward_kinematics(joint_angles, dh_params)
    
    # 2. 计算操作空间误差
    error = desired_pose - current_pose
    
    # 3. 通过雅可比逆映射到关节空间
    J = compute_jacobian(joint_angles)
    joint_velocity = np.linalg.pinv(J) @ (Kp * error)
    
    # 4. 施加速度约束
    joint_velocity = np.clip(joint_velocity, -max_vel, max_vel)
    
    # 5. 更新关节角度
    new_joint_angles = joint_angles + joint_velocity * dt
    return new_joint_angles

注意: 使用伪逆时,一定要检查雅可比矩阵的条件数。条件数过大说明接近奇异点,这时候伪逆的结果会很不稳定。我建议设置一个阈值,当条件数超过100时,切换到阻尼最小二乘法。

最后,我想说一句:运动学模型不是万能的,但没有它是万万不能的。你后面学动力学、学控制、学抓取规划,每一步都离不开今天讲的这些基础。所以,别急着跳过去,多花点时间把正解、逆解、雅可比矩阵吃透。

嗯,今天就到这里。记住,理论是死的,但应用是活的。多动手写代码,多在实际机器人上验证,你才能真正理解这些概念。

运动学模型知识体系 运动学模型 正运动学 逆运动学 雅可比矩阵 速度/加速度约束 DH参数法 关节→末端位姿 唯一解 基础验证工具 解析法/数值法 末端位姿→关节 多解/奇异点 需避坑 速度/力映射 关节→末端速度 条件数判断 奇异点检测 物理限制 电机额定值 留余量70% 防过载 应用:轨迹跟踪、抓取规划、力控

可可精品资料库