详细的介绍匀加速运动的物理方程是如何转化为卡尔曼滤波的状态空间模型的
flyfish
加速度是描述物体速度变化快慢的物理量,定义为速度对时间的变化率。数学上,它表示为:
a
=
Δ
v
Δ
t
a = \frac{\Delta v}{\Delta t}
a=ΔtΔv
其中:
-
a a a 是加速度,单位是 m/s 2 \text{m/s}^2 m/s2
-
Δ v \Delta v Δv 是速度的变化量,单位是 m/s \text{m/s} m/s
-
Δ t \Delta t Δt 是时间的变化量,单位是 s \text{s} s
单位解析
我们来看加速度单位的推导:
a
=
Δ
v
Δ
t
a = \frac{\Delta v}{\Delta t}
a=ΔtΔv
-
速度的单位是 m/s \text{m/s} m/s,表示每秒钟移动的米数。
-
时间的单位是 s \text{s} s,表示时间的长度。
将速度单位 m/s \text{m/s} m/s 代入加速度的公式中:
a = Δ v Δ t = m/s s = m/s 2 a = \frac{\Delta v}{\Delta t} = \frac{\text{m/s}}{\text{s}} = \text{m/s}^2 a=ΔtΔv=sm/s=m/s2
以例子来理解
假设一个物体初始位置为 s 0 = 0 s_0 = 0 s0=0 米,初速度 v 0 = 2 v_0 = 2 v0=2 米/秒,加速度 a = 1 a = 1 a=1 米/秒²。我们来计算它在 t = 3 t = 3 t=3 秒后的位移。
给定参数:
-
初始位置: s 0 = 0 s_0 = 0 s0=0 米
-
初速度: v 0 = 2 v_0 = 2 v0=2 米/秒
-
加速度: a = 1 a = 1 a=1 米/秒²
速度的计算公式
速度随时间变化的公式为:
v
=
v
0
+
a
⋅
t
v = v_0 + a \cdot t
v=v0+a⋅t
我们来计算每一秒的速度。
在
t
=
0
t = 0
t=0 秒时:
v
(
0
)
=
v
0
+
a
⋅
0
=
2
+
1
⋅
0
=
2
米/秒
v(0) = v_0 + a \cdot 0 = 2 + 1 \cdot 0 = 2 \text{ 米/秒}
v(0)=v0+a⋅0=2+1⋅0=2 米/秒
在
t
=
1
t = 1
t=1 秒时:
v
(
1
)
=
v
0
+
a
⋅
1
=
2
+
1
⋅
1
=
3
米/秒
v(1) = v_0 + a \cdot 1 = 2 + 1 \cdot 1 = 3 \text{ 米/秒}
v(1)=v0+a⋅1=2+1⋅1=3 米/秒
在
t
=
2
t = 2
t=2 秒时:
v
(
2
)
=
v
0
+
a
⋅
2
=
2
+
1
⋅
2
=
4
米/秒
v(2) = v_0 + a \cdot 2 = 2 + 1 \cdot 2 = 4 \text{ 米/秒}
v(2)=v0+a⋅2=2+1⋅2=4 米/秒
在
t
=
3
t = 3
t=3 秒时:
v
(
3
)
=
v
0
+
a
⋅
3
=
2
+
1
⋅
3
=
5
米/秒
v(3) = v_0 + a \cdot 3 = 2 + 1 \cdot 3 = 5 \text{ 米/秒}
v(3)=v0+a⋅3=2+1⋅3=5 米/秒
结果
-
t = 0 t = 0 t=0 秒时,速度是 2 米/秒 2 \text{ 米/秒} 2 米/秒
-
t = 1 t = 1 t=1 秒时,速度是 3 米/秒 3 \text{ 米/秒} 3 米/秒
-
t = 2 t = 2 t=2 秒时,速度是 4 米/秒 4 \text{ 米/秒} 4 米/秒
-
t = 3 t = 3 t=3 秒时,速度是 5 米/秒 5 \text{ 米/秒} 5 米/秒
import matplotlib.pyplot as plt
import numpy as np
# Given parameters
s0 = 0 # initial position in meters
v0 = 2 # initial velocity in meters/second
a = 1 # acceleration in meters/second^2
t_max = 3 # time in seconds
# Time array from 0 to t_max with small increments
time = np.linspace(0, t_max, 500)
# Velocity function based on the equation v = v0 + a*t
velocity = v0 + a * time
# Specific time points
specific_times = [0, 1, 2, 3]
specific_velocities = [v0 + a * t for t in specific_times]
# Plotting the velocity vs. time
plt.figure(figsize=(10, 6))
plt.plot(time, velocity, label='Velocity v(t)')
# Marking specific velocities at t = 0, 1, 2, 3 seconds
for t, v in zip(specific_times, specific_velocities):
plt.scatter(t, v, color='red')
plt.text(t, v, f' v({t}) = {v} m/s', fontsize=12, verticalalignment='bottom')
# Adding labels and title
plt.xlabel('Time (seconds)')
plt.ylabel('Velocity (meters/second)')
plt.title('Velocity vs. Time for Uniformly Accelerated Motion')
plt.legend()
plt.grid(True)
# Show the plot
plt.show()
当物体做匀加速直线运动时,位移计算不能简单地通过加每一秒的速度来求得。这是因为速度在匀加速运动中是不断变化的,因此位移应该用速度的平均值来计算。
平均速度的概念
在匀加速直线运动中,从初速度 v 0 v_0 v0 到某一时刻的速度 v ( t ) v(t) v(t),速度在这段时间内线性变化。对于匀加速运动,平均速度可以表示为起始速度和终止速度的平均值: 平均速度 = v 0 + v ( t ) 2 \text{平均速度} = \frac{v_0 + v(t)}{2} 平均速度=2v0+v(t)
位移公式
在时间 t t t 内的位移 s ( t ) s(t) s(t) 可以用平均速度乘以时间来求得: s ( t ) = 平均速度 × t = ( v 0 + v ( t ) 2 ) × t s(t) = \text{平均速度} \times t = \left(\frac{v_0 + v(t)}{2}\right) \times t s(t)=平均速度×t=(2v0+v(t))×t
公式推导
对于匀加速运动,我们知道:
v
(
t
)
=
v
0
+
a
⋅
t
v(t) = v_0 + a \cdot t
v(t)=v0+a⋅t代入位移公式:
s
(
t
)
=
(
v
0
+
(
v
0
+
a
⋅
t
)
2
)
×
t
s(t) = \left(\frac{v_0 + (v_0 + a \cdot t)}{2}\right) \times t
s(t)=(2v0+(v0+a⋅t))×t
s
(
t
)
=
(
2
v
0
+
a
⋅
t
2
)
×
t
s(t) = \left(\frac{2v_0 + a \cdot t}{2}\right) \times t
s(t)=(22v0+a⋅t)×t
s
(
t
)
=
(
v
0
+
a
⋅
t
2
)
×
t
s(t) = \left(v_0 + \frac{a \cdot t}{2}\right) \times t
s(t)=(v0+2a⋅t)×t
s
(
t
)
=
v
0
⋅
t
+
1
2
a
⋅
t
2
s(t) = v_0 \cdot t + \frac{1}{2} a \cdot t^2
s(t)=v0⋅t+21a⋅t2
计算 3 秒后的位移
现在,我们应用这个公式计算 3 秒后的位移:
给定:
-
初始位置: s 0 = 0 s_0 = 0 s0=0 米
-
初速度: v 0 = 2 v_0 = 2 v0=2 米/秒
-
加速度: a = 1 a = 1 a=1 米/秒²
-
时间: t = 3 t = 3 t=3 秒
代入位移公式:
s ( 3 ) = v 0 ⋅ 3 + 1 2 a ⋅ 3 2 s(3) = v_0 \cdot 3 + \frac{1}{2} a \cdot 3^2 s(3)=v0⋅3+21a⋅32
s ( 3 ) = 2 ⋅ 3 + 1 2 ⋅ 1 ⋅ 3 2 s(3) = 2 \cdot 3 + \frac{1}{2} \cdot 1 \cdot 3^2 s(3)=2⋅3+21⋅1⋅32
s ( 3 ) = 6 + 1 2 ⋅ 9 s(3) = 6 + \frac{1}{2} \cdot 9 s(3)=6+21⋅9
s ( 3 ) = 6 + 4.5 s(3) = 6 + 4.5 s(3)=6+4.5
s ( 3 ) = 10.5 米 s(3) = 10.5 \text{ 米} s(3)=10.5 米
import matplotlib.pyplot as plt
import numpy as np
# Given parameters
s0 = 0 # initial position in meters
v0 = 2 # initial velocity in meters/second
a = 1 # acceleration in meters/second^2
t = 3 # time in seconds
# Time array from 0 to t with small increments
time = np.linspace(0, t, 500)
# Position function based on the kinematic equation s = s0 + v0*t + (1/2)*a*t^2
position = s0 + v0*time + 0.5*a*time**2
# Calculate specific position at t = 3 seconds
s_t = s0 + v0*t + 0.5*a*t**2
# Plotting the position vs. time
plt.figure(figsize=(10, 6))
plt.plot(time, position, label='Position s(t)')
# Marking the initial position
plt.scatter(0, s0, color='red', zorder=5)
plt.text(0, s0, f' s0 = {s0} m', fontsize=12, verticalalignment='bottom')
# Marking the position at t = 3 seconds
plt.scatter(t, s_t, color='blue', zorder=5)
plt.text(t, s_t, f' s(3) = {s_t:.2f} m', fontsize=12, verticalalignment='bottom', horizontalalignment='right')
# Marking the trajectory
plt.annotate('Initial Velocity $v_0 = 2$ m/s', xy=(1, s0 + v0 * 1), xytext=(1, 2), arrowprops=dict(facecolor='black', shrink=0.05))
plt.annotate('Constant Acceleration $a = 1$ m/s²', xy=(2, s0 + v0 * 2 + 0.5 * a * 2**2), xytext=(2, 5), arrowprops=dict(facecolor='black', shrink=0.05))
# Adding labels and title
plt.xlabel('Time (seconds)')
plt.ylabel('Position (meters)')
plt.title('Position vs. Time for Uniformly Accelerated Motion')
plt.legend()
plt.grid(True)
# Show the plot
plt.show()
将匀加速运动的物理方程转化为卡尔曼滤波的状态空间模型
匀加速直线运动的基本方程
我们知道匀加速直线运动的基本公式有两个:
-
速度公式:
v ( t ) = v 0 + a t v(t) = v_0 + at v(t)=v0+at -
位移公式:
s ( t ) = s 0 + v 0 t + 1 2 a t 2 s(t) = s_0 + v_0 t + \frac{1}{2} a t^2 s(t)=s0+v0t+21at2
其中:
-
s ( t ) s(t) s(t) 是位置
-
v ( t ) v(t) v(t) 是速度
-
s 0 s_0 s0 是初始位置
-
v 0 v_0 v0 是初始速度
-
a a a 是加速度
-
t t t 是时间
状态变量的定义
定义状态向量:
x
k
=
[
s
k
v
k
]
\mathbf{x}_k = \begin{bmatrix} s_k \\ v_k \end{bmatrix}
xk=[skvk]
状态转移方程的推导
位置的状态转移
第
k
k
k 时刻的位置
s
k
s_k
sk 可以由前一时刻的位置和速度表示:
s
k
=
s
k
−
1
+
v
k
−
1
Δ
t
+
1
2
a
(
Δ
t
)
2
s_k = s_{k-1} + v_{k-1} \Delta t + \frac{1}{2} a (\Delta t)^2
sk=sk−1+vk−1Δt+21a(Δt)2
速度的状态转移
第
k
k
k 时刻的速度
v
k
v_k
vk 由前一时刻的速度和加速度表示:
v
k
=
v
k
−
1
+
a
Δ
t
v_k = v_{k-1} + a \Delta t
vk=vk−1+aΔt
矩阵形式的状态转移方程
将上面的方程写成矩阵形式:
-
状态向量:
x k − 1 = [ s k − 1 v k − 1 ] \mathbf{x}_{k-1} = \begin{bmatrix} s_{k-1} \\ v_{k-1} \end{bmatrix} xk−1=[sk−1vk−1] -
状态转移矩阵:
A = [ 1 Δ t 0 1 ] \mathbf{A} = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} A=[10Δt1] -
控制输入矩阵:
B = [ 1 2 ( Δ t ) 2 Δ t ] \mathbf{B} = \begin{bmatrix} \frac{1}{2} (\Delta t)^2 \\ \Delta t \end{bmatrix} B=[21(Δt)2Δt] -
过程噪声(假设为零均值,协方差矩阵为 Q \mathbf{Q} Q):
w k − 1 \mathbf{w}_{k-1} wk−1 -
加速度(控制输入):
u k − 1 = a \mathbf{u}_{k-1} = a uk−1=a
所以,状态转移方程为:
x k = A x k − 1 + B u k − 1 + w k − 1 \mathbf{x}_k = \mathbf{A} \mathbf{x}_{k-1} + \mathbf{B} \mathbf{u}_{k-1} + \mathbf{w}_{k-1} xk=Axk−1+Buk−1+wk−1具体展开:
x k = [ 1 Δ t 0 1 ] [ s k − 1 v k − 1 ] + [ 1 2 ( Δ t ) 2 Δ t ] a + w k − 1 \mathbf{x}_k = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} s_{k-1} \\ v_{k-1} \end{bmatrix} + \begin{bmatrix} \frac{1}{2} (\Delta t)^2 \\ \Delta t \end{bmatrix} a + \mathbf{w}_{k-1} xk=[10Δt1][sk−1vk−1]+[21(Δt)2Δt]a+wk−1
观测方程
假设我们只能测量位置
s
k
s_k
sk,观测方程为:
z
k
=
H
x
k
+
v
k
\mathbf{z}_k = \mathbf{H} \mathbf{x}_k + \mathbf{v}_k
zk=Hxk+vk
其中,观测矩阵
H
\mathbf{H}
H 为:
H
=
[
1
0
]
\mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix}
H=[10]
具体例子
假设时间步长 Δ t = 1 \Delta t = 1 Δt=1 秒,初始状态 x 0 = [ 0 2 ] \mathbf{x}_0 = \begin{bmatrix} 0 \\ 2 \end{bmatrix} x0=[02],加速度 a = 1 a = 1 a=1 米/秒²。
-
初始化 :
x 0 = [ 0 2 ] \mathbf{x}_0 = \begin{bmatrix} 0 \\ 2 \end{bmatrix} x0=[02]
P 0 = [ 1 0 0 1 ] \mathbf{P}_0 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} P0=[1001] -
预测步骤 :
x 1 = [ 1 1 0 1 ] [ 0 2 ] + [ 1 2 ⋅ 1 2 1 ] ⋅ 1 \mathbf{x}_1 = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 0 \\ 2 \end{bmatrix} + \begin{bmatrix} \frac{1}{2} \cdot 1^2 \\ 1 \end{bmatrix} \cdot 1 x1=[1011][02]+[21⋅121]⋅1
x 1 = [ 0 + 2 + 0.5 2 + 1 ] = [ 2.5 3 ] \mathbf{x}_1 = \begin{bmatrix} 0 + 2 + 0.5 \\ 2 + 1 \end{bmatrix} = \begin{bmatrix} 2.5 \\ 3 \end{bmatrix} x1=[0+2+0.52+1]=[2.53]
从积分的角度看匀加速直线运动
在匀加速直线运动中,加速度 a a a 是常数。我们从以下几个基本公式开始:
- 速度-时间关系 :
v = v 0 + a t v = v_0 + at v=v0+at
其中:
-
v v v 是任意时刻的速度
-
v 0 v_0 v0 是初始速度
-
a a a 是加速度
-
t t t 是时间
- 位移-时间关系 (通过积分速度得到位移): s = ∫ v d t s = \int v \, dt s=∫vdt
其中:
- s s s 是位移
推导过程
-
写出速度作为时间的函数 : v ( t ) = v 0 + a t v(t) = v_0 + at v(t)=v0+at
-
对速度函数进行积分,得到位移 : s ( t ) = ∫ 0 t v ( t ) d t = ∫ 0 t ( v 0 + a t ) d t s(t) = \int_0^t v(t) \, dt = \int_0^t (v_0 + at) \, dt s(t)=∫0tv(t)dt=∫0t(v0+at)dt
-
将速度函数拆开积分 : s ( t ) = ∫ 0 t v 0 d t + ∫ 0 t a t d t s(t) = \int_0^t v_0 \, dt + \int_0^t at \, dt s(t)=∫0tv0dt+∫0tatdt
-
计算每部分的积分 :
-
对于 ∫ 0 t v 0 d t \int_0^t v_0 \, dt ∫0tv0dt: ∫ 0 t v 0 d t = v 0 ∫ 0 t 1 d t = v 0 [ t ] 0 t = v 0 t \int_0^t v_0 \, dt = v_0 \int_0^t 1 \, dt = v_0 [t]_0^t = v_0 t ∫0tv0dt=v0∫0t1dt=v0[t]0t=v0t
-
对于 ∫ 0 t a t d t \int_0^t at \, dt ∫0tatdt: ∫ 0 t a t d t = a ∫ 0 t t d t = a [ t 2 2 ] 0 t = a t 2 2 = 1 2 a t 2 \int_0^t at \, dt = a \int_0^t t \, dt = a \left[ \frac{t^2}{2} \right]_0^t = a \frac{t^2}{2} = \frac{1}{2} a t^2 ∫0tatdt=a∫0ttdt=a[2t2]0t=a2t2=21at2
- 将两部分积分结果相加 : s ( t ) = v 0 t + 1 2 a t 2 s(t) = v_0 t + \frac{1}{2} a t^2 s(t)=v0t+21at2
最终,匀加速运动的位移公式为:
s
=
s
0
+
v
0
t
+
1
2
a
t
2
s = s_0 + v_0 t + \frac{1}{2} a t^2
s=s0+v0t+21at2
物体在初速度 v 0 v_0 v0 和加速度 a a a 作用下,经过时间 t t t 后的总位移。其中的 1 2 \frac{1}{2} 21 由积分 a t at at 得到的结果而来,反映了加速度对位移的二次贡献。