1. 引言
注意:這裏討論二自由度的機械臂
。
在機械臂動力學中,有時候會用到ode45
計算朗格朗日方程中的關節空間軌跡,關節速度,即求出方程中的q與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
子函數的解釋)
約定:{dx=x˙ddx=x¨
則:
由方程:
τ=M(q˙)q¨+B(q,q˙)q˙+G(q)
得:
q¨=inv(M(q˙))∗(τ−B(q,q˙)q˙−G(q))(1-1)
令;
x=[x(1)x(2)]=[qq˙](1-2)
求導,得:
dx=[dx(1)dx(2)]=[q˙q¨]=[x(2)q¨](1-3)
將式(1-1)帶入式(1-3),得:
dx=[x(2)inv(M)∗(τ−B∗x(2)−G)](1-4)
又因爲是二自由度機械臂,故:
x=[x(1)x(2)]=[qq˙]=⎣⎢⎢⎡q1q2q1˙q2˙⎦⎥⎥⎤=⎣⎢⎢⎡x(1)x(2)x(3)x(4)⎦⎥⎥⎤(1-5)
將式(1-5)帶入式(1-4)可得:
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官方文檔