虚拟 机器人 系统 仿真 初步 第五章 碰撞检测
5.1 碰撞检测算法
碰撞检测是机器人运动仿真系统中的重要组成部分,快速有效的碰撞检测功能将是仿真系统成功的要害。本章介绍了几种碰撞算法,试图阐明适合我们机械手的碰撞检测算法。由于计算量太大的问题还没解决好,全局碰撞的检测问题至今还没有快速高效的算法,而碰撞检测需要实时反馈及效率高的规避算法。下面来看看这些方法。
5.1.1实体包围盒法
三维模型有三种建模形式:(1)结构立体几何表示;(2)扫描变换表示;(3)边界表示。其中,便于形体在计算机内表示、运算、修改和显示的构型方法是边界表示;而立体几何表示所覆盖的形体种类较多扫描变换表示则便于生成轴对称的形体。机器人系统的几何构型多采用三种形式的组合。
边界表示和结构立体几何表示可以采用实体包围盒法进行碰撞检测,大体思路是:将实体的边界用一个长方体或球体盒子包围,其中有一些过包围,这样会增加计算量,使得在不很好的算法下,得不到好的实时性。
5.1.2 静态干涉和动态干涉结合法(单步检测法)
静态干涉是3D物体在静止时的碰撞问题,是动态干涉的基础。我们对同构机器手的干涉分为在轨迹点的碰撞(静态干涉)、运动在轨迹点之间的碰撞和一个机械手停在某轨迹点而另一个在运动的碰撞检测(动态碰撞检测)。
我们先将碰撞问题简化成:给定N个物体s1,s2,…,sn,它们在空间中的位置是由定义在时间域[t0,t1]上的函数f1,f2,…,fn来确定的,判定在这个时间域内相同时刻是否存在任何一对物体占有公共空间 [26]。动态碰撞检测就是沿特定轨迹移动的物体间的干涉检测,动态碰撞检测有两种方式:一类基于在给定轨迹上反复利用静态干涉检测,被称为单步检测的方法,即将物体运动过程中的轨迹分成很多的时间步,在每一个时间步都进行静态干涉检测。另一类技术是基于产生称之为“扫描实体”的物体。这些物体代表了物体在给定轨迹上移动过程中所占有的体积空间。这些扫描体的产生是运动学和实体模型的结合。具体的实现方法有4种:四维CSG方法、四维二叉树方法、扫描方法、边界表示法。虽然扫描体可用于许多有趣的工程问题,但现在的计算机图形硬件条件下,单步检测方法更适合于实时计算机图形显示,所以我们的碰撞检测算法采用了单步检测法。碰撞检测系统的输入模型通常是构成几何对象的基本几何元素的集合,其任务是确定在某一时刻两个模型是否发生干涉,即它们的交集是否不为空。最原始最简单的碰撞检测算法就是对两个输入模型中的所有基本几何元素进行两两相交测试。为提高碰撞检测的精度,首先要提高模型的精度,即要增加模型的复杂度,但通常碰撞检测算法的时间复杂度与问题规模N呈n2 级关系,而在我们的仿真系统中需要实时、精确的仿真。因此研究碰撞检测算法,提高检测精度,降低问题规模,提高算法速度,保证远程机器人监控系统的实时性交互是我们的研究重点和核心。
5.2 碰撞检测的实现
5.2.1 自设计算法实现碰撞检测
碰撞检测是机器人运动仿真系统中的重要组成部分,快速有效的碰撞检测功能将是仿真系统成功的要害。碰撞检测算法实现应该先将碰撞问题转化为多面体相交计算,而多面体相交又可以转化为三角面的相交检测,由于时间紧迫和碰撞问题过于复杂,我并没有自行设计碰撞检测算法,而是采用系统自带的类完成了碰撞检测。
碰撞检测问题是确定不同的物体在空间是否占有相同区域的问题。该问题可描述如下:“给定N个物体s1,s2,…,sn,它们在空间中的位置是由定义在时间域[t0,t1]上的函数f1,f2,…,fn来确定的,判定在这个时间域内相同时刻是否存在任何一对物体占有公共空间”。同时碰撞检测问题不应仅归结为一般的求交问题,针对不同的应用对象,碰撞检测问题涉及到检测方法的复杂性、检测算法的可靠性和效率等。不同的检测算法具有不同的特点和面向不同的应用对象。
5.2.2 碰撞检测类CollisionDetector
我们主要介绍JAVA3D提供的碰撞检测功能的实现。JAVA3D提供了两个类WakeupOnCollisionEntry及WakeupOnColisionExit,这两个类在构造的时候要求提供被检测的范围(类Bounds的子类)或三维对象(类Node的子类)。当场景图中的任何对象与被检测的对象(范围)发生碰撞时WakeupOnCollisionEntry就会被唤醒(Wakeup),当碰撞解除时WakeupOnColisionExit就会被唤醒。Java3D检测碰撞的方法有两个:USE_BOUNDS和 USE_GEOMETRY,也就是使用包围盒或几何体进行碰撞检测,经过实验发现,前者的检测效果非常粗略,几乎是错误的结果,所以选择用几何体进行检测。实际编程中,可以把唤醒条件加入Behavior类中,就可以在Behavior类的processStinulus过程中处理碰撞发生后或解除后要作的控制。
据此,我们设计了一个碰撞检测的试验,具体的碰撞检测类如下。
public class CollisionDetector extends Behavior {
……
wEnter = new WakeupOnCollisionEntry(shape,
WakeupOnCollisionEntry.USE_GEOMETRY);
wExit = new WakeupOnCollisionExit(shape,
WakeupOnCollisionEntry.USE_GEOMETRY);
wakeupOn(wEnter);
……
//碰撞发生后使碰撞形体高亮显示,如下
if (inCollision) {
shapeAppearance.setColoringAttributes(highlight);
wakeupOn(wExit);
}
else {
shapeAppearance.setColoringAttributes(shapeColoring);
wakeupOn(wEnter);
}
//以下需交替指定唤醒条件或者定义碰撞规避算法代码
……
}
其中WakeupOnCollisionEntry类需要指定参数为USE_GEOMETRY才能够正确使用几何形体进行检测,同时第一项参数也必须为javax.media.j3d.Node或者javax.media.j3d.Bounds的派生类的对象。原因在于此两个类封装了可以自动计算形体的包围盒的算法,所以可以通过改造碰撞检测相关的类来实现自定义的碰撞算法,也可以通过由形体继续到该类的方法来实现碰撞检测。

碰撞发生前
碰撞发生后图5-1系统碰撞检测效果图
【上一页】
【下一页】
本文地址:
http://www.cg3000.com/html/cgTutorials/VirtualReality/Java3D/20071205/jiqirenxunifangzhenxitongchubuyanjiu_wu__69351.shtml