# Action Configuration
This tutorial shows how to configure action spaces and normalization in robomimic, particularly useful for tasks with structured action spaces like robot manipulation.
Note: Understand how to launch training runs first!
Before diving into action configuration, it might be useful to read the following tutorials:
- [how to launch training runs](./configs.html)
- [how to view training results](./viewing_results.html)
#### 1. Overview
Robomimic supports structured action spaces where different action components can be treated differently. This is particularly useful for:
- Robot manipulation tasks with different action components (e.g., end-effector position and rotation)
- Actions that require different normalization schemes
- Combining multiple action outputs with different physical meanings
#### 2. Action Configuration Structure
The action configuration consists of two main components:
1. `action_keys`: List of action components to use
2. `action_config`: Dictionary specifying how each action component should be processed
Here's the basic structure:
```python
config.train.action_keys = ["action/eef_pos", "action/eef_rot"] # order matters!
config.train.action_config = {
"action/eef_pos": {
"normalization": "min_max", # normalize to [-1, 1]
"rot_conversion": None # no rotation conversion
},
"action/eef_rot": {
"normalization": None, # no normalization
"rot_conversion": "axis_angle_to_6d" # convert rotation format
}
}
```
#### 3. Supported Normalization Methods
Robomimic supports several normalization methods for action components:
1. `None`: No normalization
- Uses unit scale and zero offset
- Useful when actions are already in desired range
2. `"min_max"`: Min-max normalization
- Scales actions to range [-1, 1]
- Useful for bounded action components like positions
- Handles numerical stability with small ranges
```python
"normalization": "min_max"
```
3. `"gaussian"`: Gaussian normalization
- Normalizes to zero mean and unit variance
- Useful for unbounded action components
```python
"normalization": "gaussian"
```
#### 4. Example Configurations
Here are some common use cases:
##### 4.1 Robot End-Effector Control
```python
# Configure end-effector position and rotation actions
config.train.action_keys = ["action/eef_pos", "action/eef_rot"]
config.train.action_config = {
"action/eef_pos": {
"normalization": "min_max", # normalize position to [-1, 1]
},
"action/eef_rot": {
"normalization": "gaussian", # normalize rotation with zero mean, unit variance
}
}
```
##### 4.2 Mixed Action Spaces
```python
# Configure position, rotation, and gripper actions
config.train.action_keys = ["action/eef_pos", "action/eef_rot", "action/gripper"]
config.train.action_config = {
"action/eef_pos": {
"normalization": "min_max",
},
"action/eef_rot": {
"normalization": "gaussian",
},
"action/gripper": {
"normalization": None, # gripper already in [-1, 1]
}
}
```
#### 5. Best Practices
1. **Action Component Order**:
- Order in `action_keys` determines concatenation order
- Keep order consistent across training and deployment
- Document the expected order in your configs
2. **Normalization Selection**:
- Use `min_max` for bounded values (e.g., positions, normalized vectors)
- Use `gaussian` for unbounded values or when distribution matters
- Use `None` when values are already properly scaled
3. **Numerical Stability**:
- In `min_max` implementation, ranges smaller than 1e-4 are not scaled
- In `gaussian` implementation, distributions with stddev smaller than 1e-6 are not scaled
4. **Diffusion Policy Compatibility**:
- When using Diffusion Policy, ensure actions are normalized to [-1, 1]
- Use `min_max` normalization or pre-normalize your data
- The policy will check if actions are in the correct range
#### 6. Implementation Details
The normalization process:
1. Computes statistics (min, max, mean, std) across the entire dataset
2. Applies the specified normalization method to each action component
3. Concatenates the normalized components in the order specified by `action_keys`
For `min_max` normalization:
```python
# Normalizes to range [-0.999999, 0.999999] for numerical stability
scale = (input_max - input_min) / (output_max - output_min)
offset = input_min - scale * output_min
normalized_action = (raw_action - offset) / scale
```
For `gaussian` normalization:
```python
# Normalizes to zero mean, unit variance
normalized_action = (raw_action - mean) / (std + epsilon)
```