Workspace Analyzer Configurations#
The Workspace Analyzer Configs module provides a comprehensive configuration system for robotic workspace analysis. This module offers type-safe, well-documented configuration classes that control every aspect of workspace analysis, from sampling strategies to visualization options.
Based on the WorkspaceAnalyzerConfig dataclass and its sub-configurations, this system provides modular, extensible configuration management for all aspects of workspace analysis.
Table of Contents#
Overview#
The configs module enables fine-grained control over:
Sampling Strategies: Control how joint space is sampled
Caching Behavior: Configure result caching and storage
Metric Calculation: Define which metrics to compute and how
Visualization Options: Customize visualization appearance and behavior
Dimensional Constraints: Set workspace bounds and exclusion zones
Key Features#
Type Safety: All configurations use dataclasses with type hints
Validation: Built-in validation and sensible defaults
Extensibility: Easy to extend with custom configuration options
Documentation: Comprehensive docstrings for all parameters
Modularity: Separate configs for different analysis aspects
Configuration Types#
1. Sampling Configuration#
Controls how the robot’s joint space is sampled for workspace analysis.
from embodichain.lab.sim.utility.workspace_analyzer.configs import (
SamplingConfig, SamplingStrategy
)
# Basic uniform sampling
config = SamplingConfig(
strategy=SamplingStrategy.UNIFORM,
num_samples=10000,
grid_resolution=20,
seed=42
)
# Random sampling with larger batch size
random_config = SamplingConfig(
strategy=SamplingStrategy.RANDOM,
num_samples=50000,
batch_size=5000,
seed=123
)
Available Sampling Strategies#
UNIFORM: Uniform grid sampling across joint space
RANDOM: Pseudo-random sampling with specified seed
HALTON: Quasi-random Halton sequence (better coverage)
SOBOL: Quasi-random Sobol sequence (low-discrepancy)
LATIN_HYPERCUBE: Latin Hypercube Sampling (space-filling)
IMPORTANCE: Importance sampling with custom weight function
GAUSSIAN: Gaussian distribution around specified mean
Advanced Sampling Examples#
# Quasi-random sampling for better coverage
halton_config = SamplingConfig(
strategy=SamplingStrategy.HALTON,
num_samples=25000,
batch_size=2500
)
# Gaussian sampling around robot's nominal pose
gaussian_config = SamplingConfig(
strategy=SamplingStrategy.GAUSSIAN,
num_samples=15000,
gaussian_mean=0.0, # Center of joint range
gaussian_std=0.3 # 30% of range as std dev
)
# Importance sampling with custom weight function
def weight_function(joint_values):
# Higher weight for configurations closer to zero
return np.exp(-np.sum(joint_values**2))
importance_config = SamplingConfig(
strategy=SamplingStrategy.IMPORTANCE,
num_samples=20000,
importance_weight_func=weight_function
)
2. Cache Configuration#
Manages caching of analysis results for improved performance.
from embodichain.lab.sim.utility.workspace_analyzer.configs import CacheConfig
from pathlib import Path
# Basic caching configuration
cache_config = CacheConfig(
enabled=True,
cache_dir=Path("./workspace_cache"),
use_hash=True,
compression=True
)
# High-performance caching setup
performance_cache = CacheConfig(
enabled=True,
cache_dir=Path("/fast_storage/workspace_cache"),
use_hash=True,
compression=False, # Faster access, more storage
max_cache_size_mb=5000,
cache_format="npz"
)
Cache Configuration Options#
enabled: Enable/disable caching entirely
cache_dir: Custom cache directory (default: system cache)
use_hash: Hash-based cache keys for consistency
compression: Compress cache files to save space
max_cache_size_mb: Automatic cleanup of old cache files
cache_format: Storage format (‘npz’, ‘pkl’, ‘h5’)
3. Metric Configuration#
Defines which workspace metrics to compute and their parameters.
from embodichain.lab.sim.utility.workspace_analyzer.configs import (
MetricConfig, MetricType, ReachabilityConfig,
ManipulabilityConfig, DensityConfig
)
# Comprehensive metric analysis
metric_config = MetricConfig(
enabled_metrics=[MetricType.ALL],
reachability=ReachabilityConfig(
voxel_size=0.005, # High resolution
min_points_per_voxel=2,
compute_coverage=True
),
manipulability=ManipulabilityConfig(
jacobian_threshold=0.001,
compute_isotropy=True,
compute_heatmap=True
),
density=DensityConfig(
radius=0.03,
k_neighbors=50,
compute_distribution=True
),
save_results=True,
output_format="json"
)
Metric Types#
Reachability Metrics:
Workspace volume calculation
Coverage percentage
Reachable point density
reachability_config = ReachabilityConfig(
voxel_size=0.01, # Voxel resolution for volume
min_points_per_voxel=1, # Occupancy threshold
compute_coverage=True # Coverage vs bounding box
)
Manipulability Metrics:
Manipulability index throughout workspace
Isotropy analysis
Dexterity heatmaps
manipulability_config = ManipulabilityConfig(
jacobian_threshold=0.01, # Minimum valid manipulability
compute_isotropy=True, # Condition number analysis
compute_heatmap=False # Generate spatial heatmap
)
Density Metrics:
Local point density
Distribution statistics
Clustering analysis
density_config = DensityConfig(
radius=0.05, # Local neighborhood radius
k_neighbors=30, # Number of neighbors to consider
compute_distribution=True # Statistical distribution
)
4. Visualization Configuration#
Controls the appearance and behavior of workspace visualizations.
from embodichain.lab.sim.utility.workspace_analyzer.configs import (
VisualizationConfig, VisualizationType
)
# High-quality point cloud visualization
viz_config = VisualizationConfig(
enabled=True,
vis_type=VisualizationType.POINT_CLOUD,
point_size=3.0,
alpha=0.8,
color_by_distance=True,
voxel_size=0.02,
is_voxel_down=True,
show_unreachable_points=True
)
# Sphere visualization for presentations
sphere_viz_config = VisualizationConfig(
vis_type=VisualizationType.SPHERE,
sphere_radius=0.008,
sphere_resolution=15,
alpha=0.6,
show_unreachable_points=False
)
Visualization Options#
vis_type: Visualization method (POINT_CLOUD, VOXEL, SPHERE, MESH, HEATMAP)
point_size: Size of rendered points
alpha: Transparency level (0.0-1.0)
color_by_distance: Color-code by distance from base
voxel_size: Downsampling resolution
show_unreachable_points: Display unreachable regions
5. Dimension Constraints#
Defines workspace bounds, exclusion zones, and physical constraints.
from embodichain.lab.sim.utility.workspace_analyzer.configs import DimensionConstraint
import numpy as np
# Basic workspace bounds
dimension_config = DimensionConstraint(
min_bounds=np.array([-1.0, -1.0, 0.0]), # [x_min, y_min, z_min]
max_bounds=np.array([1.0, 1.0, 2.0]), # [x_max, y_max, z_max]
joint_limits_scale=0.95, # Use 95% of joint range
ground_height=0.0
)
# Complex workspace with exclusion zones
complex_constraints = DimensionConstraint(
min_bounds=np.array([-2.0, -1.5, -0.5]),
max_bounds=np.array([2.0, 1.5, 2.5]),
joint_limits_scale=0.9,
exclude_zones=[
# Obstacle 1: table
(np.array([0.3, -0.5, 0.0]), np.array([1.2, 0.5, 0.8])),
# Obstacle 2: wall
(np.array([1.8, -1.5, 0.0]), np.array([2.0, 1.5, 2.5]))
],
ground_height=-0.1,
enforce_collision_free=True,
self_collision_check=True
)
Constraint Options#
min_bounds/max_bounds: Cartesian workspace limits
joint_limits_scale: Scale factor for joint range usage
exclude_zones: List of forbidden regions
ground_height: Floor level for filtering
enforce_collision_free: Enable collision checking
self_collision_check: Check robot self-collisions
Usage Examples#
Basic Workspace Analysis Setup#
from embodichain.lab.sim.utility.workspace_analyzer.configs import *
# Complete configuration for basic analysis
sampling_config = SamplingConfig(
strategy=SamplingStrategy.UNIFORM,
num_samples=15000,
grid_resolution=25,
batch_size=1500
)
cache_config = CacheConfig(
enabled=True,
compression=True,
max_cache_size_mb=2000
)
metric_config = MetricConfig(
enabled_metrics=[MetricType.REACHABILITY, MetricType.DENSITY],
save_results=True
)
viz_config = VisualizationConfig(
vis_type=VisualizationType.POINT_CLOUD,
point_size=2.5,
color_by_distance=True
)
constraints = DimensionConstraint(
min_bounds=np.array([-1.2, -1.2, 0.0]),
max_bounds=np.array([1.2, 1.2, 1.8]),
joint_limits_scale=0.9
)
High-Performance Configuration#
# Configuration optimized for speed and large datasets
fast_sampling = SamplingConfig(
strategy=SamplingStrategy.HALTON, # Better than random
num_samples=100000, # Large dataset
batch_size=10000, # Large batches
seed=42
)
fast_cache = CacheConfig(
enabled=True,
compression=False, # Faster access
cache_format="npz", # Efficient format
max_cache_size_mb=10000 # Large cache
)
minimal_metrics = MetricConfig(
enabled_metrics=[MetricType.REACHABILITY], # Only essential
reachability=ReachabilityConfig(
voxel_size=0.02, # Lower resolution
compute_coverage=False # Skip expensive computation
),
save_results=False # Don't save to disk
)
efficient_viz = VisualizationConfig(
vis_type=VisualizationType.VOXEL, # Faster than spheres
voxel_size=0.03, # Aggressive downsampling
is_voxel_down=True,
show_unreachable_points=False # Reduce complexity
)
Research Configuration#
# Configuration for detailed research analysis
research_sampling = SamplingConfig(
strategy=SamplingStrategy.SOBOL, # Low-discrepancy sequence
num_samples=50000,
batch_size=2500
)
persistent_cache = CacheConfig(
enabled=True,
cache_dir=Path("./research_cache"),
use_hash=True,
compression=True,
cache_format="h5" # Good for large datasets
)
comprehensive_metrics = MetricConfig(
enabled_metrics=[MetricType.ALL],
reachability=ReachabilityConfig(
voxel_size=0.005, # High resolution
compute_coverage=True
),
manipulability=ManipulabilityConfig(
jacobian_threshold=0.001,
compute_isotropy=True,
compute_heatmap=True # Generate heatmaps
),
density=DensityConfig(
radius=0.02, # Fine-grained density
k_neighbors=50,
compute_distribution=True
),
save_results=True,
output_format="json"
)
publication_viz = VisualizationConfig(
vis_type=VisualizationType.SPHERE,
sphere_radius=0.006,
sphere_resolution=20, # High quality spheres
alpha=0.7,
color_by_distance=True,
show_unreachable_points=True
)
detailed_constraints = DimensionConstraint(
min_bounds=np.array([-1.5, -1.5, -0.2]),
max_bounds=np.array([1.5, 1.5, 2.0]),
joint_limits_scale=1.0, # Full joint range
exclude_zones=[], # No exclusions for research
enforce_collision_free=True,
self_collision_check=True
)
Configuration Composition#
# Create configurations programmatically
def create_analysis_config(
resolution: str = "medium",
enable_cache: bool = True,
visualization_type: str = "point_cloud"
) -> tuple:
"""Create configuration set based on analysis requirements."""
# Resolution-dependent settings
resolution_params = {
"low": {"samples": 5000, "voxel": 0.05, "batch": 1000},
"medium": {"samples": 20000, "voxel": 0.02, "batch": 2000},
"high": {"samples": 80000, "voxel": 0.01, "batch": 5000}
}
params = resolution_params[resolution]
sampling_config = SamplingConfig(
strategy=SamplingStrategy.HALTON,
num_samples=params["samples"],
batch_size=params["batch"]
)
cache_config = CacheConfig(enabled=enable_cache)
viz_config = VisualizationConfig(
vis_type=getattr(VisualizationType, visualization_type.upper()),
voxel_size=params["voxel"]
)
return sampling_config, cache_config, viz_config
# Usage
low_res_configs = create_analysis_config("low", True, "voxel")
high_res_configs = create_analysis_config("high", False, "sphere")
Best Practices#
Configuration Management#
Use Type Hints: Leverage the type safety provided by dataclasses
Validate Parameters: Check parameter ranges before analysis
Document Choices: Comment configuration choices for reproducibility
Version Configs: Save configuration alongside results
Test Different Settings: Experiment with sampling strategies
Performance Optimization#
# Performance tips based on use case
def optimize_for_speed():
return SamplingConfig(
strategy=SamplingStrategy.RANDOM, # Fastest generation
batch_size=10000, # Large batches
num_samples=20000 # Moderate resolution
)
def optimize_for_accuracy():
return SamplingConfig(
strategy=SamplingStrategy.SOBOL, # Better coverage
batch_size=2000, # Moderate batches
num_samples=100000 # High resolution
)
def optimize_for_memory():
return SamplingConfig(
batch_size=500, # Small batches
num_samples=15000 # Moderate total
)
Configuration Validation#
def validate_config(config):
"""Validate configuration parameters."""
if config.num_samples <= 0:
raise ValueError("num_samples must be positive")
if config.batch_size > config.num_samples:
raise ValueError("batch_size cannot exceed num_samples")
if hasattr(config, 'voxel_size') and config.voxel_size <= 0:
raise ValueError("voxel_size must be positive")
# Usage
try:
validate_config(my_config)
except ValueError as e:
print(f"Configuration error: {e}")
API Reference#
SamplingConfig#
Configuration for joint space sampling strategies.
Parameters#
strategy:
SamplingStrategy- Sampling method to usenum_samples:
int- Total number of samples to generate (default: 1000)grid_resolution:
int- Grid resolution for uniform sampling (default: 10)batch_size:
int- Batch size for processing (default: 1000)seed:
int- Random seed for reproducibility (default: 42)importance_weight_func:
Optional[Callable]- Weight function for importance samplinggaussian_mean:
Optional[float]- Mean for Gaussian samplinggaussian_std:
Optional[float]- Standard deviation for Gaussian sampling
CacheConfig#
Configuration for result caching and storage.
CacheConfig Parameters#
enabled:
bool- Enable caching (default: True)cache_dir:
Optional[Path]- Cache directory pathuse_hash:
bool- Use hash-based cache keys (default: True)compression:
bool- Compress cache files (default: True)max_cache_size_mb:
int- Maximum cache size in MB (default: 1000)cache_format:
str- Cache file format: ‘npz’, ‘pkl’, ‘h5’ (default: ‘npz’)
MetricConfig#
Configuration for workspace analysis metrics.
MetricConfig Parameters#
enabled_metrics:
List[MetricType]- List of metrics to computereachability:
ReachabilityConfig- Reachability analysis settingsmanipulability:
ManipulabilityConfig- Manipulability analysis settingsdensity:
DensityConfig- Density analysis settingssave_results:
bool- Save results to file (default: True)output_format:
str- Output format: ‘json’, ‘yaml’, ‘pkl’ (default: ‘json’)
VisualizationConfig#
Configuration for visualization appearance and behavior.
VisualizationConfig Parameters#
enabled:
bool- Enable visualization (default: True)vis_type:
VisualizationType- Visualization type (default: POINT_CLOUD)voxel_size:
float- Voxel downsampling size (default: 0.05)point_size:
float- Point size in visualization (default: 4.0)alpha:
float- Transparency level 0.0-1.0 (default: 0.5)color_by_distance:
bool- Color by distance from base (default: True)sphere_radius:
float- Sphere radius for sphere visualization (default: 0.005)show_unreachable_points:
bool- Show unreachable points (default: False)
DimensionConstraint#
Configuration for workspace bounds and constraints.
DimensionConstraint Parameters#
min_bounds:
Optional[np.ndarray]- Minimum workspace bounds [x, y, z]max_bounds:
Optional[np.ndarray]- Maximum workspace bounds [x, y, z]joint_limits_scale:
float- Joint range scale factor (default: 1.0)exclude_zones:
List[Tuple[np.ndarray, np.ndarray]]- Exclusion zonesground_height:
float- Ground plane height (default: 0.0)enforce_collision_free:
bool- Enable collision checking (default: False)self_collision_check:
bool- Check self-collisions (default: False)
Configuration Examples#
Minimal Configuration#
# Simplest possible configuration
from embodichain.lab.sim.utility.workspace_analyzer.configs import *
config = SamplingConfig() # Uses defaults
# Result: uniform sampling, 1000 samples, grid resolution 10
Production Configuration#
# Production-ready configuration
production_sampling = SamplingConfig(
strategy=SamplingStrategy.HALTON,
num_samples=25000,
batch_size=2500,
seed=42
)
production_cache = CacheConfig(
enabled=True,
cache_dir=Path("/app/cache"),
compression=True,
max_cache_size_mb=5000
)
production_metrics = MetricConfig(
enabled_metrics=[MetricType.REACHABILITY, MetricType.MANIPULABILITY],
save_results=True,
output_format="json"
)
Debug Configuration#
# Configuration for debugging and development
debug_config = SamplingConfig(
strategy=SamplingStrategy.UNIFORM,
num_samples=500, # Small for fast testing
batch_size=100, # Small batches
grid_resolution=8 # Low resolution
)
debug_viz = VisualizationConfig(
vis_type=VisualizationType.POINT_CLOUD,
point_size=5.0, # Large points for visibility
show_unreachable_points=True, # Show all data
alpha=0.9 # High opacity
)