Chai 3D之触觉渲染
  lG7RE7vNF4mc 2023年11月02日 33 0

Chai 3D之触觉渲染_3d

推荐:将 NSDT场景编辑器 加入你的3D开发工具链

介绍

 在以下部分中,我们将介绍用于将触觉设备连接到虚拟世界的基本类和算法。

工具

  工具是一种 3D 对象,用于在虚拟世界中连接、建模和显示触觉设备。工具由一个或多个称为触觉点 (cHapticPoint) 的接触球体以图形方式建模,这些接触球体对触觉设备与环境之间的交互进行建模。最简单的工具 (cToolCursor) 使用单个球体,而夹持器工具 (cToolGripper) 使用两个或多个接触点来模拟类似抓取的交互(拇指和手指)。

  一组力渲染算法(cAlgorithmFingerProxy和cAlgorithmPotentialField)用于计算触觉点和环境之间的相互作用力,与每个触觉点(cHapticPoint)相关联。遇到的对象类型决定了使用哪种强制渲染算法。

  一旦计算了工具每个触觉点的所有接触力,产生的力将组合在一起并转换为发送到触觉设备的力、扭矩和夹持力。

Chai 3D之触觉渲染_工作空间_02

两个工具,每个工具由两个触觉点组成,用于抓取网格对象(参见演示 06-ODE 探索)

  以下代码演示如何创建单点接触工具(光标)并将其连接到触觉设备。

using namespace chai3d;
// create 3D virtual tool
cToolCursor* tool;
tool = new cToolCursor(world);
world->addChild(tool);
// attach haptic device to virtual tool
tool->setHapticDevice(hapticDevice);

  一旦工具被实例化,我们就会创建一个触觉线程,该线程连续读取触觉设备的位置,计算工具与环境之间的相互作用力,并将计算出的力发送回触觉设备。如果需要对任何其他行为进行建模(例如拾取或移动物体),这些行为通常在相同的触觉循环中实现。为了更好地了解这些功能,我们邀请您探索不同的 CHAI3D 示例。

using namespace chai3d;
void updateHaptics(void)
{
// simulation in now running
simulationRunning = true;
// main haptic simulation loop
while(simulationRunning)
{
// compute global reference frames for each object
world->computeGlobalPositions(true);
// update position and orientation of tool
tool->updateFromDevice();
// compute interaction forces
tool->computeInteractionForces();
// send forces to haptic device
tool->applyToDevice();
}
}

  当触觉设备的物理工作空间与虚拟世界的工作空间大小不同时,必须引入比例因子。比例因子通过为工具分配所需的工作空间大小进行编程。

using namespace chai3d;
// map physical workspace of haptic device to a simulation workspace.
tool->setWorkspaceRadius(1.5);

  由于触觉设备彼此不同(例如尺寸、力范围、最大闭环刚度),因此在为虚拟环境分配触觉属性之前,请务必参考其物理特性,以防止触觉渲染不稳定。

  以下代码示例演示如何根据触觉设备的规范对对象的材料刚度属性进行编程。在此示例中,我们考虑了触觉设备支持的最大闭环刚度以及工具和设备之间的工作区比例因子。

using namespace chai3d;
// map physical workspace of haptic device to a simulation workspace.
tool->setWorkspaceRadius(1.3);
// retrieve information from haptic device
cHapticDeviceInfo info;
info = hapticDevice->getSpecifications();
// read scale factor between physical workspace of haptic device and simulation workspace
double workspaceScaleFactor = tool->getWorkspaceScaleFactor();
// define maximum scaled stiffness that can be handled by current haptic device.
stiffnessMax = info.m_maxForceStiffness / workspaceScaleFactor;

触觉点

  如上图所示,触觉工具由一组触觉点(接触球体)组成,这些触觉点(接触球体)模拟工具与环境之间的相互作用力。当工具计算交互作用力时,渲染算法会遍历每个触觉点并独立计算所有局部贡献。

using namespace chai3d;
// compute interaction forces
tool->computeInteractionForces();

力模型

  用于计算这些点的相互作用力的方法称为力渲染算法。为给定工具计算交互作用力时,每个触觉点都会解析每个算法的整个世界(或场景图)并计算这些力。CHAI3D目前实现了两种力模型,即势场和手指代理模型。

  势场易于实现,需要少量 CPU 才能运行。另一方面,它们确实有局限性,必须小心处理以避免不必要的伪影或不稳定性(例如,薄物体上的弹出效果,角落的不连续性等......手指代理解决了其中的许多问题,但代价是计算成本更高的碰撞检测算法。有关这些算法的详细信息,请参阅以下小节。

  在实践中,这两种方法可以组合在一起以创建丰富的环境,同时仍保持保证触觉设备稳定行为所需的实时性能。

势场模型

  还可以通过材料属性等级激活和调整其他触觉效果。触觉效果使用势场算法,任何通用形状对象也支持这些算法。请注意,网格对象当前不支持磁性效果。

using namespace chai3d;
// create a haptic stick-slip effect
mesh->createEffectStickSlip();
// set haptic properties
mesh->m_material->setStickSlipForceMax(5.0);
mesh->m_material->setStickSlipStiffness(1000);

手指代理模型

Chai 3D之触觉渲染_工作空间_03

网格对象的触觉渲染

  为了触觉渲染网格对象,CHAI3D使用由Ruspini和Khatib开发的虚拟“手指代理”算法,类似于Zilles和Salisbury提出的“上帝对象”。虚拟代理是替代虚拟环境中物理手指或探测器的代表性对象。

Chai 3D之触觉渲染_建模_04

Ruspini和Khatib的手指代理算法

  上图说明了虚拟代理的运动,因为触觉设备的位置发生了变化。代理的运动试图始终朝着目标移动。当畅通无阻时,代理直接向目标移动。当代理遇到障碍物时,无法直接移动,但代理仍可以通过沿一个或多个约束曲面移动来缩短到目标的距离。选择运动以局部最小化到目标的距离。当代理无法减少其与目标的距离时,它将停止在本地最小配置处。力是通过对触觉设备和代理位置之间的虚拟弹簧进行建模来计算的。弹簧的刚度在材料属性中定义。

using namespace chai3d;
// create collision detector
mesh->createAABBCollisionDetector(toolRadius);
// set haptic properties
mesh->m_material->setStiffness(1000);
mesh->m_material->setStaticFriction(0.3);
mesh->m_material->setDynamicFriction(0.4);

互动事件

  每次触觉点遇到具有激活触觉效果的对象时,都会返回一个交互事件。每个交互事件都报告对对象的引用、交互时工具的位置以及计算的力。

碰撞事件

  每次代理和对象之间发生联系时,都会报告冲突事件。碰撞事件包含有关物体、接触位置、表面法线等的有用信息...

  下面的示例演示如何从触觉点读取联系人事件。

using namespace chai3d;
// check if a contact event has occurred at contact point
if (tool->m_hapticPoint->getNumCollisionEvents() > 0)
{
// get contact event
cCollisionEvent* collisionEvent = tool->m_hapticPoint->getCollisionEvent(0);
// get object from contact event
object = collisionEvent->m_object;
}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
lG7RE7vNF4mc