Summary

Spec covers remote NatNet commands sent from a client application to the Motive server over a UDP connection. Commands are plain strings, comma-delimited, transmitted via NatNetClient::SendMessageAndWait. The reference Motive server is part of the NaturalPoint OptiTrack motion-capture product line.

Transport

protocols:
  - udp
addressing:
  port: 1510
auth:
  type: none  # inferred: no auth procedure in source

Traits

# No power/routing/level/queryable traits apply at the documented level.
# GetProperty/SetProperty return Int values and could be considered queryable.
- queryable  # inferred: query commands returning values present

Actions

- id: units_to_millimeters
  label: UnitsToMillimeters
  kind: query
  command: "UnitsToMillimeters"
  params: []
- id: frame_rate
  label: FrameRate
  kind: query
  command: "FrameRate"
  params: []
- id: current_mode
  label: CurrentMode
  kind: query
  command: "CurrentMode"
  params: []
- id: start_recording
  label: StartRecording
  kind: action
  command: "StartRecording"
  params: []
- id: stop_recording
  label: StopRecording
  kind: action
  command: "StopRecording"
  params: []
- id: live_mode
  label: LiveMode
  kind: action
  command: "LiveMode"
  params: []
- id: edit_mode
  label: EditMode
  kind: action
  command: "EditMode"
  params: []
- id: timeline_play
  label: TimelinePlay
  kind: action
  command: "TimelinePlay"
  params: []
- id: timeline_stop
  label: TimelineStop
  kind: action
  command: "TimelineStop"
  params: []
- id: set_playback_take_name
  label: SetPlaybackTakeName
  kind: action
  command: "SetPlaybackTakeName,{TakeName}"
  params:
    - name: TakeName
      type: string
      description: Take name
- id: set_record_take_name
  label: SetRecordTakeName
  kind: action
  command: "SetRecordTakeName,{TakeName}"
  params:
    - name: TakeName
      type: string
      description: Take name
- id: set_current_session
  label: SetCurrentSession
  kind: action
  command: "SetCurrentSession,{SessionName}"
  params:
    - name: SessionName
      type: string
      description: Session name (or absolute path)
- id: current_session_path
  label: CurrentSessionPath
  kind: query
  command: "CurrentSessionPath"
  params: []
- id: set_playback_start_frame
  label: SetPlaybackStartFrame
  kind: action
  command: "SetPlaybackStartFrame,{FrameNumber}"
  params:
    - name: FrameNumber
      type: integer
      description: Frame number
- id: set_playback_stop_frame
  label: SetPlaybackStopFrame
  kind: action
  command: "SetPlaybackStopFrame,{FrameNumber}"
  params:
    - name: FrameNumber
      type: integer
      description: Frame number
- id: set_playback_current_frame
  label: SetPlaybackCurrentFrame
  kind: action
  command: "SetPlaybackCurrentFrame,{FrameNumber}"
  params:
    - name: FrameNumber
      type: integer
      description: Frame number
- id: set_playback_looping_enable
  label: SetPlaybackLooping (Enable)
  kind: action
  command: "SetPlaybackLooping"
  params: []
- id: set_playback_looping_disable
  label: SetPlaybackLooping (Disable)
  kind: action
  command: "SetPlaybackLooping, 0"
  params: []
- id: enable_asset
  label: EnableAsset
  kind: action
  command: "EnableAsset,{AssetName}"
  params:
    - name: AssetName
      type: string
      description: Asset name (rigid body / skeleton)
- id: disable_asset
  label: DisableAsset
  kind: action
  command: "DisableAsset,{AssetName}"
  params:
    - name: AssetName
      type: string
      description: Asset name (rigid body / skeleton)
- id: get_property
  label: GetProperty
  kind: query
  command: "GetProperty,{NodeName},{PropertyName}"
  params:
    - name: NodeName
      type: string
      description: Node name (or Streaming ID for rigid bodies)
    - name: PropertyName
      type: string
      description: Property name (must match Motive display name exactly)
- id: set_property
  label: SetProperty
  kind: action
  command: "SetProperty,{NodeName},{PropertyName},{Value}"
  params:
    - name: NodeName
      type: string
      description: Node name (empty if not applicable; "model #[serial]" for cameras)
    - name: PropertyName
      type: string
      description: Property name (must match Motive display name exactly)
    - name: Value
      type: string
      description: Desired property value
- id: get_take_property
  label: GetTakeProperty
  kind: query
  command: "GetTakeProperty,{TakeName},{PropertyName}"
  params:
    - name: TakeName
      type: string
      description: Take name (empty for currently loaded take)
    - name: PropertyName
      type: string
      description: Property name (see Properties: Take)
- id: current_take_length
  label: CurrentTakeLength
  kind: query
  command: "CurrentTakeLength"
  params: []
- id: recalibrate_asset
  label: RecalibrateAsset
  kind: action
  command: "RecalibrateAsset,{AssetName}"
  params:
    - name: AssetName
      type: string
      description: Asset name
- id: reset_asset_orientation
  label: ResetAssetOrientation
  kind: action
  command: "ResetAssetOrientation,{AssetName}"
  params:
    - name: AssetName
      type: string
      description: Asset name
- id: subscribe_to_data
  label: SubscribeToData (Unicast subscription)
  kind: action
  command: "SubscribeToData,{DataType},{All|Asset}"
  params:
    - name: DataType
      type: string
      description: Data type to subscribe to
    - name: Asset
      type: string
      description: "All or specific asset name"
- id: subscribe_by_id
  label: SubscribeByID (Unicast subscription)
  kind: action
  command: "SubscribeByID,{DataType},{ID}"
  params:
    - name: DataType
      type: string
      description: Data type to subscribe to
    - name: ID
      type: integer
      description: Asset ID

Feedbacks

# UNRESOLVED: source describes response handling as raw byte arrays parsed by caller (BitConverter.ToInt32 / ToSingle).
# No structured response schema is documented.
- id: command_op_result
  label: Command Operation Result
  type: integer
  values: []  # UNRESOLVED: documented only as "0 if successful"; no enum values listed
  notes: Returned via the server response buffer; parsed with BitConverter.ToInt32 in SDK samples.
- id: units_to_millimeters
  label: UnitsToMillimeters
  type: float
  values: []
- id: frame_rate
  label: FrameRate
  type: float
  values: []
- id: current_mode
  label: CurrentMode
  type: enum
  values: [live, edit]
  notes: 0 = Live, 1 = Edit
- id: current_session_path
  label: CurrentSessionPath
  type: string
  values: []

Variables

- id: playback_take_name
  label: Playback Take Name
  type: string
- id: record_take_name
  label: Record Take Name
  type: string
- id: current_session
  label: Current Session
  type: string
- id: playback_start_frame
  label: Playback Start Frame
  type: integer
- id: playback_stop_frame
  label: Playback Stop Frame
  type: integer
- id: playback_current_frame
  label: Playback Current Frame
  type: integer
- id: playback_looping
  label: Playback Looping
  type: boolean
  values: [true, false]
- id: playback_take_length
  label: Current Take Length
  type: integer

Events

# UNRESOLVED: source does not document unsolicited notifications.

Macros

# UNRESOLVED: source does not document multi-step sequences.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements.

Notes

  • Source describes SendMessageAndWait(command, tries=10, timeout=20) defaults and SendMessageAndWait(command, 3, 100) sample usage.
  • Source notes subscription commands work with Unicast streaming protocol only (Motive 3.0+).
  • Source notes that beginning with Motive 3.1, eSync 2 access no longer requires the device serial number in the Node name.

Provenance

source_domains:
  - docs.optitrack.com
source_urls:
  - https://docs.optitrack.com/developer-tools/natnet-sdk/natnet-remote-requests-commands
  - https://docs.optitrack.com/developer-tools/natnet-sdk/natnet-4.5
  - https://docs.optitrack.com/developer-tools/natnet-sdk/natnet-class-function-reference
  - https://docs.optitrack.com/motive/data-streaming
  - https://docs.optitrack.com/developer-tools
retrieved_at: 2026-06-29T19:09:57.013Z
last_checked_at: 2026-06-30T07:12:10.143Z

Verification Summary

verdict: verified
checked_at: 2026-06-30T07:12:10.143Z
matched_actions: 28
action_count: 28
confidence: medium
summary: "All 28 spec actions verified against source; transport parameters confirmed; complete bidirectional coverage. (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "discovery/multicast/local-clock parameters not covered; only remote-request commands documented."
- "source describes response handling as raw byte arrays parsed by caller (BitConverter.ToInt32 / ToSingle)."
- "documented only as \"0 if successful\"; no enum values listed"
- "source does not document unsolicited notifications."
- "source does not document multi-step sequences."
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
- "no firmware version compatibility ranges stated; only \"Motive 3.0 or above\" for subscription commands."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0