PhysX3.4文档(4) --Rigid Body Overview

本文介绍了使用NVIDIA PhysX引擎模拟刚体动力学的基本概念,包括刚体对象模型、模拟循环过程及如何推进世界模拟。文章详细解释了各种刚体类的功能,如PxRigidDynamic、PxRigidStatic等。

Rigid Body Overview

Introduction


本章将介绍使用 NVIDIA PhysX 引擎simulate刚体动力学的基础知识。

Rigid Body Object Model


PhysX 使用分层刚体对象模型,如下所示:

RigidBody_01
classExtendsFunctionality
PxBaseN/A反射/查询对象类型。
PxActorPxBaseActor名称、actor标志、作用域、客户端、聚合、查询世界边界。
PxRigidActorPxActorShapes 和 transforms
PxRigidBodyPxRigidBodyc质量,惯性,body flags
PxRigidStaticPxRigidActor场景中静态主体的接口。这种身体具有隐含的无限质量/惯性。
PxRigidDynamicPxRigidBody场景中动态刚体的接口。引入对运动学目标(kinematic targets )和对象休眠(object sleeping)的支持。
PxArticulationLinkPxRigidBodyPxArticulation中动态刚体链接的接口。介绍对查询关节和相邻链接的支持。
PxArticulationPxBase定义PxArticulation 的接口。实际上,包含引用多个PxArticualtionLink刚体。

下图显示了刚体管线中涉及的主要类型之间的关系:

RigidBody_02

The Simulation Loop

现在使用``PxScene::simulate()`方法及时推进世界前进。下面是示例的固定步进器类(fixed stepper class)的简化代码:

mAccumulator = 0.0f;
mStepSize = 1.0f / 60.0f;

virtual bool advance(PxReal dt)
{
    mAccumulator  += dt;
    if(mAccumulator < mStepSize)
        return false;

    mAccumulator -= mStepSize;

    mScene->simulate(mStepSize);
    return true;
}

每当应用完成事件处理并开始空闲时,就会从示例框架中调用此操作。它累积经过的实时时间,直到大于六十分之一秒,然后调用 simulate(),它将场景中的所有对象向前移动该间隔时间。这可能是在推进simulate时处理时间的众多不同方法中最简单的方法。

要允许simulate完成并返回结果,只需调用:

mScene->fetchResults(true);

True 表示simulate应阻塞,直到simulate()完成,以便在返回时保证结果可用。当 fetchResults完成时,您定义的任何simulate事件回调函数也将被调用。请参阅回调序列一章。在simulate过程中,可以从场景中读取和写入。示例利用这一点与物理场并行执行渲染工作。在 fetchResults() 返回之前,当前simulate步骤的结果不可用。因此,与simulate并行运行渲染会将演员渲染为调用 simulate()前的样子。在 fetchResults() 返回后,所有这些函数都将返回新的simulate后的状态。有关在simulate运行时读取和写入的更多详细信息,请参阅Threading一章。为了使人眼将动画运动感知为平滑,每秒至少使用二十个离散帧,每帧对应于一个物理时间步长。要对更复杂的物理场景进行流畅、逼真的simulate,请至少每秒使用五十帧。

注意: 如果您正在进行实时交互式(real-time interactive simulation)simulate,则可能会尝试采用不同大小的时间步长,这些步长对应于自上次simulate帧以来经过的实时量。如果这样做,请非常小心,与采用恒定大小的时间步长不同的是:simulate代码对非常小和很大的时间步长都很敏感,并且对时间步长之间的太大变化也很敏感。在这些情况下,它可能会产生抖动simulate(jittery simulation)。

在 Simulink 中使用 Robotics System Toolbox 查找用于建模机械臂(Manipulators)的 `Rigid Body Tree` 模块,可以通过以下方式实现: 1. **打开 Simulink 库浏览器** 在 MATLAB 命令行中输入 `simulink` 或直接打开 Simulink 环境,然后在左侧的库浏览器中查找相关模块。 2. **导航至 Robotics System Toolbox 模块库** 在库浏览器中展开 `Robotics System Toolbox` 项,接着展开 `Manipulator Algorithms` 或 `Robotics Utilities`,可以找到与刚体树(Rigid Body Tree)相关的模块 [^3]。 3. **使用 `Rigid Body Tree` 模块** 该模块允许用户定义和操作机械臂模型,支持设置连杆(links)、关节(joints)和运动学参数。用户可以通过 URDF(Unified Robot Description Format)文件导入现有的机械臂模型,也可以手动构建 [^3]。 4. **与 Gazebo 集成进行仿真** Robotics System Toolbox 支持通过与 Gazebo 的连接进行机械臂的动态仿真,用户可以通过 Simulink 中的接口将模型部署到 Gazebo 进行可视化和验证 [^2]。 5. **示例与模板** MATLAB 提供了多个示例,展示如何使用 `Rigid Body Tree` 模块构建和控制机械臂。可以通过 `Robotics System Toolbox` 示例页面查找相关主题,如“Modeling and Simulating a Manipulator” [^1]。 6. **生成代码并部署到硬件** 在完成仿真后,可以使用 Simulink Coder 或 MATLAB Coder 将算法部署到实际机器人硬件上 [^2]。 --- ### 示例代码:在 MATLAB 中创建一个 Rigid Body Tree 模型 ```matlab % 创建一个空的 rigid body tree 对象 robot = rigidBodyTree; % 添加连杆和关节 body1 = rigidBody(&#39;body1&#39;); joint1 = rigidJoint(&#39;joint1&#39;, &#39;revolute&#39;); setFixedTransform(joint1, trvec2tform([0 0 0.5])); body1.Joint = joint1; addBody(robot, body1, &#39;base&#39;); % 显示机器人模型 show(robot); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值