接触传感器#
ContactSensor 将一个或多个刚体上的接触汇总为批量力测量。传感器范围由 prim_path 定义:每个匹配的刚体都会成为各环境中的一个传感器刚体。
合力与过滤后的力#
net_normal_forces_w 是作用于各传感器刚体的法向合力,以世界坐标系表示。它包含与场景中所有刚体接触产生的力。
如果后端支持且启用了 track_friction_forces , net_friction_forces_w 会报告摩擦合力。因此,总力为
在 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 视图遵循以下约定:
缓冲区 |
形状 |
含义 |
|---|---|---|
|
|
世界坐标系中的法向接触合力 [N] |
|
|
世界坐标系中的合摩擦力 [N];支持 Newton、OvPhysX 和 Isaac Sim PhysX 6.2 及以上版本 |
|
|
总接触力 [N];Isaac Sim PhysX 6.1 返回法向力并给出警告 |
|
|
各过滤对象产生的法向力 [N] |
|
|
各过滤对象产生的摩擦力 [N];支持 Isaac Sim PhysX、OvPhysX 和 Newton |
|
|
过滤后的总接触力 [N];Isaac Sim PhysX 6.1 返回法向力并给出警告 |
|
|
世界坐标系中的过滤后平均接触位置 [m] |
|
|
当前状态的持续时间 [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