我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>行业知识

通过数据库机构运动参数的管理与处理

文章来源:第三维度 作者: 发布时间:2012年03月24日 点击数: 字号:

    来源:第三维度
    作者:韩锐(硕士学位论文)

   《 基于SolidWorks的机构运动仿真研究》第四章

    4 机构运动参数的管理与处理

    由机构运动规律得出的位置参数还需要进一步进行处理才能得到机构运动参数(包括位置参数、速度参数、加速度参数),通过Matlab C++函数库与VC++联合编程的方法,可对位置参数进行求解。求解后的运动参数都以数组的形式存在于内存之中,但内存中的数组无法在程序结束运行后保存下来,因此如果不对运动参数进行管理,用户就无法对机构进行进一步的分析。通过一定的数据库操作将数据保存在数据库中,可使程序与数据相对独立,减少模块间的依赖。本章将对机构运动参数数据存储和管理方式、VC++6.0 数据库开发技术、数据库结构、数据的提取、处理和存储等问题进行讨论。

    4.1 数据库的选择及数据库开发技术

    由于 SolidWorks 的数据库管理能力较弱,所以不得不借助其他数据库管理系统,目前市场上提供的桌面数据库主要有两类:

    (1) 仅提供存储和简单数据操作的数据库,代表产品有Access、dBASE、FoxPro 等。

    (2) 较完备的大型数据库管理系统,代表产品有Oracle、SQL Sever 等。

    用大型数据库管理系统来开发专用的数据库应用系统是适宜的,若用来开发CAD 系统往往存在很多问题,因为要编写专用的接口程序来解决数据库与CAD 系统的集成问题,这种接口程序通用性差。为了克服上述缺陷,许多高级语言都在其内部嵌入了数据库功能,由于是在单一的开发环境下来开发应用程序及数据库系统,故可以保证各个部分的无缝集成,从而大大提高了开发运行效率及系统的稳定性【13】【14】。

    本课题采用Access 数据库对机构运动的位置参数、经过处理后的速度、加速度参数统一进行存储和管理,Access 是一个小巧的数据库管理系统,完全满足本课题对数据库的要求。因此选用Access 作为数据库管理的工具,使用VC++对数据库进行操作。

    VC++提供了多种访问数据库的技术【22 】【40 】,主要有ODBC(OpenDate-Base Connectivity) 、MFC ODBC(Microsoft Foundation ClassesODBC)、OLE DB(Object Link&Embedding DataBase)、ADO(ActiveX DataObject)、DAO(Date Access Object)等,其中DAO(数据访问对象),原来是微软为Visual Basic 和Access Basic 设计的一种简单的数据访问方法,用于操纵Access 数据。后来有了OLE Automation 技术,它就可以用于C++编程了。数据库应用程序如果只需与Access 数据库接口时,使用DAO编程较方便。MFC DAO 是微软用于访问Microsoft Jet 数据库文件(*.mdb)的数据库开发工具,仅用来支持Access 数据库,应用范围相对固定。 几种数据库接口的关系如图4-1 所示。

图4-1 数据库接口关系
图4-1 数据库接口关系

    本课题中的数据库主要用于CAD 仿真数据的存储和调用,只用到一些基本的数据库操作,数据库技术并不是本课题研究的重点,因此,易用性和可靠性是首要的考虑因素,DAO 本身技术并不是最先进的,但是其可靠性和易用性已经被时间证明。最终,本文选用了DAO 来对 Access数据库进行操作。

    4.2 数据库的设计与实现

    4.2.1 数据库的结构

    本课题的运动仿真系统中,所有运动零件的运动学参数都保存在一个Access 数据库中,该数据库的命名为Mydb.mdb,保存在指定目录下,数据库中包含有一些不同的表,每张表对应一个运动零件。该数据库的结构如图4-2 所示:

通过数据库机构运动参数的管理与处理
图4-2 数据库结构图

    每当用户进行了运动仿真,系统就在数据库中为每一个运动零件保存一张表,如图4-3 所示。

通过数据库机构运动参数的管理与处理
图4-3 数据库

     表中保存着对应零件的运动学参数,这张表在运动仿真结束后会保留下来,供用户调用数据。直到下次用户进行运动仿真时用到了相同的零件,系统才会删除原表。本文中槽轮、销轮、曲柄、凸轮等运动零件都对应有唯一的表,通常在运动仿真时根据机构情况删除原表后创建一张空表,表的结构基本相同,下面以凸轮为例说明表的字段信息。如表4-1 所示:

表4-1 表的字段定义
通过数据库机构运动参数的管理与处理

    空表建好后,根据情况向空表中写入计算得到的运动参数。系统会自动对数据库进行保存,用户可以在运动仿真结束后在Access 环境下打开由运动仿真程序生成、保存的数据库,并选择打开不同的表查看各个零件的运动学数据,打开后的凸轮表如图4-4 所示

通过数据库机构运动参数的管理与处理

    4.2.2 数据的流动与存储

    本数据库中所有数据表的数据都不是一次全部写入的,通常情况下,由机构运动分析得出的机构位置参数会在建立新表时加入数据库,这些数据包括:序号、转角以及在三个坐标轴上的位置,存入的位置参数有两个用途,一方面用于设置零件的位姿,使屏幕上的机构连续运动起来,实现运动仿真;另一方面,系统要调用运动参数处理模块对机构的位置数据,从而得到速度(角速度),加速度(角加速度)等运动学参数。

    在数据库表的内部,数据的流动情况如图4-5 所示:

通过数据库机构运动参数的管理与处理

    以凸轮为例,位置分析得出的位置数据首先存入数据库,凸轮由于转轴固定,所以只对转角参数进行处理,从数据表中提取凸轮的转角参数,在数据处理模块中求导后返回角速度参数,再次从数据表中提取凸轮的角速度参数,在数据处理模块中求导后返回角加速度参数,经过数据库操作,保存在表的字段a 中。经过以上过程,一张凸轮数据库表才能彻底完成。

    4.2.3 数据库的实现

    要在 VC++中使用DAO 操作Access 数据库,必须在VC++工程中添加必要的头文件才能使用DAO 的对象和方法。本课题的应用中,在stdafx.h 文件中添加以下代码。

    #include <afxcmn.h>
    #include <afxcoll.h>
    #include <afxdb.h>
    #include <afxdao.h>

    为了便于在VC++工程中实现数据库操作,本文创建了datebases 类。绝大部分的数据库操作函数都在datebases 类中实现,其中其中主要的函数包括:打开数据库,数据表的创建,添加数据记录,提取数据表的数据,关闭数据库等。

    (1) 打开数据库

    void datebases::dbOpen()
    { try{ m_db.Open("C:\\sw\\db\\MYDB.MDB"); } //打开数据库
    catch(CDaoException* e)
    { DisplayDaoException(e);
    e->Delete();
    return;
    }
    }

    (2) 创建数据表

    void datebases::CreateTable(CDaoDatabase &m_db,CString tbname)
    { CString str=tbname;
    if (m_db.IsOpen())
    { CDaoTableDef m_NewTable(&m_db);
    m_NewTable.Create(str); //创建数据表
    ...
    m_NewTable.CreateField("ID",dbLong,1); //添加ID 字段
    ....

    }
    }

    (3) 添加数据记录

    void datebases::addnbcam(CDaoRecordset &rs)
    { for (int i=0;i<=720;i++)
    { rs.AddNew();
    COleVariant tempFieldValue;
    long IdNo=i;
    rs.SetFieldValue(_T("ID"),IdNo); //写入Value 值
    ...
    }
    rs.Update(); //数据更新
    ...
    }
    (4) 关闭数据库
    void datebases::dbClose(CDaoDatabase &m_db)
    { if (m_db.IsOpen())
    m_db.Close(); //关闭数据库
    }
    (5) 提取数据表的数据
    void datebases::dbToArray(CDaoRecordset &rs)
    { COleVariant tempFieldValue;
    rs.MoveFirst();
    while(!rs.IsEOF())
    {tempFieldValue=rs.GetFieldValue("VALUE");//数据提取
    tempArray [i]=V_R8( &tempFieldValue ); //转换后保存
    ...
    }
    rs.MoveNext();
    }
   
    4.3 模块化的运动参数处理方案

    4.3.1 Matlab/VC++联合编程

    在应用软件的开发过程中,经常要涉及到很多方面的技术环节,如界面的开发,数据的输入、存储、查询,数据的调用和处理,结果的可视化等。要提高程序的开发效率,将程序模块化是行之有效的方法,不同的环节使用各自的模块,可以降低程序开发的难度,提高程序的易读性。

    本文中涉及大量的数值计算,如果采用VC++进行编程会耗费大量的时间和精力,因此,将参数处理部分模块化是必然的选择。

    参数处理部分的核心和关键是数据的处理算法,这方面正是Matlab【31】的专长,尤其是Matlab 工具箱中提供各种完善的数据分析手段,特别适合大量的数据处理和复杂的数值计算。Matlab 本身也是一个开放的系统,具有多种接口功能,易于实现与VC++的集成。

    Matlab 是Mathworks 公司80 年代中期推出的面向科学与工程计算的高级语言。它在处理矩阵运算,数学分析和数值变换等方面有着明显的优势;VC++可以方便的生成应用软件的各种界面,其良好的底层开放性易于同其他软件建立接口,从而将各个模块无缝的连接起来。Matlab 的应用程序界面开发功能远不如VC++强大,VC++在工程计算方面则要比Matlab 繁琐得多。因此,在VC++的基础上,使用Matlab 开发参数处理模块,能够集合Matlab 语言和VC++语言各自的专长,更快捷、更完美的解决工程数据计算中的问题。

    4.3.2 联合编程的实现途径

    Matlab/VC++联合编程【28】~【30】主要有三种实现的方法:(1)使用MatlabAPI 进行连接;(2)通过编译转换工具将M 文件转换为CP P 文件在VC++中调用;(3)使用Matlab 提供的C/C++数学库 (Math Library)直接调用Matlab 函数。下面分别介绍这三种方法。

    Matlab 应用程序接口(API)主要由三部分组成,它们分别是:

    (1)MEX文件,它是Matlab 系统在其运行环境种调用外部程序的接口,必须在Matlab 的工作环境内部,通过Matlab 调用才能运行;

    (2)MAT 文件应用程序,它是Matlab 与外部程序进行输入输出交换的接口,可以脱离Matlab环境独立运行,但功能十分有限,只能用于程序间的数据交换;

    (3)Matlab计算引擎函数库,它是外部程序调用Matlab 数学运算工具函数进行有关数学运算的接口,也可以脱离Matlab 环境独立运行,但运行应用程序的计算机必须安装Matlab,应用程序执行时,在后台启动一个Matlab 进程,Matlab 是被作为一个计算引擎来使用的。Matlab引擎的接口结构框图如图4-6 所示。

通过数据库机构运动参数的管理与处理
图4-6 Matlab 引擎的接口结构框图

    以上三种接口中,接口(1)、(2)不支持图形处理,接口(3)支持图形处理功能。本文使用了Matlab 引擎显示运动曲线。

    Matlab 的C/C++数学库 (Math Library)是由Matlab 提供的基于C/C++语言的数学函数库,C/C++程序通过C/C++数学库直接调用Matlab 函数,其中包含大约400 个能够Matlab 数学函数,可以在未安装Matlab 的系统上运行。本课题采用直接调用Matlab C/C++数学库的方法,通过在VC++中调用生成的动态链接库,实现了Matlab 与VC++的联合编程。

    4.3.3 Matlab C/C++数学库的接口

    Matlab C/C++数学库提供的编程接口,能完全脱离Matlab 环境,其接口调用方法与Matlab 语言环境中的调用习惯十分相似。

    在Matlab C/C++数学库中,定义了大量的类和函数,其中最重要的和最基础的类就是mwArray 类,通过定义mwArray 类来封装多(0~32)维数据结构,使mwArray 类支持绝大部分Matlab 运算符的操作和Matlab基本数学函数的操作。

    mwArray 类为以上所有函数和运算符提供了统一的接口,通过这个接口,外部的数学函数和运算符可以方便的对mwArray 类的对象进行数学计算。这种方法使mwArray 类的实现变得相当简单,同时mwArray 类的这种实现方法,可以避免由于Matlab 函数的多种形式的调用和多输出而造成的混淆和冲突。

    4.4 运动参数处理模块的开发和使用

    4.4.1 运动参数处理模块的构成

    运动参数处理模块主要是根据已知的构件位置参数求解构件的速度参数和加速度参数(或角速度参数和角加速度参数)。根据不同的机构特点,求解的算法也要进行必要的调整。不同的算法程序构成了运动参数处理模块的核心,一种算法就是一个动态链接库(Dynamic-Link Library),应用程序根据不同的机构,调用不同的动态链接库,实现运动参数的处理。本课题用到的动态链接库由VC++通过Matlab C/C++数学库的接口生成。下面以本文设计的多项式求导法为例创建动态链接库,程序流程图如图4-7 所示

通过数据库机构运动参数的管理与处理
图4-7 多项式求导法计算过程

    4.4.2 动态链接库的(DLL)的创建【35】

    按照上述方法,开发数据处理模块的动态链接库,必须具备以下目录和文件(本文中Matlab 的安装路径为C:\MATLAB6p1,下同):

    C:\MATLAB6p1\extern

    C:\MATLAB6p1\extern\include\*.h

    C:\MATLAB6p1\extern\include\cpp\*.hpp

    C:\MATLAB6p1\extern\lib\win32\*.lib

    C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60\*.lib

    下面以创建多项式求导法的动态链接库为例,说明开发的具体步骤:

    a.创建动态链接库

    进入 VC++6.0 环境,打开File 菜单的New 菜单项,弹出New对话框,选中MFC AppWizard(dll),并命名为polyfitderval,在随后的第二页选择第二项:普通动态链接库使用共享MFC DLL(Regular Dll using shared MFC DLL),然后单击Finish。

    b.设置VC++6.0 环境

    在 Tools->Option->Directories->Include files 中添加:

    C:\MATLAB6p1\extern\include
    C:\MATLAB6p1\extern\include\cpp
   
    在Tools->Option->Directories->Library files 中添加:

    C:\MATLAB6p1\extern\lib
    C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60

    在 Project->Add to Project->Files 中添加:

    C:\MATLAB6p1\extern\lib\win32\microsoft\msvc60\*.lib
    C:\MATLAB6p1\extern\lib\win32\libmatpm.lib

    在Project->Setting->C/C++页中的Category->Preprocessor 中加入

    MSVC、MSWIND

    在Project->Setting->C/C++页中的Category->CodeGeneration 中选

    择Multithread DLL

    c.头文件的设置

    在 polyfitderval.h 的头文件声明后加入如下语句:

    extern "C" _declspec(dllexport) double *mypolyfitderval(double
    polyx[],double polyy[],int polyn,int polyinge);
   
    其中 polyx 为时间数组、polyy 为位置数组,polyn 为多项式拟合的次数,polyinge 为数组的大小。

    在 polyfitderval.cpp 的头文件声明中加入如下语句:

    #include "math.h"
    #include "matlab.h"
    #include "matlab.hpp"

    d.加入算法程序

    在 polyfitderval.cpp 的头文件声明后加入如下语句:

    extern "C" _declspec(dllexport) double *mypolyfitderval(double
    polyx[],double polyy[],int polyn,int polyinge)
    {
    mwArray polya(1,polyinge,polyx);
    mwArray polyb(1,polyinge,polyy);
    mwArray polyc;
    mwArray polyd;
    mwArray polye;
    polyc=polyfit(polya,polyb,polyn);//相当于polyc=polyfit(x,y,n);
    polyd=polyder(polyc); //相当于polyd=polyder(polyc);
    polye=polyval(polyd,polya); //相当于v=polyval(polyd,x);
    double*presult;
    presult=mxGetPr(polye.GetData());
    return presult;
    }
   
    e.编译和生成

    选择编译(Compile)菜单下的生成(Build) polyfitderval.dll,编译后生成了数据处理模块文件polyfitderval.dll 和polyfitderval.lib。将这两个文件拷贝到应用程序工程目录下,就可以在应用程序中调用该动态链接库进行数据处理了。

    4.4.3 动态链接库的调用

    应用程序使用动态链接库(DLL)时,如图4-8 所示,有两种链接方法: 隐式链接和显式链接。隐式链接在运行时由操作系统为用户使用动态链接库提供管理;显式链接由应用程序控制动态链接库的加载(Load)或卸载(Free) 。

通过数据库机构运动参数的管理与处理
图4-8 动态链接库调用方法

    隐式链接的动态链接库必须与同名的动态链接库导入库(*.LIB)一同使用,系统在应用程序运行时将从链接器提供的信息中得到DLL 的位置和加载方法,将其映射到进程的地址空间,程序可以任意使用DLL 中的函数而不必关心函数是如何加载和调用的,DLL 一旦载入就一直在进程中,直到进程结束。这种方法的特点是操作简便,函数调用方便,但占用系统资源较多。

    在使用隐式链接时,在VC++6.0 中选中工程(Projects)菜单的设置(Settings)项,在工程设置(Project Setting)对话框的链接(Link)页中的对象/库模块(Object/Library Modules) 编辑框中增加导入库的文件名( 如polyfitderval.dll),在程序中将动态链接库提供的头文件(如Polyfitderval.h)加入到应用程序中,理论上就可以调用动态链接库中的函数了。

    但是,由于本课题的特殊性,隐式链接这种方法并不可行,按照以上标准方法,经过多次尝试,应用程序还是无法调用DLL 中的数据处理函数。经过分析,认为可能是由于本课题中的应用程序本身就是一个动态链接库,用一个动态链接库调用另一个动态链接库虽然在理论上可行,但是由于版本、设置以及其他方面的不同,实践方面还是存在一定问题。

    所以只能采取另一种链接方法─显式链接。显式链接可以让用户自行设置所需DLL 的链接方式,用户需要使用DLL 中的函数时,在程序中控制加载DLL,函数使用后,可以在程序中控制卸载DLL,这样,就实现了动态链接库的动态使用。与隐式链接相比,显式链接具有更好的灵活性,占用系统资源较少,不过比隐式链接使用上麻烦一些。动态加载动态链接库时,首先通过LoadLibrary()函数或MFC 的全局函数AfxLoadLibrary()将DLL 模块映射到内存空间,AfxLoadLibrary()函数的原型为:
    
    HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName)

    如果DLL 成功加载就可以使用GetProcAddress() 函数通过LoadLibrary()函数或AfxLoadLibrary()函数返回的模块句柄得到DLL 中函数的地址,函数成功后返回指向函数的指针;函数使用后,要使用FreeLibrary()函数或AfxFreeLibrary()函数DLL,AfxFreeLibrary()函数的原型为:

    BOOL AFXAPI AfxFreeLibrary(LPCTSTR hInstLib)

    如果成功则返回TURE。本文用显式链接的方法实现了动态链接库的函数调用,具体操作时,数据处理函数需要4 个参数,分别是代表时间参数的double 型数组xvalue,代表位置参数的double 型数组yvalue,代表多项式拟合次数的int 型参数polyn,还有代表数组中数据个数的int型参数polyinge,其中polyinge 的数值必须与xvalue﹑yvalue 中数据的个数相同,否则系统会出错。调用动态链接库的代码如下:

    HINSTANCE matlabDLL=NULL;
    matlabDLL = LoadLibrary("Polyfitderval.dll"); //加载DLL
    typedef double *(CALLBACK* mypolyfitderval)(double polyx[],double polyy[],int polyn,int polyinge);
    mypolyfitderval matlabOpen;
    matlabOpen=(mypolyfitderval)GetProcAddress(matlabDLL,"mypolyfitderval");
    COleVariant tempFieldValue;
    double v[n];
    double xvalue[n], yvalue[n];
    ....... //对xvalue﹑yvalue 赋值
    double *retvaluev=NULL;
    retvaluev=(*matlabOpen)(xvalue,yvalue,15,721); //函数调用
    for(int nn=0;nn<=(n-1);nn++)
    v[nn]=*(retvaluev+nn); //数据转存
    FreeLibrary(matlabDLL); //释放DLL

    以上就是动态链接库的调用方法和过程,对于不同的算法,都可参照上述方法进行调用,调用时要特别注意被调函数的参数个数和类型。

    4.5 运动参数处理的算法

    4.5.1 多项式求导法

    多项式求导法的主要根据运动位置参数生成拟合多项式,再对该多项式求导,然后求解对应各点的导数值,得到速度参数。再次使用该方法(即再次调用动态链接库)对速度参数求导,得到加速度参数。多项式求导算法占用资源少,程序相对简单,适用于运动较平稳的机构。但是算法本身的局限性导致了计算一阶导数时边界出现误差,这种误差在计算二阶导数时导致了边界出现更大的误差。所以在程序设计的后期,这种算法逐渐被复杂差分算法替代。

    4.5.2 复杂差分算法

    对运动参数进行处理的核心是由已知数据计算数值微分,由于微分定义为:

通过数据库机构运动参数的管理与处理

    则 y = f (x)的微分可近似为:

通过数据库机构运动参数的管理与处理

    它是y的有限差分除以x的有限差分。在Matlab 中diff ( y)./ diff ( x)计算数组元素之间的差分,就可以近似求得函数的微分,同时,由于是计算数组元素间的微分,故所得到的输出数组比原始数据数组少了一个元素。这样,必须舍弃x 数组的一个元素,当舍弃x 的第一个元素时,diff ( y)./ diff ( x)给出向后差分近似;而舍弃x的最后一个元素,则给出向前差分近似。

    在本课题中,这种差分算法存在两个缺点:其一,每进行一次微分,数组减少一个元素,如果要计算加速度,则数组减少两个元素,这样就破坏了数据的统一性,每次调用动态链接库都要特别关注数组的大小,同时也增加了数据库操作的难度,造成了数据管理的混乱。

    其二,无论是向前微分近似还是向后微分近似,计算曲线与理论曲线总是存在相位差,如图4-9 所示。逐步减小程序的步长可以使两条曲线逐步接近,但两条曲线通常不会重合,特别是理论计算应为零的点,实际计算曲线一般都不为零,即存在零点误差。

通过数据库机构运动参数的管理与处理
(a)。向前插分近似              (b).向后插分近似
图4-9 简单差分计算的误差

    要用差分算法处理运动参数,直接使用向前差分或向后差分算法显然是不行的,本课题中,我们通过改进差分算法来避免出现以上提到的缺点,这种改进的算法在这里称为“复杂差分算法”。算法核心部分的Matlab程序如下:
    ......
    vt1=diff(y1)./diff(x);
    vt101=diff(y101)./diff(x);
    vs1=interp1(x2,vt1,x,'spline');
    vs2=interp1(x102,vt101,x,'spline');
    v=(vs1+vs2)/2;

    复杂差分算法的流程如图4-10 所示:

通过数据库机构运动参数的管理与处理

     仔细观察向前差分和向后差分的相位差,发现其向前的偏差和向后的偏差几乎相同,这就为我们提供了一条思路:采用前后相位差相互抵消的方法消除计误差。为了解决计算曲线存在相位误差的问题,本文尝试采用了前后差分相加,得到新矩阵后再除以2 的方法,取得了很好的效果,特别是在零点问题的解决上得到了比较满意的结果。改进后的算法基本上消除了零点误差,其他部分的数据误差也相对较小。

    为了解决差分后数组元素减少的问题,本文采用了在差分以后用一维插值中的三次样条插值来补充数组元素的方法,这种插值方法在一维插值中精度最高,平滑性最好,补充后的矩阵与原始数组元素个数相同,便于再次应用复杂差分算法计算高阶导数。

    上面已经给出了复杂差分算法的核心Matlab 程序,但以上程序还不能直接移植到动态链接库的程序中,Matlab 程序中出现了“./”符号,VC++的编译器无法识别这样Matlab 特有的符号,而且VC++也无法处理矩阵与数字的除法运算,所以,必须使用C++数学库中定义的相应的函数来实现以上给出的Matlab 程序,为此,需要将上面的程序转化为以下形式:

    ......
    r1=diff(y);
    r2=diff(y1);
    r3= plus(r1,r2);
    r4=diff(x);

    r5= plus(r4,r4);
    r6=rdivide(r3,r5);

    将复杂差分算法编译成为动态链接库,在应用程序中调用其处理机构的运动参数,得到了比较满意的结果。

    4.5.3 槽轮机构处理算法

    槽轮机构有具有圆柱销的主动销轮和具有直槽的从动槽轮构成,主动销轮做等速连续运动,当圆销未进入径向槽时,槽轮因其内凹的锁止弧被外凸的锁止弧锁住而静止;当圆销开始进入径向槽时,槽轮在圆销的驱动下转动,如图4-11 所示:

图4-11 槽轮机构的运动
图4-11 槽轮机构的运动

    槽轮机构的运动和动力特性,通常用通过数据库机构运动参数的管理与处理来衡量, 其中ω1,ω2 分别代表销轮和槽轮的角速度,  ε2 代表槽轮的角加速度。很显然,分析槽轮的运动特性和动力特性所采用的评价方法与一般机构并不相同,为此,需要在复杂差分算法的基础上进一步改进算法。以满足槽轮机构分析的需要。这里,我们称改进后的算法为“槽轮机构处理算法”。

    槽轮机构处理算法的思路是:用复杂差分算法计算出ω2 、ε2 ,用多项式求导法计算出ω1 ,最后计算通过数据库机构运动参数的管理与处理并输出结果。这样处理可以发挥两种算法各自的特点,由复杂差分算法来计算运动变化剧烈的槽轮,精度高但运算量大;由多项式求导法来计算运动平缓的销轮角速度,由于只需计算一阶导数,计算精度较高且计算量小。槽轮处理算法使用了已有的算法,编程时只需加以应用,由于前面已经详细介绍了用到的两种算法,这里就不再赘述。本算法取得了比较满意的计算结果,以销轮等速转动的槽轮机构为例,销轮在2π 时槽轮出现max ω =2.4117774466611,与理论计算相比,误差约为0.1%,槽轮的max ε =5.37971197849765,误差约为0.56 %,比较符合实际情况。用槽轮处理算法计算的槽轮机构的运动曲线如图4-12 所示:

通过数据库机构运动参数的管理与处理
                                拨盘转角(rad)
图4-12 槽轮机构的运动曲线

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料