因为最近在做一个四足机器人的仿真在网上找了一些资料基本上都不是说得很明白。下面是我参考了一些资料自己做的一个项目和对一些细节做的总结,希望对大家有所帮助和解惑。本次联合仿真用到的软件主要是这三个Solidworks、Adams、Matlabb。
一、Solidworks绘制三维模型
因为本次做的是四足机器人的仿真模型比较复杂如果直接在Adams里面建模效率很慢,因为Adams本身在建模上面就不是很方便,建一些简单的可以直接在Adams里面建对于一些复杂的模型我还是建议用一些专业的软件进行建模。
图(1)是我建好的一个模型,在这里我要说明一下因为四足机器人是通过八个电机作为动力源来驱动的所以建模的时候应把四条腿分解后装配,
图(1)
模型创建好后另存为.x_t格式,文件名建议不要带有中文,因为带有中文在Adams里面识别会报错。
二、ADAMS模型导入及建立运动副
打开Adams选择文件目录下的导入
文件类型选择Parasolid (*.xmt txt, *.x_ t, *.xmt_ bin,*.x_ b)
双击读取文件选择之前保存的.x_t格式的文件
选择模型名称随便命一个名字然后确认
这个时候模型已经成功导入了,接下来还要做一些仿真前的处理,Adams导入Solidworks模型后所有零件的名称都会变成一些字符,所以我们要修改一下零件的名字方便我们后续添加运动副,点击物体把所有的零件重新重命名
名字命名好后然后就是添加移动副点击连接
然后根据每个关节的需要添加旋转副和其他的
添加每条腿的驱动选择旋转驱动
这里的驱动是在之前添加的旋转副上继续添加的
添加足端的接触和重力设置如下不同的摩擦力可以根据具体的环境修改
接下来添加系统单元里面的状态变量,这个变量是用MATLAB来驱动的。
这里VARIABLE_y是机器人的质心位置在水平方向的变化,添加完八个状态变量后要把驱动函数修改一下,点击驱动把八个驱动里面的函数分别修改成VARVAL( Algebraic_Variable_Name )然后把之前创的八个状态变量名复制到对应的驱动即可
接下来创建MATLAB和Adams的联系,选择Adams Controls插件,导出机械系统
输入选择
VARIABLE_zq1
VARIABLE_zq2
VARIABLE_yq1
VARIABLE_yq2
VARIABLE_zh1
VARIABLE_zh2
VARIABLE_yh1
VARIABLE_yh2
输出选择VARIABLE_y
这个时候在Adams里面的设置算是已经完成了,
三、Matlab中与Adams联合仿真
在MATLAB中找到Adams导出Controls_Plant_2.m文件点击运行
在命令行窗口输入adams_sys点回车键弹出simulink界面
复制adams_sub创建一个新的空白模板
点击Library Browsrt
这里我们用的输入量是斜坡函数,在Simulink模块里面找到斜坡函数直接把他拖出来即可
每条大腿的转动副这里我们用“S函数”进行控制的编写,S-函数是系统函数(System Function)的简称,是指采用非图形化的方式(即计算机语言,区别于Simulink的系统模块)描述的一个功能块。用户可以采用MATLAB代码,C,C++,FORTRAM等语言编写S-函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统以及复合系统等动态系统;S-函数能够接受来自Simulink求解器的相关信息,并对求解器发出的命令作出适当的响应。
S-函数模板中的函数特别多,但目前主要使用到的有“mdlInitializeSizes“(模型初始化函数)与”mdlOutputs(t,x,u)“(计算输出函数)。
其初始化部分设置如下:
function [sys,x0,str,ts] = yhk(t,x,u,flag)
%t表示时间;x表示状态量;u输入量;flag特有的变量;
switch flag%判断flag当前处于哪个状态
case 0%运行初始化函数,这个必须有
[sys,x0,str,ts]=mdlInitializeSizes;
case 1%微分
sys=mdlDerivatives(t,x,u);%连续状态的导数
case 2%更新
sys=mdlUpdate(t,x,u);
case 3%输出函数,这个几乎都是需要用到
sys=mdlOutputs(t,x,u);
case 4%输入函数
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys, x0 ,str, ts]= mdlInitializeSizes %初始化,这块特别关键
sizes = simsizes;
sizes.NumContStates = 1;%连续变量个数
sizes.NumDiscStates = 0;%离散变量个数
sizes.NumOutputs = 1;%输出个数;输入与输出个数必须完全对应
sizes.NumInputs = 1;%输入个数
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 =[0];
str = [];
% Ts=0.0001;
ts = [0 0];
function sys=mdlDerivatives(t,x,u)
sys =1;
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u) %u表示输入量
%sys=Move(u,1); %调用编写的函数
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
为了以后修改方便,将所有使用的S-函数调用同一个“Move(t,n)”函数(t表示时间,n表示腿的时序)。为每条腿上的驱动构建一个S-函数。打开simulink的库,点击“User-Defined Function“, 将右侧框图中的“S-Function”拖入图6.5所以界面中,双击拖入的图形,在“S-function name:”中填入自己编写的S-函数名称。之后在库中点击“Sources”,拖入“Ramp”信号作为S-函数的输入。
修改adams_sub,双击adams_sub进入子模块,再双击MSC Spftware设置如下:
点击Run进行仿真,Adams会被自动打开,可以看到仿真动画效果,
输出结果可以点击示波器查看
如果觉得《基于Adams联合MATLAB的联合仿真设置》对你有帮助,请点赞、收藏,并留下你的观点哦!