接触传感器#

ContactSensor 将一个或多个刚体上的接触汇总为批量力测量。传感器范围由 prim_path 定义:每个匹配的刚体都会成为各环境中的一个传感器刚体。

报告总接触力和过滤后接触力的接触传感器

合力与过滤后的力#

net_normal_forces_w 是作用于各传感器刚体的法向合力,以世界坐标系表示。它包含与场景中所有刚体接触产生的力。

如果后端支持且启用了 track_friction_forces , net_friction_forces_w 会报告摩擦合力。因此,总力为

\[\boldsymbol{f}_{total} = \boldsymbol{f}_{normal} + \boldsymbol{f}_{friction}.\]

在 Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本中,net_forces_w 返回总接触力;即使 track_friction_forces=False,其中也包含摩擦力。Isaac Sim PhysX 6.1 的 net_forces_w 则返回 net_normal_forces_w 并给出警告。需要区分法向力和摩擦力时,应使用明确对应各分量的属性。

若还需要获取来自指定接触对象的力,可设置 filter_prim_paths_expr 。normal_force_matrix_w 和 friction_force_matrix_w 为每个配置的过滤表达式保留一项数据。在 Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本中,对应的 force_matrix_w 返回法向力与摩擦力之和,不受 track_friction_forces 设置影响。

只有过滤条件覆盖了所有接触物体时,沿过滤维度对力矩阵求和才能还原对应的合力。

刚体级过滤支持多对一关系:配置过滤条件时, prim_path 必须在每个环境中解析为一个传感器刚体。如果需要分别获取过滤后的力,请为每个源刚体定义一个传感器,例如每只脚各一个。Newton 还支持通过 sensor_shape_prim_expr 和 filter_shape_prim_expr 在碰撞形状级别进行感知和过滤。

配置传感器#

将配置添加到 InteractiveSceneCfg :

from isaaclab.scene import InteractiveSceneCfg
from isaaclab.sensors import ContactSensorCfg


class MySceneCfg(InteractiveSceneCfg):
    left_foot_contact = ContactSensorCfg(
        prim_path="{ENV_REGEX_NS}/Robot/LF_FOOT",
        update_period=0.0,
        history_length=6,
        filter_prim_paths_expr=["{ENV_REGEX_NS}/Object"],
        track_air_time=True,
    )

update_period=0.0 表示每个物理步都采样。 history_length 用于存储历史力样本。仅在需要时启用可选缓冲区,各后端的支持情况不同:

  • Isaac Sim PhysX 6.2 及以上版本支持位姿跟踪、过滤后的接触点跟踪,以及聚合或过滤后的摩擦力跟踪。Isaac Sim PhysX 6.1 的摩擦力跟踪仅支持过滤后的结果。

  • OvPhysX 支持过滤后的接触点跟踪,以及聚合或过滤后的摩擦力跟踪。位姿跟踪仅支持每个环境中只有一个传感器刚体的情况。

  • Newton 支持过滤后的接触点,以及摩擦合力或过滤后的摩擦力跟踪,但不支持位姿跟踪。

过滤后的接触点和力矩阵需要配置过滤器。Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本无需过滤器即可获取聚合摩擦力。OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本仅在获取接触点时要求 max_contact_data_count_per_prim 为正值;其聚合力和过滤后的力不受详细接触数据容量限制。Isaac Sim PhysX 6.1 的过滤摩擦力也需要这一容量。超出容量时,OvPhysX 会给出警告并截断详细接触数据;要保留所有接触点,需先增大配置的容量,再重新创建传感器。

接触位置是每组传感器/过滤器配对中所有接触位置的平均值;该配对没有接触时,结果为 NaN。Isaac Sim PhysX 和 OvPhysX 也会将无接触时的位置重置为 NaN。过滤摩擦力为该配对的摩擦力之和,无接触时为零。在 Isaac Sim PhysX 6.1 中,接触点与摩擦锚点的数量可能不同。

读取数据#

对于 E 个环境、 S 个传感器刚体、 F 个过滤表达式和长度为 H 的历史,主要 Torch 视图遵循以下约定:

缓冲区

形状

含义

net_normal_forces_w.torch

(E, S, 3)

世界坐标系中的法向接触合力 [N]

net_friction_forces_w.torch

(E, S, 3)

世界坐标系中的合摩擦力 [N];支持 Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本

net_forces_w.torch

(E, S, 3)

总接触力 [N];Isaac Sim PhysX 6.1 返回法向力并给出警告

normal_force_matrix_w.torch

(E, S, F, 3)

各过滤对象产生的法向力 [N]

friction_force_matrix_w.torch

(E, S, F, 3)

各过滤对象产生的摩擦力 [N];支持 Isaac Sim PhysX、OvPhysX 和 Newton

force_matrix_w.torch

(E, S, F, 3)

过滤后的总接触力 [N];Isaac Sim PhysX 6.1 返回法向力并给出警告

contact_pos_w.torch

(E, S, F, 3)

世界坐标系中的过滤后平均接触位置 [m]

current_air_time.torch / current_contact_time.torch

(E, S)

当前状态的持续时间 [s]

受支持的可选缓冲区在相应跟踪选项或过滤器启用前均为 None。法向力、摩擦力和总接触力的历史数据会在 E 之后增加一个 H 维度,最新样本位于索引零。Isaac Sim PhysX 6.1 不提供聚合摩擦力,读取时会抛出 NotImplementedError。兼容别名 friction_forces_w 在 Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本中返回聚合摩擦力;在 Isaac Sim PhysX 6.1 中则返回 friction_force_matrix_w 并给出警告。在 Newton 中读取位姿数据会抛出 NotImplementedError。

contact = scene["left_foot_contact"]
net_normal_force = contact.data.net_normal_forces_w.torch
object_normal_force = contact.data.normal_force_matrix_w.torch

验证刚体表达式和过滤对象时,可使用 debug_vis=True 。可视化会显示传感器接触,但不会改变报告的数据。

接触传感器调试可视化

完整的可运行示例名为 contact-sensor :

uv run isaaclab example contact-sensor