从零开始的机械臂控制:SymPy机器人学运动学与动力学实战
你是否还在为机械臂运动学方程推导耗时费力而烦恼?是否在动力学建模中被复杂的矩阵运算劝退?本文将带你用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系
相关实现代码位于:
- 向量类:sympy/physics/vector/vector.py
- 参考坐标系:sympy/physics/vector/frame.py
- 运动学函数:sympy/physics/vector/functions.py
机械臂正运动学建模
正运动学求解是已知关节角度计算末端执行器位姿的过程。以平面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]
雅可比矩阵应用
雅可比矩阵可用于:
- 速度控制:
- 静力平衡:
- 奇异点分析:
动力学建模与仿真
动力学方程描述关节力矩与运动的关系,是机械臂轨迹规划和控制的基础。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) # 拉格朗日函数
动力学方程推导
使用拉格朗日方程推导关节力矩:
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)、科里奥利力(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为机器人学研究提供了强大的符号计算工具,能够:
- 自动推导运动学和动力学方程
- 生成可直接用于控制器实现的解析表达式
- 辅助机器人设计和性能分析
进阶应用方向
- 机器人 calibration:参数辨识与误差分析
- 轨迹优化:最小能量和时间最优轨迹
- 多体系统动力学:复杂机器人机构建模
通过SymPy的符号计算能力,工程师可以将更多精力放在算法设计而非数学推导上,显著提高机器人研发效率。
进一步学习资源
- SymPy官方文档:doc/src
- 机器人学示例代码:sympy/physics/vector/tests
- 机械臂控制教程:README.md
掌握SymPy机器人学建模方法,将为你的机器人项目开发提供强大的数学计算支持,让复杂的机器人动力学问题变得简单可控。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00