教程 5:复合实体和物理属性 (75分钟)


目标与简介

本教程将深入探讨Webots中的复合实体和物理属性系统。你将学习如何创建复杂的几何体、设置物理属性、处理碰撞检测,以及如何通过编程方式控制物理行为。本教程基于官方教程5

目录

1. 环境准备

在开始本教程之前,请确保你已经完成了前面的教程,并且熟悉基本的Webots操作。我们将创建一个新的环境来学习复合实体和物理属性。

📝 动手实践 #1: 创建一个新的Webots项目,命名为 physics_tutorial。在场景中添加一个 RectangleArena 作为基础环境。确保仿真处于暂停状态,虚拟时间计数器显示 0:00:00:000。

2. 复合实体

复合实体是由多个简单几何体组成的复杂对象。在Webots中,我们可以使用 Solid 节点来创建复合实体。复合实体可以包含多个 Shape 节点,每个节点代表实体的一个视觉部分。

📝 动手实践 #2: 创建一个复合实体(桌子):
  1. 在场景树中选中 RectangleArena,点击 ADD图标 按钮
  2. 选择 PROTO nodes (Webots Projects) / objects / factory / furniture / Table (Solid)
  3. 设置 translation0 0 0.3
  4. 设置 size0.8 0.6 0.7
  5. 观察桌子的结构:桌面和四条腿
📝 动手实践 #3: 创建自定义复合实体:
  1. 添加一个 Solid 节点到场景中
  2. Solid 下添加多个 Shape 节点
  3. 为每个 Shape 设置不同的几何体(BoxCylinder 等)
  4. 设置不同的 translationrotation 来组合几何体
  5. 创建一个简单的机器人形状(身体、头部、手臂)

3. 物理属性

物理属性决定了对象在仿真中的行为。包括质量、惯性、摩擦系数等属性。每个 Solid 节点都有一个 physics 字段,用于定义这些属性。

📝 动手实践 #4: 设置物理属性:
  1. 选中刚创建的复合实体,展开 physics 字段
  2. 设置 mass5.0(5千克)
  3. 设置 centerOfMass0 0 0.35(重心位置)
  4. 设置 inertiaMatrix0.1 0.1 0.1 0 0 0(惯性矩阵)
  5. 设置 damping0.1(阻尼系数)
📝 动手实践 #5: 添加多个物理对象进行测试:
  1. 添加一个 WoodenBox,设置 mass2.0
  2. 添加一个 MetalBox,设置 mass8.0
  3. 添加一个 Sphere,设置 mass1.0
  4. 将它们的 translation 设置为不同的位置
  5. 保存世界文件

4. 碰撞检测

碰撞检测是物理仿真的核心功能。Webots使用碰撞几何体来检测对象之间的接触。每个 Solid 节点都有一个 boundingObject 字段,用于定义碰撞几何体。

📝 动手实践 #6: 配置碰撞检测:
  1. 选中复合实体,展开 boundingObject 字段
  2. 添加一个 Box 作为碰撞几何体
  3. 设置 size0.8 0.6 0.7(与视觉几何体相同)
  4. 为其他对象也设置适当的碰撞几何体
  5. 运行仿真,观察碰撞效果
📝 动手实践 #7: 创建带关节的机械臂:
from controller import Robot, Motor, PositionSensor
import math

TIME_STEP = 64

class RoboticArm:
    def __init__(self):
        self.robot = Robot()
        self.time_step = TIME_STEP
        
        # 获取关节电机
        self.joint1 = self.robot.getDevice('joint1')
        self.joint2 = self.robot.getDevice('joint2')
        self.joint3 = self.robot.getDevice('joint3')
        
        # 获取位置传感器
        self.pos1 = self.robot.getDevice('pos1')
        self.pos2 = self.robot.getDevice('pos2')
        self.pos3 = self.robot.getDevice('pos3')
        
        # 启用传感器
        self.pos1.enable(TIME_STEP)
        self.pos2.enable(TIME_STEP)
        self.pos3.enable(TIME_STEP)
        
        # 设置电机为位置控制模式
        self.joint1.setPosition(float('inf'))
        self.joint2.setPosition(float('inf'))
        self.joint3.setPosition(float('inf'))
    
    def move_to_position(self, pos1, pos2, pos3):
        """移动到指定位置"""
        self.joint1.setPosition(pos1)
        self.joint2.setPosition(pos2)
        self.joint3.setPosition(pos3)
    
    def run(self):
        """主运行循环"""
        time = 0
        while self.robot.step(self.time_step) != -1:
            # 创建简单的运动模式
            angle1 = math.sin(time * 0.01) * 0.5
            angle2 = math.cos(time * 0.015) * 0.3
            angle3 = math.sin(time * 0.02) * 0.2
            
            self.move_to_position(angle1, angle2, angle3)
            time += 1

# 创建并运行机械臂
arm = RoboticArm()
arm.run()

5. 关节和约束

关节和约束用于连接多个刚体,创建复杂的机械系统。Webots支持多种类型的关节,包括铰链关节、滑块关节、球关节等。

📝 动手实践 #8: 创建铰链关节:
  1. 添加一个 HingeJoint 节点
  2. 设置 jointParametersaxis0 0 1
  3. 设置 anchor0 0 0.5
  4. endPoint 中添加一个 Solid 作为连接的对象
  5. 设置关节的限位和阻尼参数

6. 高级物理效果

Webots支持多种高级物理效果,包括流体仿真、软体仿真、弹簧约束等。这些功能可以用于创建更加复杂的物理仿真场景。

📝 动手实践 #9: 创建弹簧约束:
  1. 添加一个 Solid 作为固定点
  2. 添加另一个 Solid 作为移动对象
  3. 在它们之间添加一个 Connector 节点
  4. 设置 type"spring"
  5. 设置 springConstant100.0
  6. 设置 damping10.0
📝 动手实践 #10: 创建发光材质:
  1. 添加一个新的 Sphere 节点
  2. 设置 emissiveColor1 0 0(红色发光)
  3. 设置 diffuseColor0.2 0 0(暗红色)
  4. 设置 shininess0.1(低光泽度)
  5. 运行仿真,观察发光效果

7. 总结

恭喜你完成了Webots复合实体和物理属性教程!你已经学会了:

  • 如何创建和配置复合实体
  • 如何设置物理属性(质量、惯性、阻尼等)
  • 如何配置碰撞检测几何体
  • 如何创建关节和约束
  • 如何使用高级物理效果(弹簧约束、发光材质等)
  • 如何通过编程方式控制物理行为

这些技能将帮助你创建更加复杂和真实的物理仿真环境。在下一个教程中,我们将学习物理仿真的高级功能。

下一步

继续学习 教程6:物理仿真,了解如何创建更复杂的物理仿真场景。