Skip to content

KinematicTactileSensor

Point taxel force/torque sensor, backed by genesis.sensors.KinematicTaxel.

A set of point taxels ride on a parent link and estimate contact force and torque per probe from a kinematic spring-damper model driven by SDF penetration depth and the relative motion of the probe and the geometry it touches. For each taxel Genesis evaluates:

v_n = dot(relative_velocity, probe_normal) * probe_normal
v_t = relative_velocity - v_n
s   = penetration ** normal_exponent
F   = (-normal_stiffness * s * probe_normal) - (normal_damping * s * v_n) - (shear_scalar * v_t)
T   = cross(probe_local_pos, F) - twist_scalar * dot(relative_angular_velocity, probe_normal) * probe_normal

The contact normal is carried implicitly by the direction of force — its normal component aligns with probe_local_normal. Outputs are in the parent link's local frame.

Fidelity

This is a geometric / SDF estimate, not the solver's impulse force and not a deformable-skin FEM or optical tactile model. Force is a kinematic spring-damper readout of penetration and relative motion. For a binary contact flag or raw penetration depth instead, see KinematicContactSensor / KinematicDepthSensor.

Configuration

KinematicTactileSensorCfg extends SensorCfg. All fields are keyword-only.

Field Type Default Notes
name str "" Inherited from SensorCfg. Unique per scene.
entity_name str "robot" Inherited. Which entity carries the taxels.
link_name str "" Parent link the taxels ride on. Required.
probe_local_pos tuple[tuple[float, float, float], ...] ((0.0, 0.0, 0.0),) Taxel positions in the parent link's local frame.
probe_local_normal tuple[float, float, float] (0.0, 0.0, 1.0) Shared contact normal in the link's local frame.
probe_radius float 0.01 SDF query radius in metres.
probe_radius_noise float 0.0 Dual-radius sim2real perturbation magnitude in metres. 0.0 disables it.
normal_stiffness float 1000.0 Normal-force stiffness against penetration depth (N/m).
normal_damping float 1.0 Normal-force damping against penetration-rate.
normal_exponent float 1.0 Penetration exponent. 1.0 linear, 1.5 Hertzian. Must be >= 1.0.
shear_scalar float 1.0 Coefficient on tangential relative velocity for shear force.
twist_scalar float 1.0 Coefficient on relative angular velocity for twist torque.
history_length int 0 Forwarded to Genesis. 0 = current-step only; > 0 allocates a ring buffer carried as a leading axis on data.force / data.torque.

Data

Field Type Shape
force torch.Tensor (float) (num_envs, [history,] num_probes, 3) — spring-damper force in the parent link's local frame, last axis (tangent_x, tangent_y, normal).
torque torch.Tensor (float) (num_envs, [history,] num_probes, 3) — spring-damper torque in the parent link's local frame.
raw torch.Tensor (float) Alias of force, for the reward primitives in genelab.mdp.rewards.tactile.

Example

from genelab.configs import InteractiveSceneCfg
from genelab.sensor import KinematicTactileSensorCfg

scene_cfg = InteractiveSceneCfg(
    sensors=(
        KinematicTactileSensorCfg(
            name="fingertip_taxels",
            link_name="right_finger_tip",
            probe_local_pos=(
                (0.0, 0.0, 0.0),
                (0.005, 0.0, 0.0),
                (-0.005, 0.0, 0.0),
            ),
            probe_local_normal=(0.0, 0.0, 1.0),
            normal_stiffness=1000.0,
        ),
    ),
)

A fingertip pressed onto a box reads ≈ 0 while clear, and a normal-aligned force on contact (e.g. force ≈ [0, 0, 10.0] N for normal_stiffness=1000 at 0.01 m penetration, since F_n = normal_stiffness · penetration).

See also