关于在 matlab 中使用 ode45 算出拉格朗日方程中的关节加速度

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)(τBx(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官方文档

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 假设要求参数k对所有变量的偏导数,其ODE45动力学方程为: $\begin{bmatrix}M(q) & -J(q)^T\\J(q) & 0\end{bmatrix}\begin{bmatrix}\ddot{q}\\\tau\end{bmatrix}+\begin{bmatrix}C(q,\dot{q})\\\Gamma(q)\end{bmatrix}=\begin{bmatrix}0\\u\end{bmatrix}$ 其,$q$为关节角度,$\dot{q}$为关节角速度,$\ddot{q}$为关节加速度,$\tau$为关节力矩,$J(q)$为运动学雅克比矩阵,$M(q)$为质量矩阵,$C(q,\dot{q})$为科里奥利力,$\Gamma(q)$为重力向量,$u$为外部控制输入。 偏导数可以通过符号运算得到,具体步骤如下: 1. 定义符号变量 ```matlab syms q1 q2 q3 q4 dq1 dq2 dq3 dq4 ddq1 ddq2 ddq3 ddq4 tau1 tau2 tau3 tau4 k ``` 其,q1-q4为关节角度,dq1-dq4为关节角速度,ddq1-ddq4为关节加速度,tau1-tau4为关节力矩,k为要求偏导数的参数。 2. 定义动力学方程 ```matlab M = [m11 m12 m13 m14; m21 m22 m23 m24; m31 m32 m33 m34; m41 m42 m43 m44]; J = [j11 j12 j13 j14; j21 j22 j23 j24]; C = [c1;c2;c3;c4]; Gamma = [g1;g2;g3;g4]; u = [u1;u2;u3;u4]; q = [q1;q2;q3;q4]; dq = [dq1;dq2;dq3;dq4]; ddq = [ddq1;ddq2;ddq3;ddq4]; tau = [tau1;tau2;tau3;tau4]; F = [M, -J.'; J, zeros(2)]*[ddq;tau]+[C;Gamma]; ``` 其,m11-m44为质量矩阵,j11-j24为运动学雅克比矩阵,c1-c4为科里奥利力,g1-g4为重力向量,u1-u4为外部输入,F为动力学方程。 3. 求偏导数 ```matlab dfdq1 = diff(F,q1); dfdq2 = diff(F,q2); dfdq3 = diff(F,q3); dfdq4 = diff(F,q4); dfddq1 = diff(F,ddq1); dfddq2 = diff(F,ddq2); dfddq3 = diff(F,ddq3); dfddq4 = diff(F,ddq4); dftau1 = diff(F,tau1); dftau2 = diff(F,tau2); dftau3 = diff(F,tau3); dftau4 = diff(F,tau4); dfk = diff(F,k); ``` 最终得到的dfdq1-dfq4,dfddq1-dfddq4,dftau1-dftau4以及dfk就是所求的偏导数。 ### 回答2: 在MATLAB,我们可以使用ode45函数来求变刚度阻尼双足机器人的动力学方程。假设我们有一个由n个状态变量组成的向量x,其包含机器人关节角度、速度和加速度动力学方程可以表示为dx/dt = f(x, t),其f是一个描述系统行为的函数。 要计算某个参数对所有变量的偏导数,我们可以使用符号计算工具包Symbolic Math Toolbox。首先,我们需要定义参数和变量为符号变量。例如,我们可以使用syms命令定义一个参数k和一个状态变量向量x: syms k syms x1 x2 ... xn x = [x1; x2; ...; xn] 然后,我们可以定义动力学方程f(x, t)。这个方程可能涉及到参数k和状态变量x的数学函数和运算。例如,假设我们的动力学方程是一个简单的线性方程:f(x, t) = k*x。我们可以使用这个方程来计算某个参数k对所有变量x的偏导数。使用diff函数,我们可以计算偏导数: df_dx = diff(f, x) 最后,我们可以使用ode45函数来求动力学方程。我们需要定义一个函数handle,该函数返回动力学方程的值f(x, t),并告诉ode45函数要求的时间范围和初始条件。例如: fun = @(t, x) k*x; % 定义动力学方程 tspan = [0 10]; % 时间范围 x0 = [0; 0; ...; 0]; % 初始条件 [t, x] = ode45(fun, tspan, x0); % 求动力学方程 通过上述步骤,我们可以使用ode45函数求变刚度阻尼双足机器人的动力学方程,并计算某个参数对所有变量的偏导数。具体的参数和动力学方程取决于问题的具体细节,并需要进行适当的定义。以上仅是一个示例,实际情况下需要根据具体问题进行相应的修改和调整。 ### 回答3: 要求变刚度阻尼双足机器人的动力学方程,并求其某个参数对所有变量的偏导数,可以使用ODE45函数配合MATLAB来实现。 首先,我们需要建立双足机器人的动力学模型。这个模型可以是基于拉格朗日方程的运动方程,描述机器人各个关节的运动和力学特性。然后,我们需要将运动方程转化为一阶形式,得到机器人的状态方程。 接下来,利用ODE45函数求机器人的状态方程ODE45MATLAB提供的一个数值求常微分方程ODE)的函数,可以通过指定的初始条件和时间段,计算出ODE在这个时间段内的数值。在这里,我们需要将机器人的状态方程输入到ODE45函数,然后指定所需的初始条件和时间范围,接着使用ODE45来计算机器人的状态变量。 最后,我们可以计算出某个参数对所有变量的偏导数。这可以通过MATLAB的符号工具箱的符号计算功能来实现。我们可以先定义变量和参数,然后使用一个循环来计算每个状态变量对该参数的偏导数。最后,得到所有变量对该参数的偏导数。 综上所述,我们可以利用MATLABODE45函数来求变刚度阻尼双足机器人的动力学方程,并通过符号计算的方法求取其某个参数对所有变量的偏导数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值