{"id":29638279,"url":"https://github.com/qualisys/qualisys_dotnet_sdk","last_synced_at":"2025-07-21T19:07:20.803Z","repository":{"id":35054997,"uuid":"39187362","full_name":"qualisys/qualisys_dotnet_sdk","owner":"qualisys","description":"C# (.NET) implementation of the real-time protocol for Qualisys Track Manager","archived":false,"fork":false,"pushed_at":"2024-11-22T12:21:23.000Z","size":700,"stargazers_count":8,"open_issues_count":3,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-07T16:31:13.274Z","etag":null,"topics":["c-sharp","dot-net","motion-capture","motion-tracking","position-tracking","qtm","qualisys","realtime"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qualisys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-07-16T09:04:00.000Z","updated_at":"2024-11-22T12:21:27.000Z","dependencies_parsed_at":"2024-06-05T07:46:45.179Z","dependency_job_id":"b37ac72d-255c-413d-a68e-032415601586","html_url":"https://github.com/qualisys/qualisys_dotnet_sdk","commit_stats":null,"previous_names":["qualisys/qualisys_dotnet_sdk","qualisys/rtclientsdk.net"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/qualisys/qualisys_dotnet_sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualisys%2Fqualisys_dotnet_sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualisys%2Fqualisys_dotnet_sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualisys%2Fqualisys_dotnet_sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualisys%2Fqualisys_dotnet_sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qualisys","download_url":"https://codeload.github.com/qualisys/qualisys_dotnet_sdk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualisys%2Fqualisys_dotnet_sdk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266360126,"owners_count":23917356,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","dot-net","motion-capture","motion-tracking","position-tracking","qtm","qualisys","realtime"],"created_at":"2025-07-21T19:07:20.192Z","updated_at":"2025-07-21T19:07:20.789Z","avatar_url":"https://github.com/qualisys.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Qualisys](http://www.qualisys.com) Realtime SDK for .Net\n\nThis is C# package with SDK and examples that can help Qualisys users connect and stream data from [Qualisys Track Manager](http://www.qualisys.com/products/software/qtm) in realtime.\nThis handles all kind of data that QTM can capture. This includes marker data, 6dof objects, user bones, analog, force and gaze vector settings and data.\n\n* Use RTProtocol::DiscoverRTServers to find out which QTM servers that you can connect to on a network.\n* Use RTProtocol::IsConnected method to check if a connection to QTM already exists.\n* Use RTProtocol::Connect method to connect to QTM.\n* Use RTProtocol::StreamFrames to setup streaming from QTM (this lets you decide what to stream).\n* Use RTProtocol::ReceiveRTPacket to get data/event/error packets.\n* Use RTProtocol::StreamFramesStop to stop streaming data.\n* Use RTProtocol::Disconnect to disconnect.\n\nBelow is a c# console application example on how to discover all QTM servers on the network. Connect to localhost, stream 6DOF position+euler+residual data.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing QTMRealTimeSDK;\nusing QTMRealTimeSDK.Data;\n\nnamespace RTSDKExample\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Example example = new Example();\n            example.DiscoverQTMServers(4547);\n            Console.WriteLine(\"Press key to continue\");\n            Console.ReadKey();\n            while (true)\n            {\n                example.HandleStreaming(\"127.0.0.1\");\n                if (Console.KeyAvailable)\n                {\n                    if (Console.ReadKey(false).Key == ConsoleKey.Escape)\n                        break;\n                }\n            }\n        }\n    }\n\n    class Example\n    {\n        RTProtocol rtProtocol = new RTProtocol();\n\n        public List\u003cDiscoveryResponse\u003e DiscoverQTMServers(ushort discoveryPort)\n        {\n            if (rtProtocol.DiscoverRTServers(discoveryPort))\n            {\n                var discoveryResponses = rtProtocol.DiscoveryResponses;\n                foreach (var discoveryResponse in discoveryResponses)\n                {\n                    Console.WriteLine(\"Host:{0,20}\\tIP Address:{1,15}\\tInfo Text:{2,20}\\tCamera count:{3,3}\", discoveryResponse.HostName, discoveryResponse.IpAddress, discoveryResponse.InfoText, discoveryResponse.CameraCount);\n                }\n\n            }\n            return null;\n        }\n\n        ~Example()\n        {\n            if (rtProtocol.IsConnected())\n            {\n                rtProtocol.StreamFramesStop();\n                rtProtocol.Disconnect();\n            }\n        }\n\n        public void HandleStreaming(string ipAddress)\n        {\n            // Check if connection to QTM is possible\n            if (!rtProtocol.IsConnected())\n            {\n                if (!rtProtocol.Connect(ipAddress))\n                {\n                    Console.WriteLine(\"QTM: Trying to connect\");\n                    Thread.Sleep(1000);\n                    return;\n                }\n                Console.WriteLine(\"QTM: Connected\");\n            }\n\n            // Check for available 6DOF data in the stream\n            if (rtProtocol.Settings6DOF == null)\n            {\n                if (!rtProtocol.Get6dSettings())\n                {\n                    Console.WriteLine(\"QTM: Trying to get 6DOF settings\");\n                    Thread.Sleep(500);\n                    return;\n                }\n                Console.WriteLine(\"QTM: 6DOF data available\");\n\n                rtProtocol.StreamAllFrames(QTMRealTimeSDK.Data.ComponentType.Component6dEulerResidual);\n                Console.WriteLine(\"QTM: Starting to stream 6DOF data\");\n                Thread.Sleep(500);\n            }\n\n            // Get RTPacket from stream\n            PacketType packetType;\n            rtProtocol.ReceiveRTPacket(out packetType, false);\n\n            // Handle data packet\n            if (packetType == PacketType.PacketData)\n            {\n                var sixDofData = rtProtocol.GetRTPacket().Get6DOFEulerResidualData();\n                if (sixDofData != null)\n                {\n                    // Print out the available 6DOF data.\n                    for (int body = 0; body \u003c sixDofData.Count; body++)\n                    {\n                        var sixDofBody = sixDofData[body];\n                        var bodySetting = rtProtocol.Settings6DOF.Bodies[body];\n                        if (bodySetting.Enabled)\n                        {\n\t\t\t\t\t\t\tConsole.WriteLine(\"Frame:{0:D5} Body:{1,20} X:{2,7:F1} Y:{3,7:F1} Z:{4,7:F1} First Angle:{5,7:F1} Second Angle:{6,7:F1} Third Angle:{7,7:F1} Residual:{8,7:F1}\",\n\t\t\t\t\t\t\t\trtProtocol.GetRTPacket().Frame,\n\t\t\t\t\t\t\t\tbodySetting.Name,\n\t\t\t\t\t\t\t\tsixDofBody.Position.X, sixDofBody.Position.Y, sixDofBody.Position.Z,\n\t\t\t\t\t\t\t\tsixDofBody.Rotation.First, sixDofBody.Rotation.Second, sixDofBody.Rotation.Third,\n\t\t\t\t\t\t\t\tsixDofBody.Residual);\n\t\t\t\t\t\t}\n                    }\n                }\n            }\n\n            // Handle event packet\n            if (packetType == PacketType.PacketEvent)\n            {\n                // If an event comes from QTM then print it out\n                var qtmEvent = rtProtocol.GetRTPacket().GetEvent();\n                Console.WriteLine(\"{0}\", qtmEvent);\n            }\n        }\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualisys%2Fqualisys_dotnet_sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqualisys%2Fqualisys_dotnet_sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualisys%2Fqualisys_dotnet_sdk/lists"}