private void createSceneObjects() { kinectObject.transform.localScale = Vector3.one; kinectObject.transform.localPosition = KinectPosition; kinectObject.transform.eulerAngles = KinectRotation; kinectObject.GetComponent <MeshRenderer>().material = new Material(Shader.Find("Diffuse")); kinectObject.GetComponent <MeshRenderer>().material.color = SensorColor; kinectObject.transform.name = "Kinect ID=" + ID; debugTargetObject = GameObject.CreatePrimitive(PrimitiveType.Sphere); debugTargetObject.transform.parent = kinectObject.transform; setPlayerPosition_FromOrigin(InitPosition); debugTargetObject.GetComponent <MeshRenderer>().material = new Material(Shader.Find("Diffuse")); debugTargetObject.GetComponent <MeshRenderer>().material.color = SensorColor; debugTargetObject.name = "debugTargetObject"; if (simulate) { debugTargetObject.AddComponent <TargetMoveSimulation>(); } KinectReceiver receiver = kinectObject.AddComponent <KinectReceiver>(); receiver.startListening(Port); if (!drawTarget) { debugTargetObject.GetComponent <MeshRenderer>().enabled = false; kinectObject.GetComponent <MeshRenderer>().enabled = false; } }
void Awake() { InputState = InputState.IpAddress; UiVisibility = true; gestureRecognizer = new GestureRecognizer(); kinectReceiver = new KinectReceiver(azureKinectScreenMaterial, azureKinectScreen); // Prepare a GestureRecognizer to recognize taps. gestureRecognizer.Tapped += OnTapped; gestureRecognizer.StartCapturingGestures(); statusText.text = "Waiting for user input."; }
private async void TryConnectToKinectSender(IPEndPoint endPoint) { ++connectingCount; TextToaster.Toast($"Try connecting to a Sender at {endPoint}..."); var random = new System.Random(); int receiverSessionId; while (true) { receiverSessionId = random.Next(); if (kinectReceivers.FirstOrDefault(x => x.ReceiverSessionId == receiverSessionId) == null) { break; } } var kinectReceiver = new KinectReceiver(receiverSessionId, endPoint); kinectReceivers.Add(kinectReceiver); // Nudge the sender until a confirm packet is received. for (int i = 0; i < 5; ++i) { if (kinectReceiver.State != PrepareState.Unprepared) { --connectingCount; return; } udpSocket.Send(PacketHelper.createConnectReceiverPacketBytes(receiverSessionId, true, true), endPoint); print($"Sent connect packet #{i}"); await Task.Delay(300); } // Give up and forget about the connection if a confirm packet has not been received after all the connect packets. if (kinectReceiver.State == PrepareState.Unprepared) { kinectReceivers.Remove(kinectReceiver); } --connectingCount; }
public void Run(KinectReceiver kinectReceiver, int senderSessionId, ConcurrentQueue <VideoSenderPacketData> videoPacketDataQueue, ConcurrentQueue <FecSenderPacketData> fecPacketDataQueue, ConcurrentQueue <AudioSenderPacketData> audioPacketDataQueue) { SocketError error = SocketError.WouldBlock; while (true) { var packet = kinectReceiver.udpSocket.Receive(out error); if (packet == null) { break; } int sessionId = PacketHelper.getSessionIdFromSenderPacketBytes(packet); var packetType = PacketHelper.getPacketTypeFromSenderPacketBytes(packet); if (sessionId != senderSessionId) { continue; } if (packetType == SenderPacketType.Frame) { videoPacketDataQueue.Enqueue(VideoSenderPacketData.Parse(packet)); } else if (packetType == SenderPacketType.Fec) { fecPacketDataQueue.Enqueue(FecSenderPacketData.Parse(packet)); } else if (packetType == SenderPacketType.Audio) { audioPacketDataQueue.Enqueue(AudioSenderPacketData.Parse(packet)); } } if (error != SocketError.WouldBlock) { UnityEngine.Debug.Log($"Error from receiving packets: {error.ToString()}"); } }
public void Run(KinectReceiver kinectReceiver, ConcurrentQueue <AudioSenderPacketData> audioPacketDataQueue) { var audioPacketDataSet = new List <AudioSenderPacketData>(); { AudioSenderPacketData audioPacketData; while (audioPacketDataQueue.TryDequeue(out audioPacketData)) { audioPacketDataSet.Add(audioPacketData); } } audioPacketDataSet.Sort((x, y) => x.frameId.CompareTo(y.frameId)); float[] pcm = new float[KH_SAMPLES_PER_FRAME * KH_CHANNEL_COUNT]; int index = 0; while (kinectReceiver.ringBuffer.FreeSamples >= pcm.Length) { if (index >= audioPacketDataSet.Count) { break; } var audioPacketData = audioPacketDataSet[index++]; if (audioPacketData.frameId <= kinectReceiver.lastAudioFrameId) { continue; } kinectReceiver.audioDecoder.Decode(audioPacketData.opusFrame, pcm, KH_SAMPLES_PER_FRAME); kinectReceiver.ringBuffer.Write(pcm); kinectReceiver.lastAudioFrameId = audioPacketData.frameId; } }
public void Run(KinectReceiver kinectReceiver, ConcurrentQueue <VideoSenderPacketData> videoPacketDataQueue, ConcurrentQueue <FecSenderPacketData> fecPacketDataQueue) { // The logic for XOR FEC packets are almost the same to frame packets. // The operations for XOR FEC packets should happen before the frame packets // so that frame packet can be created with XOR FEC packets when a missing // frame packet is detected. FecSenderPacketData fecSenderPacketData; while (fecPacketDataQueue.TryDequeue(out fecSenderPacketData)) { if (fecSenderPacketData.frameId <= kinectReceiver.lastVideoFrameId) { continue; } if (!fecPacketCollections.ContainsKey(fecSenderPacketData.frameId)) { fecPacketCollections[fecSenderPacketData.frameId] = new FecSenderPacketData[fecSenderPacketData.packetCount]; } fecPacketCollections[fecSenderPacketData.frameId][fecSenderPacketData.packetIndex] = fecSenderPacketData; } VideoSenderPacketData videoSenderPacketData; while (videoPacketDataQueue.TryDequeue(out videoSenderPacketData)) { if (videoSenderPacketData.frameId <= kinectReceiver.lastVideoFrameId) { continue; } // If there is a packet for a new frame, check the previous frames, and if // there is a frame with missing packets, try to create them using xor packets. // If using the xor packets fails, request the sender to retransmit the packets. if (!videoPacketCollections.ContainsKey(videoSenderPacketData.frameId)) { videoPacketCollections[videoSenderPacketData.frameId] = new VideoSenderPacketData[videoSenderPacketData.packetCount]; /////////////////////////////////// // Forward Error Correction Start// /////////////////////////////////// // Request missing packets of the previous frames. foreach (var collectionPair in videoPacketCollections) { if (collectionPair.Key < videoSenderPacketData.frameId) { int missingFrameId = collectionPair.Key; //var missingPacketIndices = collectionPair.Value.GetMissingPacketIds(); var missingPacketIndices = new List <int>(); for (int i = 0; i < collectionPair.Value.Length; ++i) { if (collectionPair.Value[i] == null) { missingPacketIndices.Add(i); } } // Try correction using XOR FEC packets. var fecFailedPacketIndices = new List <int>(); var fecPacketIndices = new List <int>(); // missing_packet_index cannot get error corrected if there is another missing_packet_index // that belongs to the same XOR FEC packet... foreach (int i in missingPacketIndices) { bool found = false; foreach (int j in missingPacketIndices) { if (i == j) { continue; } if ((i / XOR_MAX_GROUP_SIZE) == (j / XOR_MAX_GROUP_SIZE)) { found = true; break; } } if (found) { fecFailedPacketIndices.Add(i); } else { fecPacketIndices.Add(i); } } foreach (int fecPacketIndex in fecPacketIndices) { // Try getting the XOR FEC packet for correction. int xorPacketIndex = fecPacketIndex / XOR_MAX_GROUP_SIZE; if (!fecPacketCollections.ContainsKey(missingFrameId)) { fecFailedPacketIndices.Add(fecPacketIndex); continue; } var fecPacketData = fecPacketCollections[missingFrameId][xorPacketIndex]; // Give up if there is no xor packet yet. if (fecPacketData == null) { fecFailedPacketIndices.Add(fecPacketIndex); continue; } var fecVideoPacketData = new VideoSenderPacketData(); fecVideoPacketData.frameId = missingFrameId; fecVideoPacketData.packetIndex = videoSenderPacketData.packetIndex; fecVideoPacketData.packetCount = videoSenderPacketData.packetCount; fecVideoPacketData.messageData = fecPacketData.bytes; int beginFramePacketIndex = xorPacketIndex * XOR_MAX_GROUP_SIZE; int endFramePacketIndex = Math.Min(beginFramePacketIndex + XOR_MAX_GROUP_SIZE, collectionPair.Value.Length); // Run bitwise XOR with all other packets belonging to the same XOR FEC packet. for (int i = beginFramePacketIndex; i < endFramePacketIndex; ++i) { if (i == fecPacketIndex) { continue; } for (int j = 0; j < fecVideoPacketData.messageData.Length; ++j) { fecVideoPacketData.messageData[j] ^= collectionPair.Value[i].messageData[j]; } } videoPacketCollections[missingFrameId][fecPacketIndex] = fecVideoPacketData; } // end of foreach (int missingPacketIndex in missingPacketIndices) kinectReceiver.udpSocket.Send(PacketHelper.createRequestReceiverPacketBytes(collectionPair.Key, fecFailedPacketIndices)); } } ///////////////////////////////// // Forward Error Correction End// ///////////////////////////////// } // End of if (frame_packet_collections.find(frame_id) == frame_packet_collections.end()) // which was for reacting to a packet for a new frame. videoPacketCollections[videoSenderPacketData.frameId][videoSenderPacketData.packetIndex] = videoSenderPacketData; } // Find all full collections and their frame_ids. var fullFrameIds = new List <int>(); foreach (var collectionPair in videoPacketCollections) { bool full = true; foreach (var packetData in collectionPair.Value) { if (packetData == null) { full = false; break; } } if (full) { int frameId = collectionPair.Key; fullFrameIds.Add(frameId); } } // Extract messages from the full collections. foreach (int fullFrameId in fullFrameIds) { var ms = new MemoryStream(); foreach (var packetData in videoPacketCollections[fullFrameId]) { ms.Write(packetData.messageData, 0, packetData.messageData.Length); } var videoMessageData = VideoSenderMessageData.Parse(ms.ToArray()); kinectReceiver.videoMessageQueue.Enqueue(new Tuple <int, VideoSenderMessageData>(fullFrameId, videoMessageData)); videoPacketCollections.Remove(fullFrameId); } // Clean up frame_packet_collections. var obsoleteFrameIds = new List <int>(); foreach (var collectionPair in videoPacketCollections) { if (collectionPair.Key <= kinectReceiver.lastVideoFrameId) { obsoleteFrameIds.Add(collectionPair.Key); } } foreach (int obsoleteFrameId in obsoleteFrameIds) { videoPacketCollections.Remove(obsoleteFrameId); } }
void Update() { // Sends virtual keyboards strokes to the TextMeshes for the IP address and the port. AbsorbInput(); if (Input.GetKeyDown(KeyCode.Tab)) { if (connectionWindow.ConnectionTarget == ConnectionTarget.Controller) { connectionWindow.ConnectionTarget = ConnectionTarget.Kinect; } else { connectionWindow.ConnectionTarget = ConnectionTarget.Controller; } } if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) { if (connectionWindow.ConnectionTarget == ConnectionTarget.Controller) { TryConnectToController(); } else { StartCoroutine(TryConnectToKinect()); } } // Gives the information of the camera position and floor level. if (Input.GetKeyDown(KeyCode.Space)) { sharedSpaceAnchor.UpdateTransform(cameraTransform.position, cameraTransform.rotation); } if (Input.GetKeyDown(KeyCode.D)) { sharedSpaceAnchor.DebugVisibility = !sharedSpaceAnchor.DebugVisibility; } if (controllerClient != null) { var receiverStates = new List <ReceiverState>(); if (kinectReceiver != null) { var receiverState = new ReceiverState(kinectReceiver.SenderEndPoint.Address.ToString(), kinectReceiver.SenderEndPoint.Port, kinectReceiver.ReceiverSessionId); receiverStates.Add(receiverState); } try { controllerClient.SendViewerState(receiverStates); } catch (TcpSocketException e) { print($"TcpSocketException while connecting: {e}"); controllerClient = null; } } if (kinectReceiver != null) { var senderPacketSet = SenderPacketReceiver.Receive(udpSocket); if (!kinectReceiver.UpdateFrame(udpSocket, senderPacketSet)) { kinectReceiver = null; ConnectWindowVisibility = true; } } }
// To copy the c++ receiver, for easier development, // there should be only one chance to send a ping. private IEnumerator TryConnectToKinect() { if (!ConnectWindowVisibility) { textToaster.Toast("Cannot try connecting to more than one remote machine."); yield break; } ConnectWindowVisibility = false; // The default IP address is 127.0.0.1. string ipAddressText = connectionWindow.IpAddressInputText; if (ipAddressText.Length == 0) { ipAddressText = "127.0.0.1"; } string logString = $"Try connecting to {ipAddressText}..."; textToaster.Toast(logString); statusText.text = logString; var random = new System.Random(); int receiverSessionId = random.Next(); var ipAddress = IPAddress.Parse(ipAddressText); var endPoint = new IPEndPoint(ipAddress, SENDER_PORT); InitSenderPacketData initPacketData; int connectCount = 0; while (true) { udpSocket.Send(PacketHelper.createConnectReceiverPacketBytes(receiverSessionId, true, true, true), endPoint); ++connectCount; print("Sent connect packet"); yield return(new WaitForSeconds(0.3f)); try { var senderPacketSet = SenderPacketReceiver.Receive(udpSocket); if (senderPacketSet.InitPacketDataList.Count > 0) { initPacketData = senderPacketSet.InitPacketDataList[0]; break; } } catch (UdpSocketException e) { print($"UdpSocketException while connecting: {e}"); } if (connectCount == 10) { textToaster.Toast("Tried connected 10 times but failed to receive an init packet...\n"); ConnectWindowVisibility = true; yield break; } } textToaster.Toast("Start creating screen"); if (sharedSpaceAnchor.KinectOrigin == null) { sharedSpaceAnchor.AddKinectOrigin(); } yield return(StartCoroutine(sharedSpaceAnchor.KinectOrigin.Screen.SetupMesh(initPacketData))); sharedSpaceAnchor.KinectOrigin.Speaker.Setup(); kinectReceiver = new KinectReceiver(receiverSessionId, endPoint, sharedSpaceAnchor.KinectOrigin, initPacketData); }