1. 引言
注意:这里讨论二自由度的机械臂
。
在机械臂动力学中,有时候会用到ode45
计算朗格朗日方程中的关节空间轨迹,关节速度,即求出方程中的q与
q
˙
\dot{q}
q˙:
τ
=
M
(
q
˙
)
q
¨
+
B
(
q
,
q
˙
)
q
˙
+
G
(
q
)
\tau = M(\dot{q})\ddot{q} + B(q,\dot{q})\dot{q} + G(q)
τ=M(q˙)q¨+B(q,q˙)q˙+G(q)
2. 方法
1. mainFun.m
主函数片段
xk = [q(1);q(2);d_q(1);d_q(2)]; % 分别是 关节空间和关节转速
[t,x] = ode45('subFun',tspan,x0);
xk = x(length(x),:);
q = [xk(1);xk(2)];
d_q = [xk(3);xk(4)];
2. subFun.m
子函数
function dx = subFun(tspan,x0)
dx = zeros(4,1);
dx = [x(3);x(4);inv(M)*(tol-B*[x(3);x(4)]-G)];
end
3. 如何写子函数(对subFun.m
子函数的解释)
约定:
{
d
x
=
x
˙
d
d
x
=
x
¨
\left\{\begin{matrix} &dx = \dot{x}\\ & ddx = \ddot{x} \end{matrix}\right.
{dx=x˙ddx=x¨
则:
由方程:
τ
=
M
(
q
˙
)
q
¨
+
B
(
q
,
q
˙
)
q
˙
+
G
(
q
)
\tau = M(\dot{q})\ddot{q} + B(q,\dot{q})\dot{q} + G(q)
τ=M(q˙)q¨+B(q,q˙)q˙+G(q)
得:
q
¨
=
i
n
v
(
M
(
q
˙
)
)
∗
(
τ
−
B
(
q
,
q
˙
)
q
˙
−
G
(
q
)
)
(1-1)
\ddot{q} = inv(M(\dot{q}))*(\tau - B(q,\dot{q})\dot{q} - G(q)) \tag{1-1}
q¨=inv(M(q˙))∗(τ−B(q,q˙)q˙−G(q))(1-1)
令;
x
=
[
x
(
1
)
x
(
2
)
]
=
[
q
q
˙
]
(1-2)
x= \begin{bmatrix} x(1) \\ x(2) \end{bmatrix}= \begin{bmatrix} q \\ \dot{q} \end{bmatrix} \tag{1-2}
x=[x(1)x(2)]=[qq˙](1-2)
求导,得:
d
x
=
[
d
x
(
1
)
d
x
(
2
)
]
=
[
q
˙
q
¨
]
=
[
x
(
2
)
q
¨
]
(1-3)
dx= \begin{bmatrix} dx(1) \\ d x(2) \end{bmatrix}= \begin{bmatrix} \dot{q} \\ \ddot{q} \end{bmatrix}= \begin{bmatrix} x(2) \\ \ddot{q} \end{bmatrix} \tag{1-3}
dx=[dx(1)dx(2)]=[q˙q¨]=[x(2)q¨](1-3)
将式(1-1)带入式(1-3),得:
d
x
=
[
x
(
2
)
i
n
v
(
M
)
∗
(
τ
−
B
∗
x
(
2
)
−
G
)
]
(1-4)
dx= \begin{bmatrix} x(2) \\ inv(M)*(\tau - B*x(2) - G) \end{bmatrix} \tag{1-4}
dx=[x(2)inv(M)∗(τ−B∗x(2)−G)](1-4)
又因为是二自由度机械臂,故:
x
=
[
x
(
1
)
x
(
2
)
]
=
[
q
q
˙
]
=
[
q
1
q
2
q
1
˙
q
2
˙
]
=
[
x
(
1
)
x
(
2
)
x
(
3
)
x
(
4
)
]
(1-5)
x= \begin{bmatrix} x(1) \\ x(2) \end{bmatrix}= \begin{bmatrix} q \\ \dot{q} \end{bmatrix}= \begin{bmatrix} q_1 \\ q_2 \\ \dot{q_1}\\ \dot{q_2} \end{bmatrix}= \begin{bmatrix} x(1) \\ x(2)\\ x(3)\\ x(4) \end{bmatrix} \tag{1-5}
x=[x(1)x(2)]=[qq˙]=⎣⎢⎢⎡q1q2q1˙q2˙⎦⎥⎥⎤=⎣⎢⎢⎡x(1)x(2)x(3)x(4)⎦⎥⎥⎤(1-5)
将式(1-5)带入式(1-4)可得:
d
x
4
×
1
=
[
x
(
3
)
x
(
4
)
i
n
v
(
M
)
∗
(
τ
−
B
∗
[
x
(
3
)
;
x
(
4
)
]
−
G
)
]
=
[
q
1
˙
q
2
˙
q
1
¨
q
2
¨
]
dx_{4\times 1}= \begin{bmatrix} x(3) \\ x(4) \\ inv(M)*(\tau - B*[x(3);x(4)] - G) \end{bmatrix}= \begin{bmatrix} \dot{q_1} \\ \dot{q_2} \\ \ddot{q_1}\\ \ddot{q_2} \end{bmatrix}
dx4×1=⎣⎡x(3)x(4)inv(M)∗(τ−B∗[x(3);x(4)]−G)⎦⎤=⎣⎢⎢⎡q1˙q2˙q1¨q2¨⎦⎥⎥⎤
以上,则是子函数的代码逻辑。
4. 参考文章
1.matlab求解常微分方程(组)—dsolve、ode系列函数详解(含例程)
2. MATLAB / SIMULINK通信系统建模与仿真实例分析
3. ode45官方文档