ROS 2 and Vulcanexus Interface Reference ======================================== This page is the central ROS 2/Vulcanexus interface reference for ``open-robin``. The workspace is the **hardware-agnostic open module**: an intent-driven welding demo that runs on synthetic data with no physical hardware, MoveIt, or Gazebo. The package names below are the current source of truth for the documentation and validation commands you will use when integrating the modules. Runtime Baseline ---------------- .. list-table:: :header-rows: 1 :widths: 24 36 40 * - Item - Current value - Evidence * - ROS 2 distribution - Jazzy - ``vulcanexus_ws/ws_setup.sh`` sources ``/opt/vulcanexus/jazzy/setup.bash``. * - Vulcanexus base image - ``eprosima/vulcanexus:jazzy-desktop-4.3.1`` - ``vulcanexus_ws/Dockerfile``. * - ROS workspace - ``/workspace/ros2_packages`` - Mounted from ``vulcanexus_ws/src`` by ``docker-compose.yaml``. * - Compose service - ``vulcanexus`` / container ``vulcanexus-bridge`` - ``docker-compose.yaml``. * - Primary setup entry point - ``source /workspace/ros2_packages/ws_setup.sh`` - Used by the launch and validation commands below. * - FIWARE DDS mapping file - ``config-dds.json`` - Mounted into Orion-LD as ``/root/.orionld``. DDS discovery requires Orion-LD and the ROS 2 publishers to use the same DDS domain. The checked-in DDS mapping file uses domain ``0``, and both Compose services (``orion-ld`` and ``vulcanexus``) set ``ROS_DOMAIN_ID=0`` so Orion-LD discovers ``/robin/telemetry`` out of the box. If you change one, change all three. The FIWARE mapping details are documented in ``docs/reference/fiware_ngsi_ld_dds_mapping.rst``. Package Inventory ----------------- .. list-table:: :header-rows: 1 :widths: 26 74 * - Package - Role * - ``welding_msgs`` - Intent message and skill action definitions for the intent pipeline. * - ``welding_http_bridge`` - HTTP / NGSI-LD (Orion-LD) to ROS 2 bridge; publishes ``/intents``. * - ``welding_supervisor`` - Intent-to-skill mission controller; routes ``/intents`` to skill actions. * - ``welding_home_skill`` - Lifecycle skill: move the arm to home (simulation by default). * - ``welding_seam_skill`` - Lifecycle skill: execute a weld seam and publish ``ProcessTelemetry``. * - ``welding_manual_skill`` - Lifecycle skill: adjust process parameters (clamped to safe ranges). * - ``welding_recommendation_skill`` - Lifecycle skill: request AI welding parameters over HTTP. * - ``welding_demo`` - Launch orchestrator; ``welding_robin_sim.launch.py`` is the no-hardware demo. * - ``robin_interfaces`` - Generic ROBIN ROS 2 messages, services, and actions (telemetry schema + the richer set used by hardware-mode integrations). * - ``robin_telemetry`` - ROS bag telemetry aggregator; combines recorded Fronius/geometry topics into ``ProcessTelemetry`` on ``/robin/telemetry``. * - ``robin_description`` - Hardware-agnostic URDF/xacro and meshes for the cell (UR10e + Fronius torch + Garmo profilometer + table). No nodes. Package Layer Diagram --------------------- .. mermaid:: graph TD UI["ROBIN Dashboard"] API["Process Intelligence API"] ORION["Orion-LD / NGSI-LD"] HTTP["welding_http_bridge"] INTENT["/intents
welding_msgs/msg/Intent"] SUP["welding_supervisor"] SKILLS["welding_* skill action servers"] HW["hardware-mode backends
(adopter-provided)"] TEL["/robin/telemetry
robin_interfaces/msg/ProcessTelemetry"] MINTAKA["Mintaka / TROE history"] UI --> API API --> ORION ORION --> HTTP UI --> HTTP HTTP --> INTENT INTENT --> SUP SUP --> SKILLS SKILLS -. "use_simulation:=false" .-> HW SKILLS --> TEL TEL --> ORION ORION --> MINTAKA MINTAKA --> API Nodes and Executables --------------------- .. list-table:: :header-rows: 1 :widths: 24 24 52 * - Package - Executable or node - Main interface / purpose * - ``welding_http_bridge`` - ``welding_http_bridge`` - HTTP server on ``:8766`` (``/intent``, Orion notifications); publishes ``/intents``. * - ``welding_supervisor`` - ``welding_supervisor`` - Subscribes ``/intents``; routes to skill action servers; publishes ``/doe/launch`` and ``/weld_errors``; calls ``weld/pause``. * - ``welding_home_skill`` - ``welding_home_skill`` - Action ``welding_home_skill/execute`` (``MoveToHome``); owns ``/joint_states`` in simulation. * - ``welding_seam_skill`` - ``welding_seam_skill`` - Action ``welding_seam_skill/execute`` (``ExecuteSeam``); publishes ``/robin/telemetry``; hosts ``weld/pause``. * - ``welding_manual_skill`` - ``welding_manual_skill`` - Action ``welding_manual_skill/execute`` (``ManualAdjust``); hardware mode calls ``/fronius/set_*``. * - ``welding_recommendation_skill`` - ``welding_recommendation_skill`` - Action ``welding_recommendation_skill/execute`` (``RequestAIRecommendation``); HTTP to ``ROBIN_API_URL``. * - ``robin_telemetry`` - ``telemetry_aggregator`` - Aggregates recorded ``/robin/data/fronius`` and ``/robin/weld_dimensions`` into ``/robin/telemetry`` for the ROS bag replay demo. The skills run in simulation by default. A ``use_simulation:=false`` hardware mode delegates to generic interfaces (``/move_home``, ``/execute_bead``, ``/fronius/set_*``) that an adopter implements for their own robot and power source. Messages -------- ``welding_msgs/msg`` ~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 26 74 * - Message - Purpose * - ``Intent`` - Intent bus message: type, JSON data, source, modality, priority, confidence. ``robin_interfaces/msg`` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 26 74 * - Message - Purpose * - ``ProcessTelemetry`` - DDS/FIWARE telemetry snapshot: bead ID, progression, height, width, speed, current, voltage, and cross-sectional area. * - ``BeadGeometry`` / ``WeldProgression`` / ``WelderData`` / ``ActiveBead`` - Weld geometry, progression, and welder data. * - ``ExperimentBead`` / ``ExperimentBeadSpec`` / ``PlateLayout`` / ``WeldPlate`` - Experiment and plate definitions. Actions ------- .. list-table:: :header-rows: 1 :widths: 30 26 44 * - Action - Package - Goal * - ``ExecuteSeam`` - ``welding_msgs`` - Cartesian weld-seam goal (seam_id, weld_speed, wire_feed_rate). * - ``MoveToHome`` - ``welding_msgs`` - Home the arm (use_fast_speed). * - ``ManualAdjust`` - ``welding_msgs`` - Adjust a process parameter (name, value, unit). * - ``RequestAIRecommendation`` - ``welding_msgs`` - Request AI welding parameters (process_id, mode). * - ``ExecuteBead`` / ``WeldExperiment`` - ``robin_interfaces`` - Bead / experiment execution targets for hardware-mode integrations. Services -------- ``robin_interfaces`` provides the generic typed setters and calibration/planning services used by hardware-mode integrations, including ``SetFloat32`` / ``SetInt32`` (typed setters, e.g. ``/fronius/set_*``), ``SetCtwd``, ``SetTcpMode``, ``FindSurface``, ``CalibrateWireTip``, ``CalibratePlatePlane``, ``StartWeld``, ``PlanExperiment``, ``ApproveExperimentPlan``, ``ReserveSlots``, and ``ClearReservedSlots``. The supervisor and seam skill use ``weld/pause`` (``std_srvs/SetBool``). Core Topics ----------- .. list-table:: :header-rows: 1 :widths: 30 30 40 * - Topic - Type - Role * - ``/intents`` - ``welding_msgs/msg/Intent`` - Operator/dashboard intents into the supervisor. * - ``/robin/telemetry`` - ``robin_interfaces/msg/ProcessTelemetry`` - Normalized telemetry to the Orion-LD DDS bridge. * - ``/joint_states`` / ``/joint_states_manual`` - ``sensor_msgs/msg/JointState`` - Arm pose (home skill owns ``/joint_states``; seam skill animates via ``/joint_states_manual``). * - ``/doe/launch`` / ``/weld_errors`` - ``std_msgs/msg/String`` - DOE launch notifications and operator-visible errors. ROS 2 to FIWARE Data Path ------------------------- The reusable telemetry integration path is: ``ROS 2 source -> /robin/telemetry -> Orion-LD DDS -> NGSI-LD Process entity -> TROE/Mintaka history -> API/dashboard``. In the no-hardware demo ``welding_seam_skill`` publishes synthetic ``robin_interfaces/msg/ProcessTelemetry`` on ``/robin/telemetry``; ``config-dds.json`` maps DDS topic ``rt/robin/telemetry`` to NGSI-LD entity ``urn:ngsi-ld:Process:ros_bridge`` with attribute ``urn:robin:processTelemetry``. For a real process, publish the same message from a node fed by your robot/sensor topics. Dashboard and API Actions Back to ROS 2 --------------------------------------- The human input path is: ``dashboard/API action -> pendingIntent in Orion-LD or direct HTTP -> welding_http_bridge -> /intents -> welding_supervisor -> welding_* skill action server``. ``welding_http_bridge`` supports two entry points: * ``POST /intent`` for direct testing or dashboard fallback. * Orion-LD subscription notifications when ``pendingIntent`` changes on Process entities. ``welding_supervisor`` consumes ``/intents`` and routes the message to the appropriate skill action server. The ROS4HRI/ROS4RI role, intent, skill, task, and mission mapping is documented in ``docs/reference/ros4hri_ros4ri_alignment.rst``. Validation Commands ------------------- These commands are intended for a Linux Docker environment with the ``vulcanexus`` container running. Build the workspace: .. code-block:: console $ docker compose up -d vulcanexus $ docker exec vulcanexus-bridge bash -lc \ 'cd /workspace/ros2_packages && source ws_setup.sh && colcon build --symlink-install' List current packages: .. code-block:: console $ docker exec vulcanexus-bridge bash -lc \ 'source /workspace/ros2_packages/ws_setup.sh && ros2 pkg list | grep -E "^(robin_|welding_)" | sort' Expected package names: .. code-block:: text robin_description robin_interfaces robin_telemetry welding_demo welding_home_skill welding_http_bridge welding_manual_skill welding_msgs welding_recommendation_skill welding_seam_skill welding_supervisor Inspect key interfaces: .. code-block:: console $ docker exec vulcanexus-bridge bash -lc \ 'source /workspace/ros2_packages/ws_setup.sh && ros2 interface show robin_interfaces/msg/ProcessTelemetry' $ docker exec vulcanexus-bridge bash -lc \ 'source /workspace/ros2_packages/ws_setup.sh && ros2 interface show welding_msgs/msg/Intent' Run the no-hardware intent path: .. code-block:: console $ docker exec vulcanexus-bridge bash -lc \ 'source /workspace/ros2_packages/ws_setup.sh && ros2 launch welding_demo welding_robin_sim.launch.py' In a second terminal: .. code-block:: console $ curl -s -X POST http://localhost:8766/intent \ -H 'Content-Type: application/json' \ -d '{"intent": "START_PROCESS", "data": {"seam_id": "seam_01"}}' {"status": "published", "intent": "START_PROCESS"} Validate the DDS topic is visible after a telemetry publisher is active: .. code-block:: console $ docker exec vulcanexus-bridge bash -lc \ 'source /workspace/ros2_packages/ws_setup.sh && ros2 topic list | grep /robin/telemetry' Runtime Assumptions and Limits ------------------------------ * The source-level package and interface inventory can be inspected on any platform. Full ROS 2 runtime validation is expected on Linux with Docker and the Vulcanexus image. * The intent/skill path uses simulation behavior by default; no physical hardware, MoveIt, or Gazebo is required. * Driving real hardware requires adopter-provided nodes that advertise the skills' hardware-mode interfaces (``/move_home``, ``/execute_bead``, ``/fronius/set_*``), launched with ``use_simulation:=false``. * DDS/FIWARE validation depends on aligned ROS/DDS domain IDs and host networking behavior. If Orion-LD does not discover ``/robin/telemetry``, check ``ROS_DOMAIN_ID`` in both Compose services and ``config-dds.json``.