Domain Profiles¶
ROBIN is domain-agnostic. The same stack works for welding, spray coating, machining, or any robotic manufacturing process. Switching domains is a single environment variable - no code changes, no rebuild.
Switching Profiles¶
ROBIN_PROFILE=spray_coating docker compose up -d
The Alert Engine loads the new profile at startup. The dashboard fetches it at
runtime via GET /profile, so labels, units, and AI config update
automatically.
Default profile: welding.
Profile Comparison¶
Concept |
Welding (default) |
Spray Coating |
|---|---|---|
Process name |
Weld |
Coat Job |
Height metric |
Bead Height (mm) |
Coating Thickness (mm) |
Width metric |
Bead Width (mm) |
Coverage Width (mm) |
Speed |
Wire Speed (m/min) |
Line Speed (mm/s) |
Current / Flow |
Current (A) |
Flow Rate (ml/min) |
Voltage / Pressure |
Voltage (V) |
Pressure (bar) |
AI default mode |
parameter_driven |
geometry_driven |
Canonical Profile Demos¶
Run the robust dual-mode demos directly from profile scripts. Each script
will create the process, configure AI expectations, then wait for you to
press Start from the dashboard before streaming data (pass --no-prompt
to skip the wait):
# Welding (default profile)
python demo/profiles/welding_profile.py --mode both --duration 120 --interval 2
# -> select the process in the dashboard and press Start
# Spray coating profile
ROBIN_PROFILE=spray_coating docker compose up -d
python demo/profiles/spray_coating_profile.py --mode both --duration 120 --interval 2
# -> select the process in the dashboard and press Start
How Profiles Work¶
graph TD
subgraph profiles ["config/profiles/"]
W["welding.yaml"]
S["spray_coating.yaml"]
end
ENV["ROBIN_PROFILE\nenv var"] -->|selects| LOADER["ProfileLoader"]
W --> LOADER
S --> LOADER
LOADER -->|"vocabulary\n+ skills"| ENDPOINT["GET /profile"]
LOADER -->|"model_path"| AILOAD["Load AI\ncheckpoint"]
LOADER -->|"feature_order\n+ tolerance"| DEV["Deviation\ndetection"]
ENDPOINT -->|"runtime fetch"| DASH["Dashboard renders\ndomain labels"]
Profile files live in config/profiles/ and are plain YAML. A profile
contains:
vocabulary - dashboard labels (process, speed, current, voltage, etc.)
fields - telemetry field display names and units
ros2.topics - ROS 2 topic names for geometry, process parameters, pose
skills - robot capabilities (service/action names, types, descriptions)
ai - feature order, model path, default tolerance, default mode, inverse bounds, and inverse-optimizer settings
dds - DDS bridge topic mapping
See config/profiles/welding.yaml for a complete example.
Per-Profile AI Models¶
Each profile specifies its model checkpoint in the ai.model_path field:
data/models/welding/process_geometry_mlp.ptdata/models/spray_coating/process_geometry_mlp.pt
Train new models with:
python scripts/train_profile_model.py
Creating a New Profile¶
Copy an existing profile YAML:
cp config/profiles/welding.yaml config/profiles/machining.yaml
Edit vocabulary, fields, ROS 2 topics, skills, and AI config to match the new domain.
Train a model for the new profile:
ROBIN_PROFILE=machining python scripts/train_profile_model.py
Launch with the new profile:
ROBIN_PROFILE=machining docker compose up -d
See demo/profiles/README.md for a detailed comparison and step-by-step
instructions.