Simulink—Adams联合仿真:匀速圆周运动的控制
CSDN 2024-09-13 08:01:01 阅读 80
一、前言
用Adams和Simulink实现物体的匀速圆周运动
二、理论分析
我们知道,匀速圆周运动的动力学公式为式子(1)
F——圆周运动的向心力
M——运动物体的质量
V——匀速圆周运动的切向线速度
R——圆周轨迹半径
假设小球在XY平面上做匀速圆周运动,其运动轨迹半径为R,如图所示
分析上图,则存在式子(2)
这里有式子(3)和(4)
则式子(2)可改写为式子(5)
同理,向心力F和切向速度V分别为式子(6)和(7):
这里θ是随着小球的运动时刻变化的,既随时间变化的(8):
小球做匀速圆周运动时,我们知道其角速度
和线速度
存在关系(9):
将(8)和(9)式替换掉前面所有式子中的θ,则我们找出了运动和力关于时间之间关系。同时可
以将圆周运动转化为在X轴和Y轴上的运动进行求解,即简谐运动的求解。
二、解法一 (开环控制)
1、匀速圆周条件
分析小球匀速圆周运动的过程,我们知道要满足以下条件:
(1)切向线速度V,大小保持不变,方向时刻不变
(2)存在一个力F为小球的运动提供向心力
2、初始位置状态
如果一个小球从静止状态开始,要达到圆周运动;则需要在一定时间内加速到指定线速度V,
之后在向心力的作用下开始做圆周运动。在XY平面中,要使小球绕原点O做匀速圆周运动,存在两
种三种情况:
a.小球在运动轨迹范围内:
这种情况下,可以控制小球做螺旋线运动,但需要小球在达到圆周轨迹上的时候速度也刚好
满足要求,然后再向心力的作用下做圆周运动。
b.小球刚好在运动轨迹上:
此种情况下需要小球在极短的时间内加速到指定的切向线速度,之后再提供向心力。
c.小球在运动轨迹外:
此中情况与a类似。可以按照a的方法进行处理。
3、设定初始位置
设想一种特殊状态如图所示,小球4处在XY坐标系第一象限,我们可以先让小球4直线加速到
目标速度V和目标位置小球3处,然后撤销直线加速度a, 同时添加向心力F。理论上小球4达到小
球3位置后,开始进行匀速圆周运动,按此理论创建Adams模型。
其中小球1表示运动中心,连杆2表示运动半径,小球3表示运动轨迹上的点,小球1、3和连
杆2都是固定不动的(Adams中作为参考物体)。小球4是我们需要进行控制做圆周运动的。
图中:
小球1位置(X,Y,Z)=(0,0,0);
连杆2长度(X1,Y1,Z1)=(0,0,0),(X2,Y2,Z2)=(0.45,0,0);
小球3位置(X,Y,Z)=(0,0.45,0);
小球4位置(X,Y,Z)=(0.4,0.45,0)。
4、Adams模型创建
(1)新建模型
新建模型——模型名称:Circle_Ball——选择无重力状态——单位选择(米、千克、牛、秒、
度):MKS(M、kg、N、s、deg)——选择一个工作路径(不能有中文名称),点击确定
即可。
a. 创建小球1:
点击物体——球——半径处可以勾选后自己输入指定半径(注意这里单位是厘米cm),
也可以不勾选拖动达到自己觉得合适的尺寸。这里我选择小球半径5cm(5cm只是为了画面
协调,大小不影响结果的输出)。位置可以直接选择坐标原点位置即可创建成功。
b. 创建连杆2:
选择连杆,长、宽、深可以不用指定。然后点击左边原点处,会自动捕捉参考点,然后任意
位置右键弹出坐标对话框,可以将上述中连杆的第二个坐标复制输入进去,点击应用即可创
建连杆。
PS.如果没有自动捕捉到或者无法自动捕捉,是因为右下角的坐标图标没有打开,点击打开即可。
c.小球3和小球4也是类似的创建,这里以小球4作为演示:
双击小球4——part_5,则显示小球的相关信息如下
将定义质量方式更改为用户输入,输入质量4.5,即表示小球质量4.5kg。其余参数保持默认即可。
其他小球和连杆是保持固定不动的,因此无需更改质量和相关属性。
PS. 这里输入重量的原因是,Adams自己根据材料体积和密度求解出来的重量小数位数很多,我
们也可以自己定义重量、材料或者密度。 这里为了计算方便,直接定义重量。
如何修改:重量按照上述方法进行修改;
修改密度则选择——几何形状和密度
修改材料——几何形状和材料
(2)添加约束
创建完成所有所需模型,在该系统中,只有小球4是可以运动的,其他的都是固定作为参考的。
因此需要对小球1、3和连杆2进行固定。
(1)添加固定副
按图中操作后后选择地面(ground),再在原点位置右键找到小球质心(part2.cm),选择质
心,点击确定,可以看到一个锁图标,即表示对小球1进行固定成功。
同理,连杆2和小球3也是一样的操作方式,这里不做演示了。需要说明的是连杆2无论是固定
在原点(0,0,0),质心(0.225,0,0)还是在连杆的另一端(0.45,0,0)都是可以的。按
上述顺序的质心分别是:
小球1质心:part_2.cm——(0,0,0)
连杆2质心:part_3.cm——(0.225,0,0)
小球3质心:part_4.cm——(0.45,0,0)
小球4质心:part_5.cm——(0.4,,0.45,0)
完成约束后再左边栏连接下面会有三个连接关系。
(2)添加力
完成固定部件的约束后,要使小球4动起来,则需要向它施加一定的力。前面我们分析过,要
是小球能在XY平面内做圆周运动,一个方向上的力是显然是不够的,向心力的大小不变,但方向
是时时变化的,因此需要X和Y方向上都有力。形成的合力始终由小球4质心指向圆心O。
在adams中给我们供了三向矢量力的添加方式:
在左边栏力一栏中能看到我们刚创建的力矢量VFORCE_1,双击即可进行修改。打开之后,
因为小球只在XY平面内运动,因此,这里我们将Z方向的力设置为0。X和Y方向上大家可以试着不
同的力的效果。如果小球4可以运动,则说明模型是正确的。
我这里设置X方向10,Y方向10,则运行之后如图所示
PS.针对上述模型,在Adams中单独实现圆周运动的问题,会在最后进行补充。
(3)添加连接单元
完成基本模型的创建和约束的建立之后,需要创建Adams和Simulink的接口。对于整个
Adams模型来说,我的输入是X方向和Y方向的力,输出是小球在X和Y方向上的位移变化情况。
a. 创建输入力
按图创建单元,名称可改为FX_X(不要命名为FX和FY,因为FX和FY是Adams的函数,是获
取关于X轴和Y轴合力的,图示为错误演示,请更改为FX_X),F(time,…)保持为0,不需要填写。
同理,创建FY_Y。
b. X位移的输出
完成输入力的创建之后,需要进行输出的创建单元——更改名称为WX_X(不要命名为WX和
WY,因为WX和WY是Adams的函数,是获取关于X轴和Y轴的角速度)表示X轴的位移,
F(time,…)右边三个点,点击一下,在辅助一栏下拉找到位移,找到“Distance along X”,双击
“Distance along X”,将定义运行时间函数编辑栏中的0删掉,同时删掉括号内的全部内容,输入小
球4的质心(Part_5.cm)——DX(Part_5.cm)。
点击验证——函数语法正确,则一直点击确定即可
PS. 关于小球4的质心获取方式:点开小球4的部件Part_5,找到cm,双击,将位置栏中的
Part_5.cm复制下来,填入前面位移函数的括号中去即可。
c. Y位移的输出
Y 方向的位移创建与X方向的类似,只是这里的位移函数需要更改为关于Y轴的
“Distance along Y”,括号中同样填入小球的质心“DY(Part_5.cm)”。
至此,完成所有Adams模型的创建,接下来需要将其导出为Simulink模型。
PS. 小球是在三维空间中的,在“添加约束”一节中,我们添加的是三向力,但因为我们的小球是
在XY平面上做运动,不考虑Z轴上的,因此将Z轴上的力设定为恒定值0,所以在添加单元的
时候无需添加Z轴上的FZ_Z。感兴趣的小伙伴也可以自己按照FX_X和FY_Y的添加方式去添
加FZ_Z,然后去连接测试一下,看看能否实现空间球面运动。
(4)Adams模型导出Simulnk
a. 确保插件开启
工具——插件管理器——第一项“Adams Controls”后面的都打勾。
b. 机械系统导出
插件——机械系统导出——输入信号处右键——Adams变量——推测——找到FX和FY,
同理,输出信号处右键——Adams变量——推测——找到WX_X和WY_X,点击确定即可导出。
5、Simulink模型创建
(1)Adams模型打开
上面已完成模型的导出,现在打开matlab,切换路径到我们创建Adams模型工作路径的文件
夹下,直接运行Controls_Plant_1.m,之后我们会看到matlab工作区有很多关于Adams的参数,命
令行窗口也会显示关于输入FX_X、FY_Y和输出WX_X和WY_Y。
大家有兴趣也可以打开Controls_Plant_1.m文件,查看里面的代码,以及一些参数的设定。这
里仅展示,不作解读,Controls_Plant_1.m模型全部代码详情(仅展示,不能运行,抹除了主机信息)
<code>% Adams / MATLAB Interface - Release 2020.0.0
global ADAMS_sysdir; % used by setup_rtw_for_adams.m
global ADAMS_host; % used by start_adams_daemon.m
machine=computer;
datestr(now)
if strcmp(machine, 'GLNXA64')
arch = 'linux64';
elseif strcmp(machine, 'PCWIN64')
arch = 'win64';
else
disp( '%%% Error : Platform unknown or unsupported by Adams Controls.' ) ;
arch = 'unknown_or_unsupported';
return
end
[flag, topdir]=system('adams2020 -top');
if flag == 0
temp_str=strcat(topdir, '/controls/', arch);
addpath(temp_str)
temp_str=strcat(topdir, '/controls/', 'matlab');
addpath(temp_str)
temp_str=strcat(topdir, '/controls/', 'utils');
addpath(temp_str)
ADAMS_sysdir = strcat(topdir, '');
else
addpath( 'D:\ADAMS2020\controls/win64' ) ;
addpath( 'D:\ADAMS2020\controls/matlab' ) ;
addpath( 'D:\ADAMS2020\controls/utils' ) ;
ADAMS_sysdir = 'D:\ADAMS2020\' ;
end
ADAMS_exec = '' ;
ADAMS_host = '************' ;
ADAMS_cwd ='**************' ;
ADAMS_prefix = 'Controls_Plant_2' ;
ADAMS_static = 'no' ;
ADAMS_solver_type = 'C++' ;
ADAMS_version = '2020' ;
if exist([ADAMS_prefix,'.adm']) == 0
disp( ' ' ) ;
disp( '%%% Warning : missing Adams plant model file(.adm) for Co-simulation or Function Evaluation.' ) ;
disp( '%%% If necessary, please re-export model files or copy the exported plant model files into the' ) ;
disp( '%%% working directory. You may disregard this warning if the Co-simulation/Function Evaluation' ) ;
disp( '%%% is TCP/IP-based (running Adams on another machine), or if setting up MATLAB/Real-Time Workshop' ) ;
disp( '%%% for generation of an External System Library.' ) ;
disp( ' ' ) ;
end
ADAMS_init = '' ;
ADAMS_inputs = 'FX_X!FY_Y' ;
ADAMS_outputs = 'WX_X!WY_Y' ;
ADAMS_pinput = 'Controls_Plant_2.ctrl_pinput' ;
ADAMS_poutput = 'Controls_Plant_2.ctrl_poutput' ;
ADAMS_uy_ids = [
1
2
3
4
] ;
ADAMS_mode = 'non-linear' ;
tmp_in = decode( ADAMS_inputs ) ;
tmp_out = decode( ADAMS_outputs ) ;
disp( ' ' ) ;
disp( '%%% INFO : ADAMS plant actuators names :' ) ;
disp( [int2str([1:size(tmp_in,1)]'),blanks(size(tmp_in,1))',tmp_in] ) ;
disp( '%%% INFO : ADAMS plant sensors names :' ) ;
disp( [int2str([1:size(tmp_out,1)]'),blanks(size(tmp_out,1))',tmp_out] ) ;
disp( ' ' ) ;
clear tmp_in tmp_out ;
% Adams / MATLAB Interface - Release 2020.0.0
(2)matlab命令行窗口输入:
adams_sys
回车后弹出Simulink模型。将主要机械系统模块复制到我们新建的Simulink模型中去,不要在弹出
的模型上进行修改。
(2)Simulink控制仿真
a.特殊情况
在本章第3节中我们做了设想,先让小球4加速到速度V,并且位移达到X,也就是到达小球3
位置时,取消提供X方向加速度的力Fx1,然后在小球3位置开始,由Fx和Fy共同作用提供向心力
F。
我们假设2秒钟之后小球4达到小球3位置,小球4从初始位置开始运动到小球3的位置时一个初
速度为0的加速运动,这个过程可以是匀加速,也可以是非匀加速。为求解方便我们可以设定为匀
加速运动。此时我们可以根据匀加速直线运动的运动学公式:
X方向位移 x已知,为0.3m,时间t已知,为2秒。带入即可求得加速度a,从而求的速度t=2s
时刻的速度v。将带入第二章公式(1)中,即可求得向心力F的大小。同时将v带入第二章公式(9),得到匀速圆周运动的角速度
,从而得出X方向和Y方向的力Fx和Fy与向心力F、速度
V、时间t之间的关系:
b. 一般情况
针对上述特殊情况,这里不再过多赘述,下面我们考虑一般情况下,即非匀加速度的直线运动。
假设加速度a与时间t存在某种关系。我们这里设置为:
系数A、B、C可以通过外部环境进行调整(大家也可以设定为其他函数关系,前提是要保证时间
t > 0时,ax是恒大于等于0的,否则不同系数下可能导致先加速后减速或先反向后正向,无法达到
预定位置)。这里设A=0.2,B=0.6,C=0,其他系数大家可以自己去测试。
将上述参数全部整理如下:
小球4质量M: M=4.5kg
初始目标位移X: X=0.4m
轨迹半径R: R=0.45m
加速度ax的时间系数: A=0.2, B=0.6, C=0;
c. 算法逻辑
沿着X轴负方向加速运动,当运动达到小球3位置时,加速度ax为0,此时开始提供向心
力,在小球3位置时,Fx应该沿着X轴正方向,值为0;Fy沿着Y轴负方向,值为F,在
这个过程中需要求出小球4达到小球3位置时的时间t和速度V,然后分别记为Tmax和Vmax。然后
将Tmax和Vmax带入:
同时在小球3位置时,Fx应该沿着X轴正方向,值为0;Fy沿着Y轴负方向,值为F,带入Tmax和
Vmax,则上式中需要加上一个相位
,即:
满足Fx和Fy的初始值要求,则:
即(这里的pi即圆周率π):
得到:
则完整的Fx和Fy的计算应该为:
综上,在Simulink中实现算法如下:
模型解读(从左到右):
接下来需要求出Tmax和Vmax(时间久了,暂时看不懂了,等理解了再来解释):
d. 实现仿真
前面已完成Simulink的算法模型建立,在建模——模型设置(或快捷键Ctrl+E)在变部长类型
下选择ode113(Adams)求解器,仿真时间设置20秒。
可以将示波器模块连接需要查看的模块,点击运行后查看示波器:
Fx和Fy的曲线(符合期望):
Wx和Wy(也符合期望):
将X 和Y方向的位移组合绘制处小球4的运动轨迹:
轨迹绘图代码(这里限制坐标X和Y范围为-0.5到0.5了,如果有需要更改这力的值即可,或者直接删掉这一行):
<code>axis([-0.5 0.5 -0.5 0.5]);
% 计算圆的坐标
circle_x = out.Circle_WX.Data;
circle_y = out.Circle_WY.Data;
circle_xtime = out.Circle_WX.Time;
circle_ytime = out.Circle_WY.Time;
tx = circle_xtime;
ty = circle_ytime;
x = circle_x;
y = circle_y;
% 在 MATLAB 图形窗口中绘制圆
figure; plot(x, y);
%小球在XY平面上的轨迹曲线
xlabel('X');
ylabel('Y');
title('圆的轨迹');
axis equal;
axis([-0.5 0.5 -0.5 0.5]);
grid on;
clc;
如果需要查看Adams的运动动画,按下图进行操作即可:
之后在Simulink中重新启动仿真,编译完成之后会弹出Adams的窗口,即可看到运动画面。
无论是matlab绘制运动轨迹还是在Adams中,圆心总体是朝着一个方向运动的,导致不是完
整的圆?这是为什么?
原因分析:即使是在变步长的情况,时间始终是离散的,所以在初始位移达到0.4是,加速度
ax不是瞬间变为0的,而是在很小一段时间内才变为0,线速度在这一短时间也是变化的,使用相
同的逻辑也可以在Adams中实现小球的圆周运动,然后直接在Admas查看速度情况,当时间t大于
Tmax之后的时间内,速度V并不是一条完整的直线。(写时间太久了,等我休息几个小时后再补充过来)。
(3)问题解析
a. 解决方法一
改成连续系统(理论分析),操作方法:
不过这种方式下,只能在Simulink中进行仿真,通过示波器或者轨迹作图查看结果,在Admas中即使打开交互窗口,小球也不会运动。结果如图所示,呈现完整的圆了。
b. 解决方法二
更换控制方法,这也是我将在第三章中的内容,这里先做简单介绍,具体等我有空了再补充。
控制方法:采用PID控制器,目标位置与实际位置的误差输入PID,PID输出量作为Adams模
型的输入量输入到系统中去。大家可以自己先尝试一下。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。