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.