Add RoboticsDeviceIntegrationServer + OpenUSD end-to-end (OPC 40010 robot cell) - #16
Merged
Merged
Conversation
…obot cell) A self-contained OPC UA server exposing an OPC 40010 Robotics MotionDeviceSystem (a cell of two 6-axis articulated robots) bound to OpenUSD via the draft OPC UA - OpenUSD Bindings companion model, driven by the SAME generic connector used by the pump sample (no robot-specific bridge code). - Recursive composition: system -Many/Reference-> robots -Many/Child-> axes (15 representations: 1 system + 2 robots + 12 axes). - Per-axis live articulation: each Axis ActualPosition (deg) drives a joint xformOp:rotate on the robot.usda kinematic chain (RenderTargetKind=Rotation). - Emergency-stop safety visuals (Visibility on beacon + per-robot warning), opt-in SpeedOverride command (fail-closed), and a gripper tool composed dynamically on R1's flange via model-change events. - IA + Robotics NodeSets are loaded at runtime (UANodeSet.Read+Import) because their generated NodeState proxies reference base state-machine types absent from this fork's Core; only OpenUsdBinding is source-generated. - RobotOpenUsdE2eTests: 10 passing cases (net10.0); server builds net10.0+net48.
…aming) Serve the artist-authored USD asset closure (root layer + component references) through the OPC UA address space so a generic connector can enumerate, stream, verify, cache, and compose a self-contained local stage with no external asset setup, then live-update as before. Servers that do not expose Assets remain conformant (external resolution). - OpenUsdShared/UsdAssetDelivery.cs: read-only Part 5 FileState serving helper (Open/Read/Close/GetPosition/SetPosition over byte[], bounded handles); AttachStageAssets materializes the stage Assets folder with one OpenUsdAssetType (+ SHA-256 Digest) per served layer. - Pump + Robotics servers: embed their USD assets and serve the stage closure (Plant/pump/remote-pump; Cell/robot/tool). - Connector: OpenUsdConnector.Assets.cs enumerates stage.Assets, streams each layer via Part 5, verifies Digest (fail-closed), and caches with path sanitization; --fetch-assets writes a self-contained stage.usda. - Regenerated OpenUsdBinding NodeSet in both servers' Model/. - e2e: ServedAssetsAreFetchedVerifiedAndCached (pump + robotics).
…et FileType (PR #14 review) Sync the C# reference impl to the updated companion NodeSet: Live-binding split (spec 5.4): - Servers create the concrete binding subtype per intent (retype the <Binding> placeholder child to OpenUsd{Telemetry,Alarm,History,Command} BindingType) and set intent-specific members via the subtype factories; the removed IntentProfile enum is no longer written. - Connector matches the four binding subtype NodeIds and derives the intent from the instance TypeDefinition (was: reading the IntentProfile property); the internal OpenUsdIntentProfile discriminator + downstream logic are kept. Asset content delivery (spec 5.15): OpenUsdAssetType now subtypes Part 5 FileType, so the asset node itself is the file — UsdAssetDelivery wires the read-only Open/Read/Close handlers onto the asset node, and the connector streams each asset directly (no File child). - Regenerated OpenUsdBinding NodeSet copied into both servers' Model/. - Verified: OpenUsd e2e 27/27 (net10.0); bridge + both servers build clean on net10.0 and net48.
…s (PR #14 review) Sync impl to the renamed OpenUsdValueChangeBindingType (was Telemetry) and the now-Mandatory command members: OpenUsdModel + connector use ValueChangeBindingTypeId; both servers default CreateBinding to ObjectTypes.OpenUsdValueChangeBindingType. Copied regenerated NodeSet into both servers' Model/. Verified: OpenUSD e2e 27/27 (net10.0); bridge + both servers build clean on net10.0 + net48.
Code-review audit fixes: - Connector Convert now applies the spec 5.8 conversion offset (target = Scale * converted + Offset); BindingInfo gains Offset, read from the binding node (default 0.0). No behavior change on the examples (offset=0). - Fix stale comments referencing the removed OpenUsdTelemetryBindingType name (-> OpenUsdValueChangeBindingType). - Re-copied the regenerated OpenUsdBinding NodeSet (Model Version 0.2.0) into both servers' Model/. Verified: OpenUSD e2e 27/27 (net10.0); bridge + both servers clean on net10.0 + net48.
OpenUSD: intent-subtype live bindings + server-delivered asset content
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds RoboticsDeviceIntegrationServer + an OpenUSD end-to-end for the OPC 40010 Robotics companion, driven by the same generic connector used by the pump sample (no robot-specific bridge code). Stacked on
openusd-binding(#13).What it adds
MotionDeviceSystem"RobotCell" → two 6-axis articulated robots → 12 axes (15 representations: 1 system + 2 robots + 12 axes) bound to OpenUSD via the draft OPC UA — OpenUSD Bindings model.ActualPosition(deg) drives a jointxformOp:rotateon therobot.usdakinematic chain (RenderTargetKind = Rotation).Visibilityon beacon + per-robot warning), an opt-inSpeedOverridecommand (fail-closed), and a gripper tool composed dynamically on R1's flange via model-change events.RobotOpenUsdE2eTests— 10 passing cases (net10.0): discovery of 15 representations, articulation, robot aggregation, nested axis composition, safety visuals, dynamic tool, command fail-closed/enabled, stage digest.Design note — runtime NodeSet import
The OPC 40010 Robotics model (+ its
IAdependency) is loaded at runtime from embeddedNodeSet2.xmlviaUANodeSet.Read+Import, not source-generated: the Robotics model uses base state-machine/method types whose generated NodeState proxies are not all present in this repo'sOpc.Ua.Core, so the generator's output does not compile for it. Runtime import loads the full, faithful OPC 40010 type structure; the server builds instances fromBaseObjectState+ numeric type NodeIds, so no generated Robotics/IA typed classes are needed. OnlyOpenUsdBindingis source-generated.Validation
PumpDeviceIntegrationBridge→live.usda) composes both robots with independent joint rotations + the dynamic tool + safety visibility.The example USD assets, descriptor, writer, and step-by-step guide live in
marcschier/opcua-draftsundercore-specs/extras/openusd-binding/examples/robotics/(PR #12).