用 SymPy 进行机器人动力学的符号推导,避免手工计算出错。覆盖分析力学基础、拉格朗日方程和约束处理。
环境安装
1 | pip install sympy |
验证:
1 | import sympy as sp |
从零学分析力学
广义坐标
描述系统位形所需的最少独立变量。n 个自由度 → n 个广义坐标 $q_1, q_2, …, q_n$。
约束
- 完整约束:$f(q_1, …, q_n, t) = 0$(如连杆长度恒定)
- 非完整约束:不可积分为完整约束的约束(如纯滚动条件)
虚功原理
系统平衡时,所有主动力在虚位移上所做的虚功之和为零:
$$\sum_i \mathbf{F}_i \cdot \delta \mathbf{r}_i = 0$$
达朗贝尔原理
将动力学问题转化为静力学问题:
$$\sum_i (\mathbf{F}_i - m_i \ddot{\mathbf{r}}_i) \cdot \delta \mathbf{r}_i = 0$$
拉格朗日方程
标准形式
$$\frac{d}{dt}\frac{\partial L}{\partial \dot{q}_i} - \frac{\partial L}{\partial q_i} = Q_i$$
其中 $L = T - V$(动能 - 势能),$Q_i$ 为非保守广义力。
带约束的拉格朗日方程
$$\frac{d}{dt}\frac{\partial L}{\partial \dot{q}_i} - \frac{\partial L}{\partial q_i} = Q_i + \sum_k \lambda_k \frac{\partial f_k}{\partial q_i}$$
其中 $\lambda_k$ 为拉格朗日乘子,$f_k$ 为约束方程。
SymPy 推导实战
定义符号变量
1 | import sympy as sp |
位形与速度
1 | # 连杆 1 质心位置 |
使用 LagrangesMethod
SymPy 提供了封装好的拉格朗日方法:
1 | from sympy.physics.mechanics import * |
建模要点
- 明确广义坐标:选择能完整描述系统位形的最小独立变量集
- 正确写出动能和势能:对复杂系统,用 SymPy 的
mechanics模块更安全 - 验证约束:检查约束方程是否独立、是否可积
- 线性化:对平衡点附近线性化,得到 $M\ddot{q} + Kq = \tau$
手工推导 3 自由度以上的动力学方程极易出错,强烈建议使用 SymPy 或类似的符号计算工具。