Vicon C Sharp
<< Back to the Vicon Toolkit page
Download Vicon Toolkit
Vicon RealTime Data: How to access/use the Vicon data stream.
As a prerequisite please see the Vicon Real Time tutorial.
The first step is to open a socket connection and send a request for EInfo
//create a new client socket ... m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); String szIPSelected = txtIPAddress.Text; String szPort = txtPort.Text; int alPort = System.Convert.ToInt16 (szPort,10); System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected); System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort); m_socClient.Connect(remoteEndPoint); byte[] sendBytes = new byte[8]; sendBytes[0] = (byte) ClientCodes.EPacket.EInfo; for (int i = 1; i < 8; ++i) { sendBytes[i] = 0; } int sentBytes = m_socClient.Send(sendBytes);
The next step is to obtain the real time data by recieving packets though the same socket.
//send request for vicon Data byte[] sendBytes = new byte[8]; sendBytes[0] = (byte)ClientCodes.EPacket.EData; for (int i = 1; i < 8; ++i) { sendBytes[i] = 0; } int sentBytes = m_socClient.Send(sendBytes); //Now receive the vicon data byte[] buffer = new byte[4]; int iRx = m_socClient.Receive(buffer); int packet = System.BitConverter.ToInt32(buffer, 0); iRx = m_socClient.Receive(buffer); int type = System.BitConverter.ToInt32(buffer, 0); if (type != (int)ClientCodes.EType.EReply) { throw new SocketException(); } if (packet != (int)ClientCodes.EPacket.EData){ throw new SocketException(); } iRx = m_socClient.Receive(buffer); int size = System.BitConverter.ToInt32(buffer, 0); if (size != iViconInfoSize){ throw new SocketException(); } buffer = new byte[8]; iRx = m_socClient.Receive(buffer); double value = System.BitConverter.ToDouble(buffer, 0); txtData.Text = "Frame " + value + "\r\n"; foreach (ViconChannel v in viconArray) { if (v.Type == ChannelType.Marker) { iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.PX = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.PY = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.PZ = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); if (value > 0.5) v.Visible = false; else v.Visible = true; txtData.Text += v.ParentName + ":" + v.Name + " " + v.Visible.ToString() + " " + v.PX + " " + v.PY + " " + v.PZ + "\r\n"; } else if (v.Type == ChannelType.Body) { iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.AX = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.AY = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.AZ = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.TX = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.TY = value; iRx = m_socClient.Receive(buffer); value = System.BitConverter.ToDouble(buffer, 0); v.TZ = value; v.ComputeEulerAngles(); txtData.Text += v.ParentName + ":" + v.Name + " " + v.TX + " " + v.TY + " " + v.TZ + " " + v.AX + " " + v.AY + " " + v.AZ + "\r\n"; } }