Design

HCDF describes a cyber-physical system as one coordinated model. Its structural layer covers rigid components, kinematic joints, geometry, sensors, actuators, and planning metadata. Its connectivity layer describes what each component can exchange, how that capability appears in physical hardware, and which system-level networks use it. The same vocabulary covers data, electrical power, guided and radiated signals, liquids, and gases.

These layers are related by explicit references rather than collapsed into one overloaded connector or network object. That separation lets an early design state that two controllers communicate without inventing a harness, while a manufacturing description can identify every pin, conductor, mating connector, and visible model part.


One model, four views

ViewPrimary elementsQuestion answered
Structural comp, joint, frame, group, state What are the rigid bodies, coordinate frames, and degrees of freedom?
Functional port, channel, component functions What can a component send, receive, supply, or consume?
Physical connectors, positions, assemblies, paths, junctions, terminations, antennas What physical hardware carries the exchange?
Connectivity binding, mate, topologies, configurations, stream profiles How do the functional and physical views form a connected system?

A reference may point through included component instances, so reusable modules keep their own internal names while a larger system connects specific instances. Names remain local to the objects that own them, and typed references make the relationship explicit.


Structure and embodiment

A <comp> is a rigid body or hardware assembly. It can carry inertial properties, visual and collision shapes, frames, ports, connectors, antennas, sensors, motors, software identity, and other component-local details. A <joint> connects a parent component to a child component and supplies the kinematic origin, axes, limits, dynamics, mimic behavior, and optional loop-closure semantics.

The ten joint types are revolute, continuous, prismatic, fixed, ball, universal, planar, screw, cylindrical, and free. Loop-closing joints represent parallel mechanisms without pretending that every joint is a tree edge. Joint groups, named states, and self-collision exclusions provide planning and control metadata in the same document.

<joint name="j_crank" type="revolute">
  <description>Driven crank pivot on the ground link (the input; drive this to move the mechanism).</description>
  <parent comp="ground"/>
  <child comp="crank"/>
  <origin xyz="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-1.0472" upper="1.0472" effort="20" velocity="3"/>
</joint>

Functional ports and channels

A port is the functional boundary of a component. Its capabilities state the purposes, carriers, profiles, and engineering ranges that the component supports. A channel subdivides a port into named signal or flow roles, such as CAN high and CAN low, supply and return, UART receive and transmit, or the individual phases of a power connection.

Purpose answers why an exchange exists. Carrier answers what physically conveys it. Capabilities may advertise alternatives; a network's required selected element chooses one purpose and one carrier for that network instance.

DimensionSchema valuesExamples
Purpose communication, power-delivery, material-transfer CAN data, a DC supply, hydraulic fluid, cooling gas, or fuel
Carrier electrical, guided-optical, conducted-rf, radiated-rf, liquid, gas Copper, fiber, coax, free-space RF, liquid lines, and gas lines

Capability ranges can describe rate, voltage, current, power, impedance, frequency, bandwidth, pressure, flow, and temperature. Profile identifiers remain extensible, so CAN, UART, PWM, RS-485, Ethernet variants, BDSHOT, servo buses, and organization-specific protocols can share the same core grammar without becoming hard-coded schema types.

<port name="can">
  <capabilities>
    <purpose value="communication"/>
    <carrier value="electrical"/>
    <profile id="hcdf:can"/>
    <rate min="1000000" max="1000000" nominal="1000000" unit="bit/s"/>
  </capabilities>
  <channel name="can_h" role="hcdf:can-high"/>
  <channel name="can_l" role="hcdf:can-low"/>
</port>

Connectors and physical positions

A connector names a physical interface and may identify its family. Its positions use vocabulary that matches the thing being represented. Each position can carry a role, a local grouping label, and an optional visible representation.

PositionUse
pinA projecting electrical or signal contact.
socketA receiving electrical or signal contact.
contactA conductive contact that is not usefully classified as a pin or socket.
fiberAn optical fiber position or optical termination.
passageA liquid or gas opening.
feedA conducted feed into an antenna or RF structure.
waveguide-openingThe physical aperture of a waveguide connection.

Connector shells and their positions can point at complete models or named model parts. This makes a connector and its pins selectable in a viewer while preserving the existing visual asset as the source of geometry.

<connector name="can_connector" family="hcdf:jst-gh-2">
  <pin name="1" role="hcdf:can-high">
    <representation>
      <model-part node-path="dm8009p/jst_gh_2/jst_gh_2_p1" submesh-fallback="jst_gh_2_p1">
        <model-root><component-visual component="base_j1_stator" visual="motor_case_connectors"/></model-root>
      </model-part>
    </representation>
  </pin>
  <pin name="2" role="hcdf:can-low">
    <representation>
      <model-part node-path="dm8009p/jst_gh_2/jst_gh_2_p2" submesh-fallback="jst_gh_2_p2">
        <model-root><component-visual component="base_j1_stator" visual="motor_case_connectors"/></model-root>
      </model-part>
    </representation>
  </pin>
  <representation>
    <model-part node-path="dm8009p/jst_gh_2/jst_gh_2_shell" submesh-fallback="jst_gh_2_shell">
      <model-root><component-visual component="base_j1_stator" visual="motor_case_connectors"/></model-root>
    </model-part>
  </representation>
</connector>

Assemblies, paths, junctions, terminations, and mates

Root-level harness, cable, plumbing, and umbilical elements group physical connectivity into manufactured or routed assemblies. An assembly can own connectors, paths, junctions, terminations, and one representation. The same physical primitives can also appear inside a component when they are integral to that component.

ConstructSchema elementsMeaning
Two-ended paths wire, conductor, cable-member, fiber, coax, waveguide, feed, hose, pipe, passage A physical carrier between exactly two physical endpoints.
Junctions splice, tee, manifold, busbar, optical-splitter A physical joining point with one or more attachments.
Terminations termination A typed endpoint, inline device, branch, or closure with optional engineering quantities and a profile.
Mates mate A connection between two connector references, with optional position-to-position mappings.

Termination mounting is one of endpoint, inline, branch, or closure. A CAN termination resistor, an optical termination, a hydraulic valve, and a sealed cap can therefore be described by the same structural pattern without pretending they are the same kind of hardware.


Bindings and fidelity

A binding connects one functional endpoint, a port or channel, to one physical endpoint, a connector, position, or junction. It answers questions such as which connector pin carries CAN high without forcing that pin assignment into the functional port definition.

FidelityMeaning
functionalThe relationship is known at the functional level; physical presentation may be absent.
presentedThe physical boundary is shown, but exact internal positions or routing may not be known.
exactThe declared endpoint, position, route, or mapping is exact for the described design.
quantifiedThe physical statement includes the engineering detail needed for analysis.

The same fidelity values are used by bindings, paths, junctions, terminations, and mates. This lets a document mix high-level declarations with manufacturing detail while stating the precision of each claim.

<binding name="can_h_to_jst_gh_2_pin_1" fidelity="exact">
  <functional><channel-ref component="base_j1_stator" port="can" channel="can_h"/></functional>
  <physical><position-ref connector="can_connector" position="1"><component-ref component="base_j1_stator"/></position-ref></physical>
</binding>

Physical representations and antennas

Connectivity objects use a focused representation vocabulary: box, cylinder, sphere, model, model-part, and derived-route. A model part selects a node path in an existing component visual or assembly model. A derived route uses at least two waypoints and may define a round or rectangular section, which allows a viewer to draw wires, hoses, pipes, and waveguides without a separate mesh.

RF keeps conducted and radiated interfaces distinct. A port with conducted-rf describes a feed, coax, waveguide, or PCB launch. A port with radiated-rf describes the free-space boundary. An antenna requires a radiated port, may reference a conducted port, and may carry a representation of the radiator. Radiated ports can participate in links, buses, stars, meshes, or other topology objects just like ports using a wired carrier. This also covers short-gap millimeter-wave links across a moving joint.

<port name="wifi0-feed">
  <capabilities>
    <purpose value="communication"/>
    <carrier value="conducted-rf"/>
    <frequency min="5150000000" max="5850000000" nominal="5500000000" unit="Hz"/>
  </capabilities>
</port>
<antenna name="wifi0">
  <conducted-port component="compute" port="wifi0-feed"/>
  <radiated-port component="compute" port="wifi0"/>
</antenna>

Network topologies

HCDF has seven root-level topology objects. Every topology owns its participants and selection, and topology-specific objects add coordinators, hops, legs, or roots. They are direct children of the HCDF document, not members of a separate container.

TopologyRequired shapeTypical use
linkExactly 2 participantsPoint-to-point wired, optical, RF, power, or fluid connection
busAt least 2 participantsCAN, RS-485, multidrop serial, shared power, or a shared material line
chainAt least 2 participants, 2 hops, and 1 legDaisy chains and switched paths
starA coordinator reference and at least 2 participantsHub, switch, manifold, or coordinator-centered network
ringAt least 3 participants, 3 hops, and 3 legsClosed paths and redundant rings
meshAt least 2 participantsWireless or logical mesh membership
treeA root hop, at least 2 participants, 2 hops, and 1 legBranched switched, power, optical, or fluid distribution

A participant names a functional endpoint. A hop identifies a component or component function that processes or forwards the carrier. A leg joins hop and participant references, so route shape is explicit when the chosen topology needs it.

Selection, configuration, and stream profiles

ConstructScopeContents
selected Required on every topology The active purpose and carrier, plus optional profile, rate, electrical, RF, pressure, flow, or temperature selections.
configuration Optional and owned by one topology gPTP domains, traffic classes, gate schedules, schedule assignments, PLCA, MACsec, and Energy Efficient Ethernet settings.
stream-profile A separate root-level resource reference A URI, optional SHA, optional required flag, and optional selection role for a stream-profile document containing streams, talkers, listeners, paths, traffic and schedule references, and optional FRER policy.

Selection describes what the physical network is operating as. Configuration describes how that topology is controlled. A stream profile describes traffic demand and routing separately, so multiple traffic plans can target the same network description.

<chain name="test-chain">
  <description>Two-hop switched communication chain with timing, scheduling, MACsec, and EEE configuration.</description>
  <selected purpose="communication" carrier="electrical"><rate><nominal value="100000000" unit="bit/s"/></rate></selected>
  <configuration>
    <gptp-domain name="time" number="0">
      <clock name="parent-clock" kind="ordinary" gm-capable="true" priority1="128" priority2="128"><participant-ref network="test-chain" participant="parent-body"/></clock>
      <clock name="board-clock" kind="ordinary" gm-capable="false" priority1="255" priority2="255"><participant-ref network="test-chain" participant="test-board"/></clock>
      <port-defaults log-sync-interval="-3" neighbor-prop-delay-threshold-ns="800"/>
    </gptp-domain>
    <traffic-class name="ptp" number="7" preemption="express"><pcp value="7"/></traffic-class>
    <traffic-class name="safety" number="6" preemption="express"><pcp value="6"/></traffic-class>
    <traffic-class name="motion" number="5" preemption="express"><pcp value="5"/></traffic-class>
    <traffic-class name="bulk" number="0" preemption="preemptable"><pcp value="0"/></traffic-class>
    <gate-schedule name="1ms-control" cycle-time-ns="1000000">
      <gate duration-ns="50000"><open><traffic-class-ref network="test-chain" traffic-class="ptp"/></open></gate>
      <gate duration-ns="200000"><open><traffic-class-ref network="test-chain" traffic-class="safety"/><traffic-class-ref network="test-chain" traffic-class="motion"/></open></gate>
      <gate duration-ns="750000"><open><traffic-class-ref network="test-chain" traffic-class="bulk"/></open></gate>
    </gate-schedule>
    <schedule-assignment name="chain-participants"><schedule-ref network="test-chain" schedule="1ms-control"/><target><participant-ref network="test-chain" participant="parent-body"/></target><target><participant-ref network="test-chain" participant="test-board"/></target></schedule-assignment>
    <macsec><policy name="secure" enforcement="must-secure" cipher="ieee:gcm-aes-128" key-agreement="vendor:psk" credential-store-ref="se051"/><default-policy><macsec-policy-ref network="test-chain" policy="secure"/></default-policy></macsec>
    <eee default-mode="disabled"/>
  </configuration>
  <participant name="parent-body"><endpoint><port-ref component="parent-body" port="eth0"/></endpoint></participant>
  <participant name="test-board"><endpoint><port-ref component="test-board" port="eth0"/></endpoint></participant>
  <hop name="parent-body" role="root"><owner><component-ref component="parent-body"/></owner></hop>
  <hop name="test-board" role="tail"><owner><function-ref component="test-board" function="test-switch"/></owner></hop>
  <leg name="parent-to-board"><from><hop-ref network="test-chain" hop="parent-body"/><participant-ref network="test-chain" participant="parent-body"/></from><to><hop-ref network="test-chain" hop="test-board"/><participant-ref network="test-chain" participant="test-board"/></to></leg>
</chain>
<stream-profile uri="profiles/operational.streams.xml" selection-role="default"/>

Visuals, color, collision, and contact

A visual has one of two appearance sources. A high-fidelity visual uses a GLB or glTF model, with an optional SHA and optional submesh or exclude-submesh selectors. It may include a primitive geometry fallback for load failure. A primitive visual instead uses one of box, cylinder, sphere, capsule, cone, or ellipsoid, with an optional inline or named color.

Collision geometry supports the same six primitives plus a lean external mesh. Contact physics belongs directly under the collision's surface, which can hold friction, restitution, and contact stiffness and damping. A frustum is general sensor field-of-view geometry, not a visual or collision solid. There is no general material element: rich appearance stays in GLB or glTF, flat appearance uses color, and contact behavior stays on collision.

<visual name="board">
  <pose xyz="0 0 0" rpy="0 0 0"/>
  <model uri="models/test-board.glb" sha="abc123def456"/>
</visual>

<collision name="board_col">
  <pose xyz="0 0 -0.005" rpy="0 0 0"/>
  <geometry>
    <box><size>0.048 0.044 0.012</size></box>
  </geometry>
  <surface>
    <friction static="0.6" dynamic="0.4"/>
    <restitution>0.2</restitution>
  </surface>
</collision>

Sensors

A sensor is a named component-local container that can hold measurement blocks from twelve categories. The categories describe measurement domains rather than product names.

CategoryExamples
inertialAccelerometers, gyroscopes, and combined IMUs
emMagnetometers, Hall-effect sensors, fluxgates, and other near-field electromagnetic sensing
opticalCameras, thermal imagers, lidar, time-of-flight, and optical flow
rfGNSS, UWB, radar, and radio altimeters
chemicalGas, pH, humidity, and related chemical measurements
forcePressure, strain, torque, and load cells
encoderIncremental, absolute, and linear position encoders
temperatureThermistors, RTDs, thermocouples, and infrared temperature sensing
radiationGeiger, scintillation, neutron, and dosimetry sensors
audioMicrophones, ultrasonic sensors, sonar, and hydrophones
tactileCapacitive, resistive, piezoelectric, barometric, and optical-gel touch sensors
fluidBarometers, airspeed, depth, flow, level, and pressure-reference sensors

Sensor-specific blocks carry the parameters relevant to their domain, including poses, drivers, ranges, resolution, noise, bandwidth, sampling, field of view, and output characteristics where the corresponding type defines them.

<sensor name="imu0" update-rate="1000">
  <inertial type="accel_gyro">
    <pose xyz="0.016 -0.001 -0.008" rpy="0 0 0"/>
    <driver name="icm45686">
      <axis-align x="Y" y="-X" z="Z"/>
    </driver>
    <accel>
      <range unit="g">16</range>
      <resolution unit="mg">0.488</resolution>
      <noise type="gaussian">
        <mean>0</mean>
        <stddev>0.003</stddev>
        <bias-mean>0.01</bias-mean>
      </noise>
    </accel>
    <gyro>
      <range unit="dps">2000</range>
      <noise type="gaussian">
        <stddev>0.01</stddev>
      </noise>
    </gyro>
  </inertial>
</sensor>

Extensions

Extensions use a reverse-DNS domain and may declare their own version. Extension payloads are deliberately open to domain schemas while the HCDF core remains typed. The repository ships schemas for these four extension domains:

DomainPurpose
org.ros2ROS 2 sensor and motor topic mappings with message types and QoS presets
org.ros2.controlROS 2 control hardware, joint, sensor, and command/state interface mapping
org.gazebosimGazebo-specific simulation settings and plugins
org.ieee.1722IEEE 1722 stream and transport details

Other domains may be used without changing the core schema. The IMU Stability page is an illustrative extension design, not one of the shipped typed extension schemas.


Conversion and interoperability

The current Rust implementation imports and exports both URDF and SDF. It reports losses where a target format cannot represent HCDF content, and its URDF profile distinguishes clean round-trip cases from transformed or lossy projections. Xacro input is expanded by the pure-Rust xacro engine and then imported through the URDF path. These paths are available to native and WebAssembly consumers; Python access is provided through the Rust bindings.

PathStatus
URDF → HCDFImplemented
HCDF → URDFImplemented, with profile classification and a loss manifest
SDF → HCDFImplemented for the mapped mechanical and simulation overlap
HCDF → SDFImplemented, with a loss manifest for unsupported HCDF content
Xacro → HCDFImplemented through pure-Rust expansion and URDF import
HCDF and OpenUSDPlanned, not currently implemented

HCDF is the richer source model in these conversions. A successful export does not imply that networking, power, firmware, or every simulation-specific field exists in the destination format; the reported losses are part of the conversion result.


Versioning and content integrity

The current core schema is HCDF 1.0. The root name is required. The version value follows a MAJOR.MINOR pattern and defaults to 1.0 when omitted. The version string identifies the document grammar; it is not a cryptographic identity for the schema bytes.

Strict XSD validation rejects unknown elements and attributes in the typed core. Extension payloads are the intentional open area and use lax processing. Tooling can bind the canonical XSD by its SHA-256 content hash, independently of the document's version string.

Hash attributes on referenced resources, including models, includes, connectivity models, and stream profiles, are optional. When present they provide integrity for that reference. They do not imply that every external resource in an HCDF document is hashed or that the entire document has been verified.