Vortex动力学建模-魏春雨.docx_第1页
Vortex动力学建模-魏春雨.docx_第2页
Vortex动力学建模-魏春雨.docx_第3页
Vortex动力学建模-魏春雨.docx_第4页
Vortex动力学建模-魏春雨.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 Vortex建模实例分析1.1 ExHinge实例分析这个实例的目的是:建立两个物体,他们之间只有一个相对旋转的自由度。想要达到的效果如下图所示。绿色物体可以绕着黑色轴旋转。红色物体固定。显然,这里的“Hinge”并不是我们通常所说的“铰链”,而是对两个物体相对只有一个转动自由度的统称。上图中,通过控制上下、左右键可以控制绿色运动物体的运动方向、加减速等。下面分析一下VORTEX中是如何编程实现这一建模仿真过程的。一、Vortex是基于C+的,所以头文件包括哪些内容是首先要考虑的内容,例子中要用的基本几何体、part、hinge、运动控制等,因此必须要包含头文件:“#include Vx/VxFrame.h /系统必须存在frame#include Vx/VxBox.h /基本几何体#include Vx/VxCollisionGeometry.h /碰撞检测用#include Vx/VxPart.h /创建零部件时需要#include Vx/VxHinge.h /创建铰链时需要#include Vx/VxUniverse.h /系统必须至少存在一个Universe#include Vx/VxConstraintController.h /控制运动时需要#include Vx/VxVisualizer.h” /用于观察#include /C+标准库文件除了这些必须包含的文件之外,例程中还包含头文件“#include Vx/VxPrecision.h”,不知道其具体作用,将其注释掉后运行程序,没有变化。二、从程序整体上看分为三部分,依次分别为:定义ExHinge类、运动控制、主程序。下面分别进行分析。1.ExHinge类中包含了对其成员函数及数据成员的声明。其成员函数包括构造函数(ExHinge(VxUniverse* in_Universe);)、析构函数(ExHinge())、创建零件函数(void createParts(VxVisualizer* in_visualizer);)、创建约束函数(void createConstraints(););其数据成员分别为VxUniverse、VxPart(2个)、VxHinge。在该类的外部分别对这些成员函数进行了定义。在类的内部对成员函数做声明,而在类体外定义成员函数,这是程序设计的一个良好习惯。创建零部件的成员函数如下图所示:上图中右侧四个大括号是创建零件的四个必要步骤。第一个大括号是创建了一个固定不动的物体,大小为4x1x1,默认为其几何中心在坐标原点。如果要想改变其位置的话可以用setposition()函数改变。创建过程中需要先用addGeometry()函数创建物理模型,然后将零件添加到Universe中去。这里要补充一点的是,Vortex中的物体有物理模型和场景模型两种,前者是用于物理学计算的,后者是显示用的。两者可以重合,也可以不重合。场景模型可以在Vortex中创建,也可以由Creator、3dmax等创建好后加载。第二个大括号是创建静止物体的场景模型。由于场景模型是用于观察的,而且是直接在Vortex中创建的,因此先必须设定颜色。然后创建了场景模型并将其结点与物理模型连接了起来。这部分的最后一条语句是设置了该物体的驱动方式,是动力学驱动还是结点驱动,这里选择的是结点驱动。注意:由于该物理没有设定质量,因此必须指定驱动方式。如果设定了质量,则无需指定驱动方式,强制为动力学驱动。第三、四个大括号创建了运动物体的物理模型、场景模型,过程与固定物体的创建基本相同。这里说一下不同的地方。运动物体不可能再摆放到坐标系原点位置,因此要用setposition()重置。运动物体已经设定了质量,因此驱动方式不需要指定。再看创建约束的成员函数。首先用语句“VxVector3 axis(1, 0, 0); VxReal3 pos; mMovingPart-getPosition(pos);”指定了铰链的位置和旋转的方向。下面的语句用处很大:用于改变物体方位的,第一句、第四句分别为定义和调用变换矩阵,二、三句分别为旋转和平移。本例中不再需要进行变换,因此旋转参数为0,平移位置设置和初始值相同。如果将这段程序注释掉后运行,发现不影响结果,就是这个原因。然后用语句mHinge = new VxHinge(mFixedPart, mMovingPart, pos, axis.v)创建了铰链约束。并指定了铰链的两个物体碰撞交互失效。这个是必需的。最后将铰链约束添加到Universe中。2.对铰链约束的运动控制。这部分比较难理解,只是大概了解了它的主要作用。但是这部分相当重要,经过仔细探索,也有了一些理解和感悟:控制必须有一些逻辑在里面,不是任何情况下都能实现控制的,在这个例程中,它的思想我是这样理解的:首先定义了一个控制器,界定了什么时候控制起作用,比如,如果你下面的LockVelocityController和MotorController中的最大扭矩或者最大速度最小速度都为0的话,则不符合事实,此时控制器失效。只有当有效时,铰链坐标系才设置为“可驱动”,并通过实时更新速度的虚函数进行显示。然后在LockVelocityController和MotorController函数中分别定义了上下键、左右键的速度控制,包括加、减速。它们都分别定义了最大、最小速度,以及最大扭矩。注意,因为是两个函数进行控制的。可以将上下键和左右键产生的最大、最小速度和最大扭矩设置成不同的值。仔细想想,这时的铰链实际上就是一个发动机,同时设置了速度和产生的扭矩,两者没有关联。3.主函数里面主要包括以下主要内容:1)用visualizer初始化图形界面,创建可视窗口;2)初始化Vortex并设置仿真步长3)创建一个ExHinge的实例4)调用约束的运动控制5)用do-while循环实现连续运行与更新6)程序停止后,释放内存销毁实例1.2 ExHinge实例的引申:数据输出对于7.1节阐述的铰链实例,我们已经很清楚它的运动规律了:可运动物体在上下左右键的控制下可以向前或向后加、减速运动。以上下键为例,每按一次上键速度增加PI/2,每按一次下键速度减少PI/2,直至静止、负向增加。左右键功能与此相同。这一点我们从程序中也可以很清楚的看懂。下面我们通过数据输出显示,来验证运动的过程,也可以说是相互印证,因为运动情况我们已经基本分析出来了。原实例中有一个缺陷,那就是控制者无法知道运动物体的实时转速和转角。屏幕上没有显示。我初步探索了一下,实现了这一功能。实现的方法肯定有很多,大家可以相互交流。数据输出显示可以是前台显示也可以后台显示,我这里先给出后台显示的方法,然后实现前台、后台同时显示。后台显示如下图7.2.1所示。图7.2.1 数据后台显示目前该截图的状态为:绿色运动物体已经转动了64.61209弧度,运动速度为PI r/s。按了两下上键。具体实现过程分析:转动的物体它自身的坐标系也在旋转,因此获得当前坐标系的位置,它是相对于前一时刻的变化,也就是转角;速度可以通过相应的函数实现:getCoordinateCurrentPosition();/获得转角getCoordinateVelocity();/获得转速我是在main()函数中直接调用的。如下图图7.2.2所示。图7.2.2 后台数据显示采用的代码后台显示由于与运动可视化屏幕不在同一个界面上,因此前台显示具有更方便、直观的优点。如下图7.2.3所示。图7.2.3 前台数据显示这两者之间显示是否会有差异,如下图7.2.4所示。从截图可以看出角速度完全一致,角度略微有点不同,原因是截图过程中造成的。不必考虑其差异,两者都是正确的。图7.2.4 两者比较探索中发现的两个有用的快捷键:Shift+J:显示铰链转角;Shift+M:显示运动物体的坐标系。对于数据输出的方法(采用的函数),可以参考李培新的文档。他用的是另外的函数,非常简便。大家可以对比不同方法的程序特点及优缺点。下一步的工作展望:1:提取车辆模型底盘(chasis)的质心三个方向的平动坐标值;2:提取车辆模型底盘(chasis)的连体坐标系俯仰、侧倾、偏航三个角度值;3:构建履带模型,以改变原有模型“无视履带存在”的严重缺陷。7.3 简单汽车创建实例针对实例中“ExCarWheel”模型,来分析一下一个最简单的小汽车的创建过程。首先介绍例子中用到的单位转换函数,这个是用户自定义的。由于现实中一般说车辆的速度多大单位都是km/h,但是由于Vortex中采用的是国际单位,即m/s,因此在整个程序的最开始定义了两个相互转换的函数:在程序的开头部分,定义了一些全局常量,这些参数始终不变。这样做的目的是后续的程序计算中只需要出现变量名即可,因为它已经有具体数值了。 “见名知其意”是主要目的。最简单的小车模型应该由长方体车体、圆柱体车轮组成,参数则应该有长、宽、高、车轮半径等,另外作为汽车的参数还应该有车体重量、车轮重量、控制时的最大转角、最大转角增量、最大速度、速度增量、发动机功率、悬架相关参数等都在前面作为全局常量进行赋值。整个程序只有三个部分:7.3.1车辆的创建以及参数设置定义材料:设置接触属性:设置默认材料接触面的摩擦力类型、模式、摩擦系数:上图中的setFrictionType()参数有三种,kFrictionTypeNone:没有摩擦;kFrictionTypeOneDirection:只沿着主方向切线方向有摩擦;kFrictionTypeTwoDirection:沿着整个平面的各个方向都存在摩擦。本例中显然应该是第三种。setFrictonModel()参数有两种,Box friction和Scaled Box Friction,前者的特点是它忽略了库伦摩擦力的一个方面阻止穿透的最大切向约束力和法向约束力的关系上,也就是说主、次两个方向的摩擦力互相独立,体现出各向异性;后者与此类似,但是对于形状比较复杂的物体,往往会更精确一些,但是计算速度也会相对慢一些。本例中采用的是Scaled Box Friction模式。setFrictionCoefficientPrimary()和setFrictionCoefficientSecondary()用来设置主次两个方向的摩擦系数。设置默认材料和车轮材料的接触面擦力类型、模式、摩擦系数:下面是创建地面,如果地面是从其他文件导入,比如是create创建的.flt文件,则不需要下面的创建程序,直接调入,然后使其可碰撞化。这部分在唐仿的文档里有详细阐述。 下面是创建底盘,本例中底盘就是一个长方体,物理模型和场景模型都是一样的。到现在程序的这个地方,模型的情况应该是:( 蓝色为x轴,绿色为y轴,红色为z轴)接下来定义车轮的位置及创建轮子。对照长方体在坐标系中的位置图,可以很清楚的看出四个车轮的位置坐标代表的是哪个车轮。创建车轮:首先定义了一个VxCylinder的实体以及颜色。然后通过for循环创建车轮、旋转、重置位置:这里面需要说明的是,创建圆柱体时默认其轴向为z 向,因此必须通过旋转矩阵进行旋转,那么应该绕哪个轴转呢?应该根据初始默认坐标系来进行确定。初建圆柱体时是: X轴 Y轴 Z轴要想让轮子立起来,显然应该绕Y轴旋转90度,因此程序中旋转参数为(0,VX_PI/2,0).上图程序中后面两句是将车轮添加到universe中,并使车轮与底盘碰撞失效。接下来建立约束副:这里需要指定的轴为两个,第一个是车轮自身旋转所绕的轴,第二个是车体转弯时所绕的轴。上面这段代码用来设置CarWheel约束副的相关参数。7.3.2车辆的控制这部分主要用来控制汽车的转弯、加减速等。该部分是通过一个KeySubscriber类(派生于Vortex中的VxEventSubscriber类)来实现的。类中只有一个无返回值的虚函数notifyEvent(int command, VxReal value),所有功能都在这个函数中实现。上面这些代码主要实现前轮转弯。首先获得两个前轮的约束,再获得约束的当前位置,这个值就是当前前轮所处的角度。如果按了左键,则当前角度自减一个步长值,如果按右键,则自增一个步长值。当角度值小于最小值时,则保持最小值恒定,不再变化;当角度值大于最大值时,则保持最大值恒定,不再变化。最后设定角度值,以使生效。再来看后轮驱动部分。这部分程序的思路和方法与前轮转向基本相同,只不过是获得速度用getmotordesiredvelocity(),获得后设置用setMotorParameters()。通过分析,发现原程序有一个很繁琐的地方,就是i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论