Implementation:Facebookresearch Habitat lab StaticManipulator
| Knowledge Sources | |
|---|---|
| Domains | Embodied_AI, Robot_Control |
| Last Updated | 2026-02-15 00:00 GMT |
Overview
StaticManipulator represents a robot with a fixed base and a controllable arm, extending the Manipulator class to provide a complete fixed-base manipulation agent.
Description
StaticManipulator extends Manipulator to create a robot that has a fixed (non-mobile) base with a controllable arm and gripper. Unlike MobileManipulator, it does not inherit from ArticulatedAgentBase because it has no mobile base to control.
The module defines two components:
- StaticManipulatorParams -- An
@attr.sdata class that configures the static manipulator with:- Arm and gripper joint IDs
- Initial joint parameters for arm and gripper
- End-effector offsets, links, and constraints
- Gripper open/closed states and detection epsilon
- Arm motor position gain, velocity gain, and max impulse
- Optional end-effector count (defaults to 1)
- StaticManipulator -- The robot class that delegates all lifecycle methods (
reconfigure,update,reset) directly to the parentManipulatorclass. This provides a clean, minimal wrapper that ensures fixed-base robots follow the same interface as mobile ones.
Usage
Use StaticManipulator for fixed-base manipulation scenarios where the robot does not need to navigate, such as tabletop manipulation tasks. It is useful for simulating robotic arms that are bolted to a surface.
Code Reference
Source Location
- Repository: Facebookresearch_Habitat_lab
- File: habitat-lab/habitat/articulated_agents/static_manipulator.py
- Lines: 1-102
Signature
@attr.s(auto_attribs=True, slots=True)
class StaticManipulatorParams:
arm_joints: List[int]
gripper_joints: List[int]
arm_init_params: Optional[np.ndarray]
gripper_init_params: Optional[np.ndarray]
ee_offset: List[mn.Vector3]
ee_links: List[int]
ee_constraint: np.ndarray
gripper_closed_state: np.ndarray
gripper_open_state: np.ndarray
gripper_state_eps: float
arm_mtr_pos_gain: float
arm_mtr_vel_gain: float
arm_mtr_max_impulse: float
ee_count: Optional[int] = 1
class StaticManipulator(Manipulator):
def __init__(
self,
params: StaticManipulatorParams,
urdf_path: str,
sim: Simulator,
limit_robo_joints: bool = True,
fixed_base: bool = True,
auto_update_sensor_transform=False,
):
Import
from habitat.articulated_agents.static_manipulator import (
StaticManipulator,
StaticManipulatorParams,
)
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| params | StaticManipulatorParams | Yes | Configuration parameters for the static manipulator |
| urdf_path | str | Yes | Path to the robot's URDF file |
| sim | Simulator | Yes | The Habitat-Sim simulator instance |
| limit_robo_joints | bool | No (default=True) | Whether to enforce joint limits |
| fixed_base | bool | No (default=True) | Whether the robot's base is fixed |
| auto_update_sensor_transform | bool | No (default=False) | Whether to auto-update sensor transforms |
Outputs
| Name | Type | Description |
|---|---|---|
| sim_obj | ManagedBulletArticulatedObject | The underlying simulation object (inherited from Manipulator) |
Usage Examples
Basic Usage
import magnum as mn
import numpy as np
from habitat.articulated_agents.static_manipulator import (
StaticManipulator,
StaticManipulatorParams,
)
# Define parameters for a fixed-base robot arm
params = StaticManipulatorParams(
arm_joints=[0, 1, 2, 3, 4, 5, 6],
gripper_joints=[7, 8],
arm_init_params=np.zeros(7),
gripper_init_params=np.array([0.04, 0.04]),
ee_offset=[mn.Vector3(0.08, 0, 0)],
ee_links=[6],
ee_constraint=np.zeros((1, 2, 7)),
gripper_closed_state=np.array([0.0, 0.0]),
gripper_open_state=np.array([0.04, 0.04]),
gripper_state_eps=0.001,
arm_mtr_pos_gain=0.3,
arm_mtr_vel_gain=0.3,
arm_mtr_max_impulse=10.0,
)
# Create, configure, and use the static manipulator
robot = StaticManipulator(
params=params,
urdf_path="data/robots/panda_arm.urdf",
sim=sim,
fixed_base=True,
)
robot.reconfigure()
robot.reset()