Tactile sensors#

Tactile sensors turn a rigid link’s surface into a grid of sensing points, or taxels, and report how that surface interacts with nearby geometry. They range from a per-probe contact flag to dense per-taxel force, torque, and elastomer-displacement fields that imitate a tactile skin.

Two families share this interface but estimate contact differently:

  • SDF-query probes (ContactProbe, ContactDepthProbe, KinematicTaxel) query the signed distance from each probe to nearby collision geometry. They need no list of target links.

  • Point-cloud probes (ElastomerTaxel, ProximityTaxel) sample a point cloud from the tracked meshes and measure against those points.

Create a sensor from the matching gs.sensors.* options object with scene.add_sensor(); the call returns the sensor handle whose read() gives the measured value. For the attach-and-read model, probe layout with probe_local_pos, and the force models behind each estimate, see the contact and tactile sensors guide.

ContactProbe#

Thresholds each probe’s penetration depth into a per-probe boolean contact flag.

class genesis.options.sensors.tactile.ContactProbe(*, history_length: int = 0, delay: float = 0.0, jitter: float = 0.0, draw_debug: bool = False, entity_idx: int = -1, contact_threshold: float = 0.0001, release_threshold: float | None = None, hysteresis_strength: float = 0.0, hysteresis_tau: float = 0.0, probe_local_pos: tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = ((0.0, 0.0, 0.0),), probe_radius: float | tuple[float, ...] | tuple[tuple[float, ...], ...] = 0.01, probe_radius_noise: float = 0.0, debug_probe_color: tuple[float, float, float] = (0.2, 0.4, 1.0), debug_probe_center_radius: float = 0.0008, debug_probe_sphere_opacity: float = 0.3, debug_contact_color: tuple[float, float, float] = (1.0, 0.2, 0.0), probe_gain: tuple[float, ...] | float = 1.0, probe_gain_resample_range: tuple[float, float] | None = None, dead_taxel_probability: float = 0.0, dead_taxel_value_range: tuple[float, float] = (0.0, 0.0), contact_depth_query: Literal['sdf', 'raycast'] | None = None, resolution: tuple[float, ...] | float = 0.0, bias: tuple[float, ...] | float = 0.0, noise: tuple[float, ...] | float = 0.0, random_walk: tuple[float, ...] | float = 0.0, link_idx_local: int = 0, pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), euler_offset: tuple[float, float, float] = (0.0, 0.0, 0.0)) None[source]#

Returns boolean contact per probe based on the contact depth threshold, gated by the contact_threshold / release_threshold Schmitt trigger (see ContactHysteresisOptionsMixin).

Note

The depth query only runs against geometry the rigid solver reports as in contact with the sensor’s link (the depth itself comes from an SDF/raycast query, not the contact impulse, but contact existence is gated by the solver). Since the solver skips collision between two fixed entities, a sensor on a fixed entity will not detect contacts with other fixed entities.

Parameters:

probe_radius (float | array-like[float] or shape (M, N) grid) – Probe sensing radius in meters. A scalar is shared by every probe; an array (or grid) must match the layout of probe_local_pos. Array entries of 0 mark inactive filler probes – they always read False and skip the SDF query – so an irregular taxel set can be padded into a regular grid.

class genesis.engine.sensors.kinematic_tactile.ContactProbeSensor(options: SensorOptions, idx: int, shared_context, shared_metadata, manager: SensorManager)[source]#

Bases: ContactDepthProbeSensor, SimpleSensor[ContactProbe, RaycastContext, ContactProbeMetadata, tuple]

Returns boolean contact per probe with optional Schmitt-trigger hysteresis.

Shares the depth-probe kernel. The contact bit latches on when depth exceeds contact_threshold and releases when depth drops to or below release_threshold. When release_threshold is left unset (the default; it then falls back to contact_threshold), the latch is degenerate and behavior matches a stateless threshold. Latch state is read from the per-branch return-space ring, so GT and measured branches latch independently and reset cleanly with the env (the manager zeros the ring on reset).

build()[source]#

Initialize all shared metadata needed to update all noisy sensors.

Time-related state (delays_ts, jitter_ts) is pushed by Sensor.build(); this method adds the imperfection-parameter state.

ContactDepthProbe#

Reports the penetration depth at each probe, in meters.

class genesis.options.sensors.tactile.ContactDepthProbe(*, history_length: int = 0, delay: float = 0.0, jitter: float = 0.0, draw_debug: bool = False, entity_idx: int = -1, hysteresis_strength: float = 0.0, hysteresis_tau: float = 0.0, probe_local_pos: tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = ((0.0, 0.0, 0.0),), probe_radius: float | tuple[float, ...] | tuple[tuple[float, ...], ...] = 0.01, probe_radius_noise: float = 0.0, debug_probe_color: tuple[float, float, float] = (0.2, 0.4, 1.0), debug_probe_center_radius: float = 0.0008, debug_probe_sphere_opacity: float = 0.3, debug_contact_color: tuple[float, float, float] = (1.0, 0.2, 0.0), probe_gain: tuple[float, ...] | float = 1.0, probe_gain_resample_range: tuple[float, float] | None = None, dead_taxel_probability: float = 0.0, dead_taxel_value_range: tuple[float, float] = (0.0, 0.0), contact_depth_query: Literal['sdf', 'raycast'] | None = None, resolution: tuple[float, ...] | float = 0.0, bias: tuple[float, ...] | float = 0.0, noise: tuple[float, ...] | float = 0.0, random_walk: tuple[float, ...] | float = 0.0, link_idx_local: int = 0, pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), euler_offset: tuple[float, float, float] = (0.0, 0.0, 0.0)) None[source]#

Returns contact depth in meters per probe.

Note

The depth query only runs against geometry the rigid solver reports as in contact with the sensor’s link (the depth itself comes from an SDF/raycast query, not the contact impulse, but contact existence is gated by the solver). Since the solver skips collision between two fixed entities, a sensor on a fixed entity will not detect contacts with other fixed entities.

class genesis.engine.sensors.kinematic_tactile.ContactDepthProbeSensor(options: SensorOptions, idx: int, shared_context, shared_metadata, manager: SensorManager)[source]#

Bases: ViscoelasticHysteresisMixin[ContactDepthProbeMetadata], KinematicTactileSensorMixin[ContactDepthProbeMetadata], RigidSensorMixin[ContactDepthProbeMetadata], SimpleSensor[ContactDepthProbe, RaycastContext, ContactDepthProbeMetadata, tuple]

Returns contact depth in meters per probe.

build()[source]#

Initialize all shared metadata needed to update all noisy sensors.

Time-related state (delays_ts, jitter_ts) is pushed by Sensor.build(); this method adds the imperfection-parameter state.

KinematicTaxel#

Adds a spring-damper force model on top of the depth query, estimating per-taxel force and torque from penetration and relative motion.

class genesis.options.sensors.tactile.KinematicTaxel(*, history_length: int = 0, delay: float = 0.0, jitter: float = 0.0, draw_debug: bool = False, entity_idx: int = -1, crosstalk_strength: float = 0.0, crosstalk_sigma: float = 0.0, crosstalk_kernel: Any | None = None, hysteresis_strength: float = 0.0, hysteresis_tau: float = 0.0, probe_local_pos: tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = ((0.0, 0.0, 0.0),), probe_radius: float | tuple[float, ...] | tuple[tuple[float, ...], ...] = 0.01, probe_radius_noise: float = 0.0, debug_probe_color: tuple[float, float, float] = (0.2, 0.4, 1.0), debug_probe_center_radius: float = 0.0008, debug_probe_sphere_opacity: float = 0.3, debug_contact_color: tuple[float, float, float] = (1.0, 0.2, 0.0), probe_gain: tuple[float, ...] | float = 1.0, probe_gain_resample_range: tuple[float, float] | None = None, dead_taxel_probability: float = 0.0, dead_taxel_value_range: tuple[float, float] = (0.0, 0.0), contact_depth_query: Literal['sdf', 'raycast'] | None = None, resolution: tuple[float, ...] | float = 0.0, bias: tuple[float, ...] | float = 0.0, noise: tuple[float, ...] | float = 0.0, random_walk: tuple[float, ...] | float = 0.0, link_idx_local: int = 0, pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), euler_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), normal_stiffness: float = 1000.0, normal_damping: float = 1.0, normal_exponent: float = 1.0, shear_scalar: float = 1.0, twist_scalar: float = 1.0) None[source]#

A tactile sensor which estimates force and torque per taxel by querying contact depth within the radius of the probe positions along a rigid entity link and the relative velocity of the probe and the entity in contact.

The force and torque are aligned with the contact surface normal n at each probe – the SDF gradient in "sdf" mode, or the nearest-triangle face normal in "raycast" mode. The returned force is a spring-damper estimate based on contact depth and relative motion:

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

as opposed to the actual impulse force on the link from the contact obtained from the physics solver.

Note

The depth query only runs against geometry the rigid solver reports as in contact with the sensor’s link (the force/torque come from the spring-damper estimate above, not the contact impulse, but contact existence is gated by the solver). Since the solver skips collision between two fixed entities, a sensor on a fixed entity will not detect contacts with other fixed entities.

probe_local_pos may be either an arbitrary set of probes with shape (N, 3) or a grid-shaped set with shape (M, N, 3). Regular planar grids enable spatial crosstalk on the measured branch (see crosstalk_strength). A probe whose probe_radius is 0 is treated as an inactive filler – it reads 0 force/torque and is skipped – so an irregular taxel set can be padded into a regular grid for crosstalk.

Parameters:
  • probe_radius (float | array-like[float]) – Probe sensing radius in meters. A scalar is shared by every probe; an array must match the probe count. Array entries of 0 mark inactive filler probes (see the grid note above); at least one must be positive.

  • normal_stiffness (float) – Stiffness for normal force estimation based on contact penetration depth and spring-damper model.

  • normal_damping (float) – Damping for normal force estimation based on contact penetration depth and spring-damper model.

  • normal_exponent (float) – Exponent for contact force estimation based on contact penetration depth and nonlinear spring-damper model. Default is 1.0, which means linear spring-damper model. Use 1.5 for Hertzian (spherical) contact.

  • shear_scalar (float, optional) – Coefficient for shear force estimation based on relative linear velocity of the probe and entity in contact.

  • twist_scalar (float, optional) – Coefficient for twist torque estimation based on relative angular velocity of the probe and entity in contact.

  • parameters (See SpatialCrosstalkOptionsMixin for the measured-branch spatial crosstalk) –

  • required. ((crosstalk_strength / crosstalk_sigma / crosstalk_kernel); a regular planar grid is) –

class genesis.engine.sensors.kinematic_tactile.KinematicTaxelSensor(options: KinematicTaxel, idx: int, shared_context, shared_metadata, manager: SensorManager)[source]#

Bases: ViscoelasticHysteresisMixin[KinematicTaxelMetadata], SpatialCrosstalkMixin[KinematicTaxelMetadata], KinematicTactileSensorMixin[KinematicTaxelMetadata], RigidSensorMixin[KinematicTaxelMetadata], SimpleSensor[KinematicTaxel, RaycastContext, KinematicTaxelMetadata, KinematicTaxelReturnType]

Kinematic taxels: spring-damper force and torque per probe from contact geometry and relative motion.

build()[source]#

Initialize all shared metadata needed to update all noisy sensors.

Time-related state (delays_ts, jitter_ts) is pushed by Sensor.build(); this method adds the imperfection-parameter state.

class genesis.engine.sensors.kinematic_tactile.KinematicTaxelReturnType(force: Tensor, torque: Tensor)[source]#

Bases: NamedTuple

Parameters:
  • force (torch.Tensor, shape ([n_envs,] n_probes, 3)) – Estimated contact force in the link frame from the kinematic spring-damper model.

  • torque (torch.Tensor, shape ([n_envs,] n_probes, 3)) –

force: Tensor#

Alias for field number 0

torque: Tensor#

Alias for field number 1

ElastomerTaxel#

Models a soft tactile skin, reporting a 3D marker displacement per probe from indentation and shear against the tracked geometry.

class genesis.options.sensors.tactile.ElastomerTaxel(*, history_length: int = 0, delay: float = 0.0, jitter: float = 0.0, draw_debug: bool = False, entity_idx: int = -1, contact_threshold: float = 1e-05, release_threshold: float | None = -0.0001, hysteresis_strength: float = 0.0, hysteresis_tau: float = 0.0, probe_local_pos: tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = ((0.0, 0.0, 0.0),), probe_radius: float | tuple[float, ...] | tuple[tuple[float, ...], ...] = 0.01, probe_radius_noise: float = 0.0, debug_probe_color: tuple[float, float, float] = (0.2, 0.4, 1.0), debug_probe_center_radius: float = 0.0008, debug_probe_sphere_opacity: float = 0.3, probe_local_normal: tuple[float, float, float] | tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = (0.0, 0.0, 1.0), debug_contact_color: tuple[float, float, float] = (1.0, 0.2, 0.0), probe_gain: tuple[float, ...] | float = 1.0, probe_gain_resample_range: tuple[float, float] | None = None, dead_taxel_probability: float = 0.0, dead_taxel_value_range: tuple[float, float] = (0.0, 0.0), contact_depth_query: typing.Literal['sdf', 'raycast'] | None = None, track_link_idx: tuple[int, ...] = <factory>, n_sample_points: tuple[int, ...] | int = 500, use_visual_mesh: bool = True, debug_point_cloud_color: tuple[float, float, float, float] = (1.0, 0.8, 0.0, 1.0), debug_point_cloud_radius: float = 0.002, resolution: tuple[float, ...] | float = 0.0, bias: tuple[float, ...] | float = 0.0, noise: tuple[float, ...] | float = 0.0, random_walk: tuple[float, ...] | float = 0.0, link_idx_local: int = 0, pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), euler_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), lambda_d: float = 700.0, lambda_s: float = 300.0, dilate_scale: float = 1.0, shear_scale: float = 1.0, normal_exponent: float = 2.0, compressibility: float = 1.0, elastomer_thickness: float = 0.0) None[source]#

An elastomer tactile sensor that implements HydroShear-style marker displacement from Genesis SDF queries.

The tracked rigid links are sampled into indenter on-surface points for shear history, while marker dilation is queried directly from the tracked geometry SDF.

Note

probe_local_pos may be either an arbitrary set of probes with shape (N, 3) or a grid-shaped set with shape (M, N, 3). Regular planar grids with one shared normal use FFT acceleration for dilation; other layouts use the direct dilation path. Shear is computed directly. A probe whose probe_radius is 0 is treated as an inactive filler – it reads 0 and is excluded from dilation/shear – so an irregular taxel set can be padded into a regular grid for FFT acceleration.

Note

probe_gain is applied to ElastomerTaxel as a post-step linear scale of the measured marker displacement (the dilation kernel writes a single shared field for both branches). This is exact for the tangential dilation and shear components but approximate for the normal dilation term, which scales as depth**normal_exponent and would ideally scale as gain**normal_exponent rather than gain. For gains near 1 the error is small.

Parameters:
  • probe_local_pos (array-like[array-like[float, float, float]], shape (N, 3) or (M, N, 3)) – Probe positions in link-local frame.

  • probe_local_normal (array-like[float, float, float] or array-like[array-like[float, float, float]]) – Unit direction(s) in link-local frame: one normal for all probes, or one normal per probe matching probe_local_pos.

  • probe_radius (float | array-like[float]) – Probe sensing radius in meters. A scalar is shared by every probe; an array must match the probe count. Array entries of 0 mark inactive filler probes (see the grid note above); at least one must be positive.

  • track_link_idx (array-like[int]) – Global rigid link indices whose collision geometry is queried by SDF and whose mesh is sampled for shear.

  • n_sample_points (int | array-like[int]) – Total surface samples split across track_link_idx, or one count per tracked link.

  • compressibility (float) – In-plane dilation kernel as a mix of a local and a global response, in [0, 1]. 1 (default) is fully compressible: a concentrated local bulge from the exp(-lambda_d * r^2) Gaussian, with no far-field reach. 0 is fully incompressible: the in-plane displacement is the gradient of the inverse-Laplacian of the indentation depth field (~ r_hat / r) – the global volume-conserving stretch that reaches the whole sensor, but with a soft center. Intermediate values superimpose a local bulge of weight compressibility on a global stretch of weight 1 - compressibility (each kernel peak-normalized first so the weight is meaningful), giving both a sharp local bulge and the global stretch. The endpoints 0 and 1 skip the unused kernel. The normal (out-of-plane) channel keeps the lambda_d Gaussian bulge for any value.

  • elastomer_thickness (float) – Gel layer thickness in meters, bottom face bonded to a rigid backing (the Dirichlet condition a flat-slab FEM would use). When > 0 (and compressibility < 1), the global in-plane response is that of an incompressible elastic layer of this thickness instead of the free-space 1/r: indentation features much smaller than the thickness produce little in-plane surface motion (incompressible half-space limit), wavelengths comparable to the thickness respond most, and the long-range field recovers the 1/r squeeze flow. Grid (FFT) layouts use the exact spectral layer solution; non-grid (direct) layouts approximate it by regularizing the 1/r kernel at scale h (r_hat * r / (r^2 + h^2)). 0 (default) keeps the free-space kernel, regularized at the probe spacing (a numerical guard, not a physical scale – set the thickness to control the global response physically).

  • lambda_d (float) – Falloff coefficient (in 1/m^2) for the Gaussian dilation kernel exp(-lambda_d * r^2) (larger = sharper, more localized; smaller = broader). It sets the width of the local in-plane bulge (weighted by compressibility) and always sets the normal (out-of-plane) bulge width.

  • lambda_s (float) – Gaussian falloff coefficient (in 1/m^2) for the shear kernel exp(-lambda_s * r^2) that spreads each anchored tracked-surface point’s tangential displacement to nearby probes. Larger values keep shear tightly local to the contact patch; smaller values produce a softer, more diffuse shear response.

  • dilate_scale (float) – Scalar gain applied to dilation displacement.

  • shear_scale (float) – Scalar gain applied to shear displacement.

  • normal_exponent (float) – Exponent of the penetration-depth power law for the normal (out-of-plane) marker dilation: the normal bulge scales as depth ** normal_exponent. Must be >= 1.0. Default 2.0 (the HydroShear quadratic normal response). Tangential dilation and shear stay linear in depth regardless of this value.

  • release_threshold (contact_threshold /) – Schmitt-trigger gate for the shear anchor state (see ContactHysteresisOptionsMixin): a tracked surface point starts anchoring shear when its penetration into the elastomer reaches contact_threshold and releases when its depth drops to release_threshold (default -1e-4: it must separate by 0.1 mm). Only consumed when shear_scale > 0; backend-agnostic (sdf and raycast depths alike).

Note

Genesis reuses rigid-body SDFs for HydroShear queries. For non-analytic tracked meshes, the collision geometry should be watertight enough for signed-distance preprocessing, and the attached elastomer link’s collision geometry should represent the compliant contact surface.

class genesis.engine.sensors.point_cloud_tactile.ElastomerTaxelSensor(options: ElastomerTaxel, idx: int, shared_context, shared_metadata, manager: SensorManager)[source]#

Bases: ViscoelasticHysteresisMixin[ElastomerTaxelSensorMetadata], ContactDepthQuerySensorMixin, PointCloudTactileSensorMixin[ElastomerTaxelSensorMetadata], ProbesWithNormalSensorMixin[ElastomerTaxelSensorMetadata], RigidSensorMixin[ElastomerTaxelSensorMetadata], SimpleSensor[ElastomerTaxel, RaycastContext, ElastomerTaxelSensorMetadata, tuple]

build()[source]#

Initialize all shared metadata needed to update all noisy sensors.

Time-related state (delays_ts, jitter_ts) is pushed by Sensor.build(); this method adds the imperfection-parameter state.

classmethod reset(shared_metadata: ElastomerTaxelSensorMetadata, shared_ground_truth_cache: Tensor, envs_idx)[source]#

Reset the sensor.

This method is called by SensorManager when the scene is reset by scene.reset().

Parameters:
  • shared_metadata (SharedSensorMetadata) – The shared metadata for the sensor class.

  • shared_ground_truth_cache (torch.Tensor) – The shared ground truth cache for the sensor class.

  • envs_idx (array_like) – The indices of the environments to reset. The envs_idx should already be sanitized by SensorManager.

ProximityTaxel#

Estimates per-taxel force and torque from a point cloud sampled on the tracked meshes within a spherical sensing volume around each taxel, capturing near-touch as well as touch.

class genesis.options.sensors.tactile.ProximityTaxel(*, history_length: int = 0, delay: float = 0.0, jitter: float = 0.0, draw_debug: bool = False, entity_idx: int = -1, crosstalk_strength: float = 0.0, crosstalk_sigma: float = 0.0, crosstalk_kernel: typing.Any | None = None, hysteresis_strength: float = 0.0, hysteresis_tau: float = 0.0, probe_local_pos: tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = ((0.0, 0.0, 0.0),), probe_radius: float | tuple[float, ...] | tuple[tuple[float, ...], ...] = 0.01, probe_radius_noise: float = 0.0, debug_probe_color: tuple[float, float, float] = (0.2, 0.4, 1.0), debug_probe_center_radius: float = 0.0008, debug_probe_sphere_opacity: float = 0.3, probe_local_normal: tuple[float, float, float] | tuple[tuple[float, float, float], ...] | tuple[tuple[tuple[float, float, float], ...], ...] = (0.0, 0.0, 1.0), debug_contact_color: tuple[float, float, float] = (1.0, 0.2, 0.0), probe_gain: tuple[float, ...] | float = 1.0, probe_gain_resample_range: tuple[float, float] | None = None, dead_taxel_probability: float = 0.0, dead_taxel_value_range: tuple[float, float] = (0.0, 0.0), contact_depth_query: typing.Literal['sdf', 'raycast'] | None = None, track_link_idx: tuple[int, ...] = <factory>, n_sample_points: tuple[int, ...] | int = 500, use_visual_mesh: bool = True, debug_point_cloud_color: tuple[float, float, float, float] = (1.0, 0.8, 0.0, 1.0), debug_point_cloud_radius: float = 0.002, resolution: tuple[float, ...] | float = 0.0, bias: tuple[float, ...] | float = 0.0, noise: tuple[float, ...] | float = 0.0, random_walk: tuple[float, ...] | float = 0.0, link_idx_local: int = 0, pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), euler_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), stiffness: float = 100.0, shear_coupling: float = 0.0, density_scalar: int = 100) None[source]#

A tactile sensor which estimates force and torque per taxel from proximity to point clouds sampled on tracked meshes within a spherical sensing volume of nominal probe_radius around each taxel.

For each taxel, every tracked point inside that sphere contributes a penetration depth P_i = R_eff - ||p_i - o|| where R_eff is drawn each simulation step when probe_radius_noise is non-zero (additive uniform noise in meters around the sensing radius, clipped nonnegative). Normal force is aligned with probe_local_normal; shear uses tangential relative velocity. Generic SimpleSensor imperfections (bias, resolution, etc.) still apply. Outputs are in link-local frame.

Parameters:
  • probe_local_normal (array-like[array-like[float, float, float]]) – Unit direction(s) for the normal force channel in link-local frame: one (3,) for all taxels, or one row per taxel matching probe_local_pos. Default (0, 0, 1).

  • stiffness (float) – Linear spring stiffness (N/m) scaling summed penetration depths into total reported force.

  • shear_coupling (float) – Scales penetration-weighted tangential slip sum_i P_i * v_{t,i} into a shear force contribution (see sensor documentation). Set to 0.0 to disable shear and use only the normal channel.

  • density_scalar (int) – Reference point count for normalizing summed penetrations against tracked cloud size (scale is density_scalar / max(N_pc, 1) for this sensor’s tracked samples).

  • parameters (See SpatialCrosstalkOptionsMixin for the measured-branch spatial crosstalk) –

  • probe_local_pos ((crosstalk_strength / crosstalk_sigma / crosstalk_kernel); a regular planar grid) –

  • it. (is required to enable) –

class genesis.engine.sensors.point_cloud_tactile.ProximityTaxelSensor(options: ProximityTaxel, idx: int, shared_context, shared_metadata, manager: SensorManager)[source]#

Bases: ViscoelasticHysteresisMixin[ProximityTaxelMetadata], SpatialCrosstalkMixin[ProximityTaxelMetadata], PointCloudTactileSensorMixin[ProximityTaxelMetadata], ProbesWithNormalSensorMixin[ProximityTaxelMetadata], RigidSensorMixin[ProximityTaxelMetadata], SimpleSensor[ProximityTaxel, None, ProximityTaxelMetadata, ProximityTaxelReturnType]

Spherical point-cloud taxels: per-taxel force and torque in link-local frame vs tracked meshes.

build()[source]#

Initialize all shared metadata needed to update all noisy sensors.

Time-related state (delays_ts, jitter_ts) is pushed by Sensor.build(); this method adds the imperfection-parameter state.

classmethod reset(shared_metadata: ProximityTaxelMetadata, shared_ground_truth_cache: Tensor, envs_idx)[source]#

Reset the sensor.

This method is called by SensorManager when the scene is reset by scene.reset().

Parameters:
  • shared_metadata (SharedSensorMetadata) – The shared metadata for the sensor class.

  • shared_ground_truth_cache (torch.Tensor) – The shared ground truth cache for the sensor class.

  • envs_idx (array_like) – The indices of the environments to reset. The envs_idx should already be sanitized by SensorManager.

class genesis.engine.sensors.point_cloud_tactile.ProximityTaxelReturnType(force: Tensor, torque: Tensor)[source]#

Bases: NamedTuple

Per-taxel estimates in link-local frame.

force: Tensor#

Alias for field number 0

torque: Tensor#

Alias for field number 1

See also#