Contact Manager#

Important

It’s recommended to install Genesis Simulator from source, in order to get this bug fix, which affects the contact manager.

The Contact Manager tracks collisions and contacts between your robot and the environment. It’s essential for detecting foot contacts, illegal collisions, and computing contact-based rewards or terminations.

Basic Usage#

from genesis_forge.managers import ContactManager

class MyEnv(ManagedEnvironment):
    def config(self):
        # Detect the body hitting the ground
        self.contact_manager = ContactManager(
            self,
            entity_attr="robot",
            sensor_links=["body"],
            with_entity_attr="terrain"
        )

        # Terminate when the body touches the floor with more than 10N
        TerminationManager(
            self,
            logging_enabled=True,
            term_cfg={
                "body_contact": {
                    "fn": terminations.contact_force,
                    "params": {
                        "threshold": 10.0,
                        "contact_manager": self.contact_manager,
                    },
                },
            },
        )

Foot air-time rewards#

To encourage your robot to take longer steps, use air time tracking and rewards:

self.foot_contact_manager = ContactManager(
    self,
    link_names=[".*_foot"],
    track_air_time=True, # Whether to track the air/contact time of the links
    air_time_contact_threshold=5.0, # How much contact force is considered a step
)

RewardManager(
    self,
    logging_enabled=True,
    cfg={
        "foot_air_time": {
            "weight": 1.0,
            "fn": rewards.feet_air_time,
            "params": {
                "time_threshold": 0.5, # Target air-time, in seconds
                "contact_manager": self.foot_contact_manager,
                "vel_cmd_manager": self.velocity_command, # reduces the penalty if the the velocity command is close to zero
            },
        },
    }
)

Self-contacts#

Penalize or terminate on the robot hitting itself.

class MyEnv(ManagedEnvironment):

    def config(self):
        # Detect the body links colliding with other body liks
        self.contact_manager = ContactManager(
            self,
            entity_attr="robot",
            with_entity_attr="robot"
        )

        RewardManager(
            self,
            cfg={
                "self_contact": {
                    "weight": -1.0,
                    "fn": rewards.contact_force,
                    "params": {
                        "threshold": 1.0, # Only collisions that are above 1.0N
                        "contact_manager": self.self_contact,
                    },
                },
            },
        )

Contact Visualization#

Foot contacts are marked in red

To visualize which contacts are being registered, you can enable debugging, with the debug_visualizer param, and red spheres will appear where the contacts happen.

self.contact_manager = ContactManager(
    self,
    entity_attr="robot",
    sensor_links=["body"],
    with_entity_attr="terrain"
    debug_visualizer=True,
    debug_visualizer_cfg={
        "envs_idx": [0],
    },
)

Caution

This can slow down the simulation since the debug spheres need to be calculated and rendered for each environment on every step.

It’s recommended to only enable them for a small number of environments at a time with the envs_idx configuration setting.