arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

NatNet: Remote Requests/Commands

hashtag
Remote Requests/Commands

The NatNet SDK features sending remote commands/requests from a client application over to a connected server application (i.e. Motive).

The SendMessageAndWait method under NatNetClient class is the core method for sending remote commands. This function takes in a string value of the command and sends it over to the connected Motive server each time it's called, and once the server receives the remote command, corresponding actions will be performed. Please note that only a selected set of commands can be understood by the server, which are listed under the remote commands chart below.

NatNet commands are sent via the UDP connection, 1510 port by default.

circle-info

For a sample use of NatNet commands, refer to the provided .

hashtag
NatNetClient::SendMessageAndWait

Description

Sends a NatNet command to the NatNet server and waits for a response.

Input Parameters:

  • szRequest: NatNet command string, which is one of the commands listed on the below chart. If the command requires input parameters, corresponding parameters should be included in the command with comma delimiters. (e.g. string strCommand = "SetPlaybackTakeName," + TakeName;).

  • tries: Number of attempts to send the command. Default: 10.

  • timeout: Number of milliseconds to wait for a response from the server before the call times out. Default: 20.

Returns:

ErrorCode, On success, it returns 0 or ErrorCode_OK.

hashtag
Remote Commands

Motive Supported NatNet Commands/Requests

Command (string)
Description
Parameters (String)
Returns

hashtag
Subscription Commands

Supported for Motive 3.0 or above.

Subscription commands work with Unicast streaming protocol only. When needed, unicast clients can send subscription commands to receive only specific data types through the data stream. This allows users to minimize the size of streaming packets. For more information, read through the page.

Following is a general format used for the subscription command strings:

  • SubscribeToData,[DataType],[All or specific asset]

  • SubscribeByID,[DataType],[ID]

hashtag
Sample Use

Below is a sample use of the NatNet commands from the application.

Start Recording

Framerate Query

Setting name of the recorded Take

Setting Motive Properties

ppServerResponse: Server response for the remote command. The response format depends on which command is sent out.

  • pResponseSize: Number of bytes in response

  • Requests current mode that Motive is in. Returns 0 if Motive is in Live mode. Returns 1 if Motive is in Edit mode.

    Sample command string:

    none

    int

    StartRecording

    This command initiates recording in Motive

    Sample command string:

    none

    none

    StopRecording

    This command stops recording in Motive

    Sample command string:

    none

    none

    LiveMode

    This command switches Motive to Live mode

    Sample command string:

    none

    none

    EditMode

    This command switches Motive to Edit mode.

    Sample command string:

    none

    None

    TimelinePlay

    Starts playback of a Take that is loaded in Motive

    Sample command string:

    none

    none

    TimelineStop

    Stops playback of the loaded Take

    Sample command string:

    none

    none

    SetPlaybackTakeName

    Set playback take

    Sample command string:

    Take name

    None

    SetRecordTakeName

    Set a take name to record.

    Sample command string:

    Take name

    None

    SetCurrentSession

    Set current session. If the session name already exists, Motive switches to that session. If the session does not exist, Motive will create a new session. You can use absolute paths to define folder locations.

    Sample command string:

    Session name

    None

    CurrentSessionPath

    Gets the unix-style path to the current session folder as a string value, including trailing delimiter.

    Sample command string:

    none

    string

    SetPlaybackStartFrame

    Set start frame

    Sample command string:

    Frame number

    None

    SetPlaybackStopFrame

    Sets stop frame.

    Sample command string:

    Frame number

    None

    SetPlaybackCurrentFrame

    Set current frame

    Sample command string:

    Frame number

    none

    SetPlaybackLooping

    Enable or disable looping in the playback. To disable, zero must be sent along with the command.

    Sample command string:

    none

    none

    EnableAsset

    Enables tracking of corresponding asset (rigid body / skeleton) from Motive

    Sample command string:

    Asset name

    None

    DisableAsset

    Disables tracking of a corresponding asset (rigid body / skeleton) from Motive.

    Sample command string:

    Asset name

    None

    GetProperty

    Queries the server for configured value of a property in Motive. The property name must exactly match the displayed name. This request string must have the following inputs along with the command, each of them separated by a comma.

    • Node name

    • Property name

    Sample command string:

    • Node name (if applicable)

    • Property name

    int

    SetProperty

    Requests Motive to configure specified properties. The property name must exactly match the respective name of setting displayed in Motive. Please refer to the page for the list of properties. Master Rate can be used for controlling the frame rate of the camera system. For configuring camera settings remotely, use the "model #[serial]" string format.

    Sample command string:

    For rigid body assets, Streaming ID of rigid bodies can be used in place of the stringNodeName. For example, string command for enabling rigid body with streaming ID of 3 would be:

    eSync:2:

    Accessing the eSync 2 requires '#' to be included at the beginning of the eSync 2's serial number. If the '#' is not present, it will make the eSync 2 inaccessible. ie. GetProperty, eSync 2 #ES002005, Source Value

    • Node name. (Leave it empty if not applicable.)

    • Property name

    • Desired value

    int

    GetTakeProperty

    Request property of a Take. You can query property of a specific Take by entering the name, or enter empty string to query the currently loaded take. Most of the properties available in the can be queried through this command.

    Sample command string:

    • Take Name. Leave empty for currently loaded take.

    • Name of the property. See .

    Depends on the property type.

    CurrentTakeLength

    Request length of current take.

    Sample command string:

    None

    int

    RecalibrateAsset

    Recalibrates the asset. Returns integer indicating if command was successful. Zero if successful. Sample command string:

    Asset Name

    int

    ResetAssetOrientation

    Reorients the asset. Returns integer indicating if command was successful. Zero if successful. Sample command string:

    Asset Name

    int

    UnitsToMillimeters

    Sending this command requests current system’s measurement units, in terms of millimeters.

    Sample command string:

    none

    float

    FrameRate

    Queries for the tracking framerate of the system. Returns a float value representing the system framerate.

    Sample command string:

    none

    float

    CurrentMode

    WinFormSample
    remote commands
    NatNet: Unicast Data Subscription Commands
    WinFormsSamplearrow-up-right
    ErrorCode	SendMessageAndWait( const char* szRequest,
    				    void** ppServerResponse, 
    					int* pResponseSize );
    ErrorCode	SendMessageAndWait( const char* szRequest,
    				    int tries, int timeout, 
    				    void** ppServerResponse,
    				    int* pResponseSize );
    string command = "LiveMode";
    string command = "UnitsToMillimeters";
    string command = "FrameRate";
    private void RecordButton_Click(object sender, EventArgs e)
    {
    	string command = "StartRecording";
    
    	int nBytes = 0;
    	byte[] response = new byte[10000];
    	int rc = m_NatNet.SendMessageAndWait(command, 3, 100, out response, out nBytes);
    	if (rc != 0)
    	{
    		OutputMessage(command + " not handled by server");
    	}
    	else
    	{
    		int opResult = System.BitConverter.ToInt32(response, 0);
    		if (opResult == 0)
    			OutputMessage(command + " handled and succeeded.");
    		else
    			OutputMessage(command + " handled but failed.");
    	}
    }
    // [NatNet] [optional] Query mocap server for the current camera framerate
    int nBytes = 0;
    byte[] response = new byte[10000];
    int rc;
    rc = m_NatNet.SendMessageAndWait("FrameRate", out response, out nBytes);
    
    if (rc == 0)
    {
        try
        {
            m_ServerFramerate = BitConverter.ToSingle(response, 0);
            OutputMessage(String.Format("   Camera Framerate: {0}", m_ServerFramerate));
        }
        catch (System.Exception ex)
        {
            OutputMessage(ex.Message);
        }
    }
    private void SetRecordingTakeButton_Click(object sender, EventArgs e)
    {
        int nBytes = 0;
        byte[] response = new byte[10000];
        String strCommand = "SetRecordTakeName," + RecordingTakeNameText.Text;
        int rc = m_NatNet.SendMessageAndWait(strCommand, out response, out nBytes);
    }
    private void SetPropertyButton_Click(object sender, EventArgs e)
    {
        int nBytes = 0;
        byte[] response = new byte[10000];
        string command = "SetProperty," + NodeNameText.Text + "," + PropertyNameText.Text + "," + PropertyValueText.Text;
        int rc = m_NatNet.SendMessageAndWait(command, out response, out nBytes);
        if (rc != 0)
        {
             OutputMessage(command + " not handled by server");
         }
        else
        {
            int opResult = System.BitConverter.ToInt32(response, 0);
            if (opResult == 0)
                OutputMessage(command + " handled and succeeded.");
            else
                OutputMessage(command + " handled but failed.");
        }
    }
    For rigid body assets, Streaming ID of rigid bodies can be used in place of the stringNodeName. For example, string command for getting name of a rigid body with streaming ID of 3 would be:

    eSync:2:

    Accessing the eSync 2 requires '#' to be included at the beginning of the eSync 2's serial number. If the '#' is not present, it will make the eSync 2 inaccessible. ie. GetProperty, eSync 2 #ES002005, Source Value

    Properties panearrow-up-right
    Properties: Takearrow-up-right
    Properties: Takearrow-up-right
    string command = "CurrentMode";
    string command = "StartRecording";
    string command = "StopRecording";
    string command = "LiveMode";
    string command = "EditMode";
    string command = "TimelinePlay";
    string command = "TimelineStop";
    string command = "SetPlaybackTakeName," + stringTakeName;
    string command = "SetRecordTakeName," + stringTakeName;
    string command = "SetCurrentSession," + stringSessionName;</source><source>string command = "SetCurrentSession," + "c:/folder"
    string folder = "CurrentSessionPath";
    string command = "SetPlaybackStartFrame," + stringFrameNumber;
    string command = "SetPlaybackStopFrame," + stringFrameNumber;
    string command = "SetPlaybackCurrentFrame," + stringFrameNumber;
    string enablelooping = "SetPlaybackLooping"; 
    
    string disablelooping = "SetPlaybackLooping, 0";
    string command = "EnableAsset," + stringNodeName;
    string command = "DisableAsset," + stringNodeName;
    string command = "GetProperty," + stringNodeName + "," + stringPropertyName;
    string command = "SetProperty," + stringNodeName + "," + stringPropertyName + "," + stringPropertyValue;
    //Sets the frame rate of the camera system to 180FPS.
    string command = "SetProperty,Master Rate,180";
    // Sets the gain on camera #13003 to 2.
    "SetProperty," + "Prime 13 #13003", + "," + "Gain" + "," + "2";
    string command = "SetProperty," + "3"+ "," + "Enable" + "," + "True";
    string command = "GetTakeProperty," + takeName + "," + propertyName;
    //Querying for EndFrame number on the currently loaded take. string command = "GetTakeProperty,,End Frame";
    string command = "CurrentTakeLength";
    string command = "RecalibrateAsset";
    string command = "ResetAssetOrientation";
    string command = "GetProperty," + "3"+ "," + "Name";