机器人动力学仿真 - 变量更新顺序不同所产生的结果分析

说明

今年3月初,博主西涯先生提出一个很有意思的问题,他在仿真动力学的时候发现速度更新位置更新顺序不同,导致结果大不相同!

今天突然想起来这件事,先记录一下。


1. 动力学模型

对于一个单杆系统,假设理想情况,不受外力影响且无阻尼,建立动力学模型如下:
θ ˙ = ω ω ˙ = τ J τ = m g L sin θ \begin{aligned} &\dot{\theta}=\omega\\ &\dot{\omega}=\frac{\tau}{J}\\ &\tau=-m g L \sin \theta \end{aligned}

字母就不标注了,反正大家都能看懂!
在这里插入图片描述在这里插入图片描述

2. 仿真

程序1:位置先于速度更新

clc;
clear all;
close all;
format long e

%% 参数初始化
T = 10; 
period = 0.01; 
m = 1;
g = 9.8;
L = 0.01;
J = 0.01;
theta = 0.5;
w = 0;
tau = 0;
Record = [];

%% 开始仿真
for t = 0:period:T
    % 计算力矩
    tau = -m*g*L*sin(theta);
    % 位置更新
    theta = theta + period*w;
    % 速度更新
    w = w + period * tau/J;
    % 记录数据
    Record = [Record;t, theta, w, tau];
end

%% 绘图
plot(Record(:,1),Record(:,2)*180/pi, 'g',"LineWidth", 3)
xlabel("时间(s)","FontSize", 20)
ylabel("角度(^。)","FontSize", 20)

在这里插入图片描述

位置更新在速度更新之前,由于没有外界能力输入,不可能产生振动现象,该程序仿真结果明显有问题!

程序2:速度更新先于位置更新

clc;
clear all;
close all;
format long e

%% 参数初始化
T = 10; 
period = 0.01; 
m = 1;
g = 9.8;
L = 0.01;
J = 0.01;
theta = 0.5;
w = 0;
tau = 0;
Record = [];

%% 开始仿真
for t = 0:period:T
    % 计算力矩
    tau = -m*g*L*sin(theta);
    % 速度更新
    w = w + period * tau/J;
    % 位置更新
    theta = theta + period*w;
    % 记录数据
    Record = [Record;t, theta, w, tau];
end

%% 绘图
plot(Record(:,1),Record(:,2)*180/pi, 'g',"LineWidth", 3)
xlabel("时间(s)","FontSize", 20)
ylabel("角度(^。)","FontSize", 20)

在这里插入图片描述

位置更新在速度更新之后,由于不受外界影响,连杆在重力作用下产生完美的简谐运动!

另外,西涯先生发现仿真步长选取的不同,仿真结果也会有影响。

扫描二维码关注公众号,回复: 10843410 查看本文章
  • 对于程序1而言,仿真步长越大,仿真结果越不理想!仿真图如下:
    在这里插入图片描述

  • 对于程序2而言,不管仿真如何变化,最终结果相差不大!仿真图如下:
    在这里插入图片描述

3. 分析

问题1:仅仅换了更新位置,为什么会出现这么大的差别呢?

我们来分析一下,首先来看动力学模型,对于 t t 时刻而言,它的状态有:
θ ( t ) ˙ = ω ( t ) ω ( t ) ˙ = τ ( t ) J τ ( t ) = m g L sin θ ( t ) \begin{aligned} &\dot{\theta(t)}=\omega(t)\\ &\dot{\omega(t)}=\frac{\tau(t)}{J}\\ &\tau(t)=-m g L \sin \theta(t) \end{aligned}

整理一下:
τ ( t ) = m g L sin θ ( t ) ω ( t ) ˙ = τ ( t ) J θ ( t ) ˙ = ω ( t ) = ω ( t ) ˙ t + ω ( t 1 ) \begin{aligned} &\tau(t)=-m g L \sin \theta(t)\\ &\dot{\omega(t)}=\frac{\tau(t)}{J}\\ &\dot{\theta(t)}=\omega(t)=\dot{\omega(t)}·△t+\omega(t-1)\\ \end{aligned}

我们可以看到,这个顺序恰恰就是程序2的数据更新顺序,所以程序2仿真结果完全没有问题!

对于程序1而言,把位置更新放在速度更新之前,模型变成:
τ ( t ) = m g L sin θ ( t ) θ ( t ) ˙ = ω ( t ) = ω ˙ ( t 1 ) t + ω ( t 1 ) ω ( t ) ˙ = τ ( t ) J \begin{aligned} &\tau(t)=-m g L \sin \theta(t)\\ &\dot{\theta(t)}=\omega(t)=\dot{\omega}(t-1)·△t+\omega(t-1)\\ &\dot{\omega(t)}=\frac{\tau(t)}{J}\\ \end{aligned}

对于同一时刻而言,模型方程是成立的!但是,我们采用的是近似积分法,这就会导致,位置的更新是基于上一时刻的速度更新的,而理想情况下应该是基于当前速度更新才会使得误差为0!所以问题就处在这儿!

问题2:为什么步长影响会这么大?

对于步长足够小的情况下,上一时刻的速度近似等于该时刻的速度,即微元取的越小,仿真误差就会越小;而随着步长的不断扩大,此时 t 1 t-1 时刻速度已经严重滞后于 t t 时刻,这时候如果还用这种近似等效思想显然误差会足够大!

于是也就不难理解这种现象的产生了!

4. 总结

以上问题的产生,归根到底来自理论与实际方法的不同上!

总的来说,程序2的情况在现实生活中并不存在!大多数情况下,我们的控制可能更接近于程序1中的情况,注意是接近

现实情况中,采样、计算都需要时间,这就会造成延迟现象,这种延迟会导致我们计算的结果跟理想情况并非处在同一时刻,所以当计算频率足够快时这种由延时引起的方法误差可以忽略不计,但如果延迟非常大,同样无法实现理想效果。

再回想一下采样定理,想想是不是这么个道理!

在这里插入图片描述


声明

本文转载得到博主西涯先生的许可,基于原文增加分析环节,素材使用请联系西涯先生,本文转载请注明出处。

发布了97 篇原创文章 · 获赞 83 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43455581/article/details/105512156