Python | 物理 | 数学 | 线速度 | 角速度 | 运动模型 | 方程 | 多维数组 | 多连接件 | 平衡性 | 六自由度 | 飞行器 | 自行车模型 | 赛车运动模型 | 刚体 | 算法
🎯要点
🎯线速度和角速度计算变换 | 🎯估算不同跟踪系统测量下运动数据表征 | 🎯使用带标签多维数组处理运动数据
🎯代码计算模拟和设计多连接件运动平衡控制模型 | 🎯六自由度双扇驱动飞行器运动模型计算 | 🎯自行车非线性运动方程模型 | 🎯喷气式赛车运动方程建模分析 | 🎯刚体运动三维转换算法 | 🎯刚体运动链模型正反向动力学及算法 | 🎯马尔可夫链蒙特卡罗算法模拟多刚体
📜刚体动力学用例:Python | C# | MATLAB 库卡机器人微分运动学 | 欧拉-拉格朗日动力学 | 混合动力控制
📜刚体动力学用例:Python烟雾液体弹性力微分模拟 | 出租车往返速度微分计算
🍇Python运动学数学矢量
刚体运动学:刚体是具有质量和转动惯量的物理对象的理想化表示。刚体显然不灵活。我们可以将刚体运动分解为平移运动和旋转运动(处理粒子时,我们只有平移运动)。旋转运动可以进一步分解为简单旋转和一般旋转。刚体的平移被定义为在运动过程中物体的方向不改变的运动;或者在运动过程中,任何线段在运动开始时都将与其自身平行。
简单旋转是指身体方向可能发生变化,但在运动开始时始终有一条线与其自身保持平行的旋转。一般旋转是指在运动开始时并不总是有一条与其自身平行的线的旋转。
刚体的角速度是指其方向的变化率。物体的角速度可以写为:N ω B { }^{ N } \omega^{ B } N ω B ,或者B B B 在N N N 中的角速度,N N N 是一个向量。请注意,这里使用了术语“刚体”,但参考系也可以具有角速度。
角速度被定义为导致方向角增加的方向上的正值(对于简单旋转或一系列简单旋转)。角速度矢量表示方向的时间导数。
N N N 中 B B B 的角速度也可以定义为:
N ω B = ( N d b ^ y d t ⋅ b ^ z ) b ^ x + ( N d b ^ z d t ⋅ b ^ x ) b ^ y + ( N d b ^ x d t ⋅ b ^ y ) b ^ z { }^{ N } \omega^{ B }=\left(\frac{{ }^{ N } d \hat{ b }_{ y }}{d t} \cdot \hat{ b }_{ z }\right) \hat{ b }_{ x }+\left(\frac{{ }^{ N } d \hat{ b }_{ z }}{d t} \cdot \hat{ b }_{ x }\right) \hat{ b }_{ y }+\left(\frac{{ }^{ N } d \hat{ b }_{ x }}{d t} \cdot \hat{ b }_{ y }\right) \hat{ b }_{ z } N ω B = ( d t N d b ^ y ⋅ b ^ z ) b ^ x + ( d t N d b ^ z ⋅ b ^ x ) b ^ y + ( d t N d b ^ x ⋅ b ^ y ) b ^ z 物体的角速度也常见写为:
N ω B = w x b ^ x + w y b ^ y + w z b ^ z { }^{ N } \omega^{ B }=w_x \hat{ b }_{ x }+w_y \hat{ b }_{ y }+w_z \hat{ b }_{ z } N ω B = w x b ^ x + w y b ^ y + w z b ^ z 还有一些与角速度相关的重要要点。第一个是角速度的加法定理,这是一种关联多个物体和框架的角速度的方法。定理如下:
N ω D = N ω A + A ω B + B ω C + C ω D N \omega^{ D }={ }^{ N } \omega^{ A }+{ }^{ A } \omega^{ B }+{ }^{ B } \omega^{ C }+{ }^{ C } \omega^{ D } N ω D = N ω A + A ω B + B ω C + C ω D 这里我们可以很容易地写出第一个物体 A 的参考系中物体 D 的角速度:
A ω D = w 1 P 1 ^ + w 2 P 2 ^ + w 3 P 3 ^ { }^{ A } \omega^{ D }=w_1 \hat{ P _1}+w_2 \hat{ P _2}+w_3 \hat{ P _3} A ω D = w 1 P 1 ^ + w 2 P 2 ^ + w 3 P 3 ^ 记住仅将其与角速度一起使用非常重要;你不能将此定理用于点的速度。还有一个常用的定理:导数定理。它提供了一种替代方法(更容易)来计算参考系中向量的时间导数:
N N d v d t = B d v d t + N ω B × v \frac{ N ^{ N } d v }{d t}=\frac{ B _{d v }}{d t}+{ }^{ N } \omega^{ B } \times v d t N N d v = d t B d v + N ω B × v 向量v v v 可以是任何向量:位置向量、速度向量、角速度向量等。我们不是在N N N 中取向量的时间导数,而是在B B B 中取它,其中B B B 可以是任何参考系或物体,通常是在其中很容易对 v v v 求导的参考系或物体( v v v 通常仅由属于 B B B 的基向量集组成)。然后我们添加新坐标系的角速度 N ω B N _{ \omega } B N ω B 和向量v v v 的叉积。同样,您可以为此选择任何替代框架。示例如下:
角加速度是指角速度矢量随时间的变化率。正如角速度矢量针对物体并在坐标系中指定一样,角加速度矢量针对物体并在坐标系中指定:N α B { }^{ N } \alpha ^{ B } N α B ,或角加速度矢量B B B 在 N N N (矢量)中的加速度。
计算角加速度相对简单:
N α B = N d N ω B d t d t N _\alpha^{ B }=\frac{ N _{d^{ N } \omega^{ B }}^{d t}}{d t} N α B = d t N d N ω B d t 现在应该清楚了,这里的运动学主题主要描述了操纵向量来表示点的速度的正确方法。在此,有方便的方法来存储与参考系和点相关的这些速度。
Python伪代码实现上述功能:
Copy from pyx import Symbol , sin , cos
from pyx . physics . vector import *
init_vprinting (pretty_print = False )
N = ReferenceFrame ( 'N' )
q1 = dynamicsymbols ( 'q1' )
A = N . orientnew ( 'A' , 'Axis' , [q1, N.x])
A . ang_vel_in (N)
请注意,角速度可以用另一种方式定义:
Copy B = ReferenceFrame('B')
u1 = dynamicsymbols('u1')
B.set_ang_vel(N, u1 * B.y)
B.ang_vel_in(N)
N.ang_vel_in(B)
在 orientnew 期间创建参考系以及调用 set_ang_vel 时,都会在所涉及的两个参考系中设置角速度,如上所示。
这里我们有多个物体,它们的角速度是相对于彼此定义的。
Copy N = ReferenceFrame ( 'N' )
A = ReferenceFrame ( 'A' )
B = ReferenceFrame ( 'B' )
C = ReferenceFrame ( 'C' )
D = ReferenceFrame ( 'D' )
u1 , u2 , u3 = dynamicsymbols ( 'u1 u2 u3' )
A . set_ang_vel (N, 0 )
B . set_ang_vel (A, u1 * A.x)
C . set_ang_vel (B, - u2 * B.z)
D . set_ang_vel (C, u3 * C.y)
D . ang_vel_in (N)
在 pyx.physics.vector 中,在求角速度时使用两参考系之间的最短路径。这意味着如果我们返回并设置:
Copy D . set_ang_vel (N, 0 )
D . ang_vel_in (N)
刚刚定义的路径就是所使用的路径。但这可能会导致问题,因为现在角速度定义不一致。点是旋转参考系的平移模拟。创建点可以通过两种方式完成,例如ReferenceFrame:
Copy O = Point ( 'O' )
P = O . locatenew ( 'P' , 3 * N.x + N.y)
P . pos_from (O)
Q = Point ( 'Q' )
Q . set_pos (P, N.z)
Q . pos_from (P)
Q . pos_from (O)
与 ReferenceFrame 类似,两点之间的位置向量由它们之间的最短路径(中间点的数量)找到。与旋转运动不同,点的速度没有加法定理。为了获得 ReferenceFrame 中某个点的速度,您必须设置该值。
Copy O = Point ( 'O' )
O . set_vel (N, u1 * N.x)
O . vel (N)
对于平移和旋转加速度,该值是通过适当速度的时间导数来计算的,除非用户另有设置。
Copy O . acc (N)
O . set_acc (N, u2 * u1 * N.y)
O . acc (N)