
Productive Robotics
Weld Recipe System
Architected a YAML-based weld recipe system with 14 stock recipes (500.yaml through 513.yaml) covering 4 welding processes (GMAW, FCAW, GMAW-P, FCAW-P), each containing 50+ configurable parameters. Built a recipe migration framework that runs on every welding node startup to handle version upgrades, and diagnosed a critical bug where migrate_recipe() unconditionally zeroed wire_speed for tack recipes on every reboot.
Designed the YAML recipe schema defining 50+ parameters per recipe: wire_speed (inches per minute), voltage (volts), gas_type and gas_mixture (percentage blends for Ar/CO2/He), process_type (GMAW, FCAW, GMAW-P, FCAW-P), arc_start_parameters (hot-start current, run-in speed, pre-flow duration), arc_end_parameters (crater fill time, burnback time, post-flow duration), and weave parameters (amplitude, frequency, dwell left/right, pattern type). The 14 stock recipes (files 500.yaml through 513.yaml) provide factory-default configurations for common material/thickness/process combinations — mild steel MIG at various thicknesses, stainless steel with tri-mix gas, flux core for outdoor work without shielding gas. Each recipe also carries DeltaWeld-specific constraints: memory slot assignments, synergic line selections, and wire diameter locks that map to the physical welder's internal configuration registers.
Built a recipe migration framework that executes automatically on every welding ROS node startup. The migrator reads each recipe file, checks its schema_version field, and applies sequential migration functions (v1_to_v2, v2_to_v3, etc.) to bring it up to the current version. Migrations handle structural changes — adding new parameter groups (weave parameters were added in v2, DeltaWeld constraints in v3), renaming fields (e.g., gas_flow_rate to gas_flow_cfh for unit clarity), and setting defaults for newly introduced fields. The migrator writes the updated recipe back to disk only if changes were made, preserving YAML comments and formatting where possible.
Diagnosed a critical production bug where tack weld recipes (short positioning welds used to hold parts in place before the main weld pass) would lose their wire_speed setting after every robot reboot. Root cause: the migrate_recipe() function contained a conditional block intended to set wire_speed to zero for recipes that used voltage-controlled synergic mode (where the welder auto-calculates wire speed from voltage). However, the condition checked recipe.get('is_tack', False) instead of recipe.get('synergic_mode', False) — meaning every tack recipe had its wire speed zeroed on every startup, regardless of whether it used synergic mode. The fix was a one-line conditional change, but finding it required tracing through the full startup sequence: roslaunch → welding node __init__ → load_recipes() → migrate_recipe() → the offending conditional.