第一步,建立零件并封装零件,这一步里面包括要把需要的坐标系建立出来(坐标系的目的是为了装配,即自由度约束)。这一步就类似于SolidWorks中的建立零件
第二步,修改坐标系,这一步是SolidWorks中没有的,我也是把Multibody弄明白之后反过来理解了SolidWorks的背后装配思路,其实就是坐标系连接,只不过SolidWorks里面是后台操作的,我们看不到这些东西。这一步相当于SolidWorks中装配的第一步。
第三步,装配,即连接坐标系。这一步里面需要增加关节,然后把所有的零件和关节头连尾巴、头连尾巴、头连尾巴,这样子连起来就行了。这一步相当于SolidWorks中装配的第二步。
第四步,施加驱动力和增加传感器。前三步完成了建模,从第四步开始加力和传感器,这样就实现了驱动和数据输出。
第五步,设计控制器。
第六步,仿真分析。
下面我们以Matlab官方的一个双曲柄瞄准机构的建模为例讲解。
这个例子中包含四个构件,摇杆A,摇杆B,滑块C和大地D。初学时我们做一些简化,大地我们简化成一个杆件,这个杆件在装配的时候和大地固连。A和B从图里面看有孔,我们也忽略,按照前面建立单摆模型时一样,直接让他们干涉连接,最后的效果像下面这个样子。
A和D之间是铰接的关系,有一个转动自由度,A和C之间是滑动连接,有一个滑动自由度。所以在A上面我们要建立两个新的坐标系。
使用smnew新建一个Multibody文件,里面的默认组件先不管他。
拖进来一个Cylindrical Solid,命名为Link A,增加两个Rigid Transform,改名如下图 ,增加两个Connection Port,命名Fad和Fac,像下面这样子连起来(注意B都是朝里的,两个坐标系的B连接brick的B)
然后框选上面的组件,右键Create Subsystem
多出来的外面的这俩端口删掉,命名为rigid body A
变成这样
下面我们指定一下A的尺寸、密度、颜色。
注意看,右边的预览,轴向方向是沿着Z轴的。前面建立装配体(笔记4)那一篇我重点提醒了,所有的旋转关节转轴都是沿着Z轴的,滑动关节都是沿着Z轴的。 所以,连接处的坐标系必须进行旋转。这一步我们放到后面统一做
B的形状和A是一样的,不过B两个端部都是转动关节。
我们把刚才建立A的Subsystem直接复制一个,命名为rigid body B。然后双击进去把名字全都改一下
然后双击Link B,修改属性
滑块C一样的,我们复制一个刚才的rigid body A子系统,命名为rigid body C,双击进去。由于C是个滑块,我们要把Cylindrical Solid删掉,换成一个Brick Solid,然后全部重新命名,如图所示。
然后双击Link C,修改属性
杆件D也是回转体,和A、B形状是一样的,但是D除了与A、与B铰接之外,还要与地球固连,所以要给他新建一个坐标系。我们直接复制一个Rigid Body A过来,命名为Rigid Body D,双击进去,修改名字。
然后双击Link D,修改属性
现在我们的文件里面包含了四个杆件了
下面是重点了,怎么旋转坐标系。
我们刚才已经把坐标系建立进去了,但现在里面没有设置,默认没有旋转,也没有平移,也就是说新建立的坐标系和零件的基坐标系重合(基坐标系R一般是几何中心)。
下面我们开始修改坐标系。修改坐标系我是按照装配关系来的,也就是先改D(和大地连接),再改A,再B,最后改C。
展开D零件,双击World Frame Transform,修改如下。把这个坐标系移动到头上面,然后绕Y轴旋转-90°。注意Fdw是要接到地理坐标系的,也就是地理坐标系绕着D的Y轴转-90度,那么反过来D绕着地理坐标系的Y轴转+90度。
以上这句话请深刻理解。
退出去,把A、B、C comment out(注释掉)操作如下:
然后把地理坐标系与D连起来,
运行一下,结果是这样的。请重点看这个图,Fdw与世界坐标系(左下角显示)是固连的,Fdw与D的极坐标系(在杆件的重心)的关系就是我们刚才设定的,沿Z轴平移半个长度,绕Y轴旋转-90度。
我们做的这件事其实就是把D给横过来。
好了,现在回头再双击进入rigid body D,修改两个Hole FrameTransform。我们还是看上面这个图,我们要把两个Hole FrameTransform的z轴转到地理-y轴这个朝向。所以修改方法为,绕x轴旋转90度。
再次运行,看看结果,图示就是left Hole FrameTransform坐标系。z轴已经转过来了,与设定的一致。点一下左侧浏览器的right Hole FrameTransform,可以看到在尾巴上也有一个坐标系了,朝向和这个一样。
经过刚才的讲解,我们已经知道套路了,对于B,依然要把两个关节坐标系Z轴转过来。
A的话只有一个旋转关节,这个坐标系跟上面B的坐标系旋转方法一样,移动关节不需要改,因为z轴本来就是沿着轴向的。
C的话又不一样了,因为C是个方块,他与A是滑动连接,与B要转动连接,我们回头看看C的预览
X轴长度是10,我们其实是想沿着C的x轴方向滑动的,那么怎么转呢?提问三秒钟。
显然,绕着Y轴转90度就可以了。
然后C还要绕着B来转,其实是想让它绕着自己的y轴转,怎么转呢?又是提问三秒钟。
这里绕着x轴旋转90度就行了。
不能理解请回头看这句话:
Multibody中所有的旋转关节转轴都是沿着Z轴的,滑动关节都是沿着Z轴的。所以,连接处的坐标系必须进行旋转,转完后新的z轴要沿着想要的转动方向或滑动方向。
经过刚才的步骤,我们把所有的坐标系都建立起来了,现在可以连接了。连接是通过关节来连接的,拖进来三个Revolute Joint和一个Prismatic Joint,然后依次连接起来。这一步是最爽的了哈哈,超级简单。
双击Rdb关节,把初始角度改成30度
运行一下,效果就出来了
我们的安装方向是竖着装的,此时还没有设置任何外部力与内部力,所以在重力的作用下系统会乱动,像下面这样子
下面我们怎么驱动力与传感器。我们把力施加在D和B连接的关节上,输出B和A连接关节的角度和速度
双击Rdb,增加外部驱动力,把初始角度改成150度,通过PS-Simulink Conveter连到输入模块,命名T
双击Rda,增加传感器,通过PS-Simulink Conveter连到输出模块,命名q,w
然后把整个模块框选起来,右键创建子系统。成了下面这样子
本文的控制器直接把Matlab官方的控制器拿过来了,设计的还挺巧妙的。我自己直接加的一个PID控制器稳定性不好,可能有什么动力学因素在里面。
这个PD控制器里面还比较复杂,感兴趣的可以点进去看一看,如何设计好控制器就是我们仿真的终极目标了,当然就会是重难点部分,我们的目标是熟悉整个流程,就不对控制器详解了。
Aim Reference是输入信号,控制的是两个量,位置和速度。参考信号是下面这样子的