侵权投诉
当前位置:

OFweek电子工程网

开发工具/算法

正文

移动机器人3D仿真软件的设计与实现

导读: 在研究移动机器人控制算法和多机器人协作控制算法时,常采用仿真软件来提高算法的开发效率并减少实验成本。仿真软件可直接利用物理引擎对刚体对象的运动进行仿真,物理引擎为刚体赋予真实的物理属性,以此对物体的运动、旋转和碰撞进行仿真计算。

  在研究移动机器人控制算法和多机器人协作控制算法时,常采用仿真软件来提高算法的开发效率并减少实验成本。仿真软件可直接利用物理引擎对刚体对象的运动进行仿真,物理引擎为刚体赋予真实的物理属性,以此对物体的运动、旋转和碰撞进行仿真计算。目前主流物理引擎有Havok(Havok Game Dynamics)、PhysX(Physics Engine Middleware)、Bullet(Bullet Physics Engine)和ODE(Open Dynamics Engine)等[1],Havok是业界功能最全面的物理仿真解决方案,主要应用于实时碰撞计算、动力学约束求解和车辆综合解决方案等领域;PhysX的特点是适合计算量比较大的物理模拟计算;Bullet的特点是具有最先进的碰撞检测技术,主要用于柔体动力学和刚体动力学的仿真;ODE的特点是具有高级的关节类型和碰撞检测整合系统,它适合于对机电一体化设备和移动机器人的模拟,并且易于与C/C++ API配合使用,具有快速性、强健性和可移植性等特点[2]。

  在采用物理引擎生成动力学世界之后,需利用图形绘制程序将场景绘制到显示终端[3]。常用的图形绘制函数库有OpenGL(Open Graphics Library)、DirectX(Direct Extension)和Irrlicht(Irrlicht Engine)等,OpenGL主要应用于专业高端绘图领域[4],具有使用简便、效率高和可移植等特点;DirectX是微软开发的三维绘图软件包,性能上已经超过OpenGL,但其接口采用COM方式;Irrlicht为高性能实时3D引擎,它可以提供在商业级3D引擎上才具有的艺术特性。

  综上所述,在不影响软件性能的前提下,为了缩短仿真软件的开发周期,本文采用ODE物理引擎和OpenGL来开发移动机器人三维仿真软件。

 

  1 软件特性

 

  (1)采用基于面向对象技术实现,软件操作简单,易于维护和功能扩展;

  (2)可以导入x格式和3ds格式的三维模型文件;

  (3)允许物体同时实现多个移动操作,在每个运动方向都有加速度、减速度和最大速度等运动属性;实现碰撞检测、移动机器人和虚拟场景的图形化显示;

  (4)支持实时调试功能; 3D动画和仿真计算结果同步且真实对应;绘制仿真环境的二维地图和物体运动轨迹。

  (5)提供与外部软件连接的接口,即可以通过ODBC与外部数据库相连,或通过Socket接口与外部设备相连,实现进程之间的通信;

  (6)软件接口的多样性和扩展性,即可通过游戏手柄、键盘来输入控制信息、模型参数和仿真参数等;仿真数据的保存输出。

  

  其中,速度比例系数k=0.035,线速度单位为m/s,角速度单位为rad/s。

 

  

 

  2.2 三维物体建模

  ODE物理引擎提供球体、盒子、胶囊、平面和圆柱等几何体。在创建出一个几何体后,其中心一般落在仿真环境坐标系的原点上。在对移动机器人进行建模时,需要使用盒子和圆柱两种几何体,盒子需要指定3个参数,即长、高、宽;对于圆柱而言,则需指定长度和半径2个参数。在动力学世界中,以Geom代表物体几何体,以Body代表虚拟场景中的对象。软件可以通过调用ODE内部函数来检测几何体和对象的对应关系,也有函数用于检测对象之间是否存在连接。下面以创建盒子物体为例,说明单个物体的建模方法。

  首先调用dBodyCreate函数创建出给定空间中的刚体对象,再调用dBodySetPosition和dBodySetRotation两个函数,调整该对象在空间中的位姿,接着调用dMassSetBoxTotal和dBodySetMass两个函数设定该对象的质量属性,最后调用dCreateBox函数创建相应尺寸的盒子几何体,并调用dGeomSetBody函数将该几何体与对象关联起来。

  在创建出单个对象后,往往需要利用各种关节将不同对象连接起来。ODE物理引擎提供5种类型的关节,分别为铰链型、球-球窝型、滑竿柱型、固定型和铰链2型等。其中铰链型为合页关节,滑竿柱型为插销关节,铰链2型则是带有轴的关节,这些关节都有内置的马达。本文选用铰链关节来连接驱动轮和机器人车体,采用固定关节构建机器人车体结构。下面以使用铰链关节连接两个对象为例,说明创建关节的方法。

  在调用dJointCreateHinge函数创建铰链关节对象后,再调用dJointAttach函数指定用该关节连接的两个物体对象,然后调用dJointSetHingeAnchor函数设定旋转轴的中心点坐标,并调用dJointSetHingeAxis设定旋转轴的方向。

  为了让刚体对象能够在仿真环境中运动起来,ODE提供了3种方法: (1)调用dBodyAddForce、dBodyAddTorque等函数给刚体施加力的作用; (2)调用dJointSetHingeParam

  函数来改变内置马达的转速,同时需指定该函数的第二个输入参数为dParamVel; (3)调用dBodySetLinearVel和dBodySetAngularVel两个函数直接给物体设定线速度和角速度。

  此外,在ODE仿真环境中,可通过两种方式来模拟弹簧-阻尼系统: (1)通过设置ERP(Error Reduction Parameter)和CFM(Constraint Force Mixing)两个参数来实现,ERP为每一仿真循环中的修正误差,取值范围为0~0.8,默认取值为0.2;CFM代表物理引擎的全局混合约束力,它反映物体表面的柔软程度,其取值范围为10e-9~1;(2)利用动力学方程来求解,即胡克定律:

  

  其中γ为阻尼系数,它与物体的形状以及周围性质有关。

  综上所述,典型ODE仿真过程为[6]:

  (1)生成一个动力学世界,并在该世界中创建物体;

  (2)设置物体状态(如质量、质心位置和姿态等),并在动力学世界中创建关节;

  (3)将关节与物体绑定起来,为所有的关节设置参数;

  (4)生成碰撞检测空间,并为需要作碰撞检测的物体生成碰撞几何体;创建一个容纳关节的关节组;

  (5)循环处理过程:

  ①在物体上施加力;

  ②根据需要调整关节参数;

  ③调用碰撞检测,得到碰撞点和碰撞的物体;

  ④为每个碰撞点的碰撞创建一个接触关节,并将其放入关节组;

  ⑤执行一个仿真步骤;

  ⑥清空接触关节组中的关节;

  (6)销毁动力学世界和碰撞世界。

  2.3 三维图形的绘制

  OpenGL绘制图形的基本操作步骤[4]:

  (1)设置像素格式:设定OpenGL绘制风格、颜色模式和颜色位数等重要信息。

  (2)建立模型:根据基本图元建立景物的三维模型,并对模型进行数学描述。

  (3)舞台布置:把景物放置在三维空间的适当位置,设置视点、视角和投影模型等。

  (4)效果处理:设置物体的材质,加入光照及光照条件。

  (5)光栅化:把景物及其颜色信息转化为可在计算机屏幕上显示的像素信息。

  在绘制图形时,需注意坐标系的变换,否则很容易导致绘制失败。OpenGL定义了两个坐标系:世界坐标系和当前绘图坐标系。世界坐标系是固定不变的,规定以屏幕中心为原点,面对显示终端,向右为x正轴,向上为y正轴,向终端外面为z正轴。当前绘图坐标系是绘制物体时的参考坐标系。仿真软件完成初始化后,世界坐标系与当前绘图坐标系是重合的。在调用glTranslatef、glRotate等变换函数对绘图坐标系进行平移和旋转后,绘图坐标系会在原来的基础上做出相应改变。此时,若调用gluSphere、glVertex3f等绘图函数,绘图函数是在改变之后的绘图坐标系上进行绘制。如若要让绘图坐标系与世界坐标系再次重合,可以调用glLoadIdentity函数。此外,可以调用glColor3f(r,g,b)函数设置绘图函数所使用的颜色,如果没有再次调用该函数,则绘制出的图形颜色将保持原先颜色不变,rgb三个颜色分量的取值范围为0.0~1.0。

 

1  2  下一页>  
声明: 本文由入驻OFweek公众平台的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

我来说两句

(共0条评论,0人参与)

请输入评论

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码: