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) |
Primary AI inputs |
Wire Feed Speed (m/min), Travel Speed (m/s), Arc Length Correction (mm) |
Line Speed (mm/s), Flow Rate (ml/min), Nozzle Pressure (bar) |
Auxiliary measured telemetry |
Wire Speed, Welding Current, Arc Voltage |
Line Speed, Flow Rate, Nozzle Pressure |
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 for the profile’s process and telemetry terms
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. The
reference welding profile points at a committed, trained checkpoint, so its
AI path works out of the box. The spray-coating profile points at
data/models/spray_coating/process_geometry_mlp.pt, which is not
committed - so the spray demo runs the configuration-reuse and
deviation-against-target path rather than an AI-prediction path.
Note
If a profile’s ai.model_path is missing on disk, the engine falls back to whatever
*.pt it can find, which may be another profile’s model with different feature names.
Train and commit a per-profile model to enable the AI path honestly:
poetry run python scripts/train_profile_model.py --profile spray_coating
# writes the configured ai.model_path when it is missing
The same reuse procedure applies when running without a model: the deviation reference falls back to the target geometry instead of an AI prediction (as in the spray-coating profile below).
Creating a New Profile¶
In short: copy config/profiles/welding.yaml, edit the vocabulary, fields,
ros2.topics, skills, ai, and dds sections for your domain, optionally train a
per-profile model, and launch with ROBIN_PROFILE=<name> docker compose up -d.
This page is the canonical reuse procedure - the configurable-vs-welding-specific boundary, the
welding -> spray-coating worked example, telemetry/topic/skill mapping, and the no-model path are
all covered above. See also demo/profiles/README.md for a side-by-side profile comparison.