首页
/ 从零开始的机械臂控制:SymPy机器人学运动学与动力学实战

从零开始的机械臂控制:SymPy机器人学运动学与动力学实战

2026-02-04 04:04:13作者:仰钰奇

你是否还在为机械臂运动学方程推导耗时费力而烦恼?是否在动力学建模中被复杂的矩阵运算劝退?本文将带你用SymPy实现机械臂运动学与动力学的全流程计算,无需手动推导公式,让计算机代数系统为你完成繁琐的数学运算。读完本文后,你将能够:

  • 使用参考坐标系描述机械臂结构
  • 自动生成正运动学方程
  • 计算雅可比矩阵分析速度传递关系
  • 建立多关节机器人的动力学模型

SymPy机器人学核心模块

SymPy通过sympy.physics.vector模块提供机器人学计算所需的核心功能,包括向量、坐标系和运动学计算工具。该模块实现了参考坐标系(ReferenceFrame)、向量(Vector)和方向余弦矩阵(DCM)等关键概念,为机械臂建模提供数学基础。

参考坐标系与向量运算

参考坐标系是机器人建模的基础,通过ReferenceFrame类可以创建具有正交单位向量的坐标系。以下代码创建两个坐标系并实现基本旋转:

from sympy.physics.vector import ReferenceFrame
N = ReferenceFrame('N')  # 创建固定坐标系
A = ReferenceFrame('A')  # 创建关节坐标系
q = dynamicsymbols('q')  # 关节角度变量
A.orient_axis(N, q, N.z)  # 绕N系z轴旋转q角

向量运算通过Vector类实现,支持点积、叉积和标量乘法等操作。方向余弦矩阵(DCM)用于坐标系间的变换,可通过dcm()方法获取:

dcm = A.dcm(N)  # 获取A系到N系的方向余弦矩阵
velocity = 5 * A.x  # 创建A系x方向的速度向量
expressed_in_N = velocity.express(N)  # 将速度向量转换到N系

相关实现代码位于:

机械臂正运动学建模

正运动学求解是已知关节角度计算末端执行器位姿的过程。以平面2R机械臂为例,我们通过串联坐标系变换实现末端位置计算。

坐标系建立与变换

机械臂每个关节处建立一个坐标系,通过旋转矩阵描述相邻坐标系间的变换关系。对于平面2R机械臂,基座坐标系(N)、肩部坐标系(A)和腕部坐标系(B)的关系如下:

N = ReferenceFrame('N')  # 基座坐标系
A = N.orientnew('A', 'Axis', [q1, N.z])  # 肩部坐标系(绕z轴旋转q1)
B = A.orientnew('B', 'Axis', [q2, A.z])  # 腕部坐标系(绕z轴旋转q2)

末端位置计算

末端执行器位置通过各连杆长度与关节角度的三角函数关系计算。对于长度为l1和l2的连杆,末端位置向量为:

l1, l2 = symbols('l1 l2')
P = Point('P')  # 末端点
P.set_pos(N, l1*A.x + l2*B.x)  # 设置末端位置
position = P.pos_from(N)  # 获取末端在N系中的位置向量

执行上述代码后,position将包含末端坐标的符号表达式,展开后可得:

l1*cos(q1) + l2*cos(q1 + q2)  # x坐标
l1*sin(q1) + l2*sin(q1 + q2)  # y坐标

速度雅可比矩阵

雅可比矩阵描述关节速度与末端速度的关系,是机器人速度控制和力控制的核心工具。SymPy可通过偏导数计算自动生成雅可比矩阵。

雅可比矩阵构建

使用partial_velocity函数计算末端速度对各关节速度的偏导数,构成雅可比矩阵列向量:

from sympy.physics.vector import partial_velocity
u1, u2 = dynamicsymbols('u1 u2')  # 关节速度变量
A.set_ang_vel(N, u1*N.z)  # 设置A系角速度
B.set_ang_vel(A, u2*A.z)  # 设置B系角速度
P.set_vel(N, l1*u1*A.y + l2*(u1 + u2)*B.y)  # 末端速度

# 计算雅可比矩阵
J = partial_velocity([P.vel(N)], [u1, u2], N)[0]

雅可比矩阵应用

雅可比矩阵可用于:

  • 速度控制:X˙=Jq˙\dot{X} = J \dot{q}
  • 静力平衡:τ=JTF\tau = J^T F
  • 奇异点分析:det(J)=0\det(J) = 0

动力学建模与仿真

动力学方程描述关节力矩与运动的关系,是机械臂轨迹规划和控制的基础。SymPy通过拉格朗日方法可自动推导多关节机器人的动力学方程。

动能与势能计算

对于平面2R机械臂,动能包括连杆转动和移动动能,势能为重力势能:

from sympy.physics.mechanics import Lagrangian, dynamicsymbols
m1, m2, g = symbols('m1 m2 g')  # 质量和重力加速度

# 计算动能(T)和势能(V)
T = (1/2)*m1*(l1*u1)**2 + (1/2)*m2*((l1*u1)**2 + (l2*(u1+u2))**2 + 2*l1*l2*u1*(u1+u2)*cos(q2))
V = m1*g*(l1/2)*cos(q1) + m2*g*(l1*cos(q1) + (l2/2)*cos(q1+q2))
L = Lagrangian(N, T - V)  # 拉格朗日函数

动力学方程推导

使用拉格朗日方程ddt(Lq˙)Lq=τ\frac{d}{dt}(\frac{\partial L}{\partial \dot{q}}) - \frac{\partial L}{\partial q} = \tau推导关节力矩:

from sympy.physics.mechanics import LagrangesMethod
tau1, tau2 = dynamicsymbols('tau1 tau2')  # 关节力矩
lm = LagrangesMethod(L, [q1, q2], forcelist=[(tau1, q1), (tau2, q2)], frame=N)
equations = lm.form_lagranges_equations()  # 获取动力学方程

生成的动力学方程具有标准形式:M(q)q¨+C(q,q˙)q˙+G(q)=τ\mathbf{M}(q)\ddot{q} + \mathbf{C}(q,\dot{q})\dot{q} + \mathbf{G}(q) = \tau,包含惯性矩阵(M)、科里奥利力(C)和重力项(G)。

实战案例:机械臂轨迹规划

结合上述知识,我们实现一个完整的机械臂控制流程:从关节空间轨迹规划到末端执行器路径生成。

关节空间轨迹规划

使用三次多项式生成关节空间平滑轨迹:

t, t0, tf = symbols('t t0 tf')
q0, qf = symbols('q0 qf')  # 起始和目标角度

# 三次多项式轨迹
q = q0 + (qf - q0)*((t - t0)/(tf - t0))**3 * (6*((t - t0)/(tf - t0))**2 - 15*((t - t0)/(tf - t0)) + 10)

末端执行器轨迹仿真

将关节轨迹转换为末端位置轨迹并可视化:

import matplotlib.pyplot as plt
import numpy as np

# 代入具体参数
q1_traj = q.subs({q0: 0, qf: pi/2, t0: 0, tf: 1})
q2_traj = q.subs({q0: 0, qf: pi/3, t0: 0, tf: 1})

# 计算末端位置
x = l1*cos(q1_traj) + l2*cos(q1_traj + q2_traj)
y = l1*sin(q1_traj) + l2*sin(q1_traj + q2_traj)

# 数值计算并绘图
t_vals = np.linspace(0, 1, 100)
x_vals = [x.subs({t: tv, l1: 1, l2: 1}) for tv in t_vals]
y_vals = [y.subs({t: tv, l1: 1, l2: 1}) for tv in t_vals]
plt.plot(x_vals, y_vals)

总结与扩展

SymPy为机器人学研究提供了强大的符号计算工具,能够:

  1. 自动推导运动学和动力学方程
  2. 生成可直接用于控制器实现的解析表达式
  3. 辅助机器人设计和性能分析

进阶应用方向

  • 机器人 calibration:参数辨识与误差分析
  • 轨迹优化:最小能量和时间最优轨迹
  • 多体系统动力学:复杂机器人机构建模

通过SymPy的符号计算能力,工程师可以将更多精力放在算法设计而非数学推导上,显著提高机器人研发效率。

进一步学习资源

掌握SymPy机器人学建模方法,将为你的机器人项目开发提供强大的数学计算支持,让复杂的机器人动力学问题变得简单可控。

登录后查看全文
热门项目推荐
相关项目推荐