diff --git a/Assets/HybridIK/Scripts/Main/IKDataTypes.cs b/Assets/HybridIK/Scripts/Main/IKDataTypes.cs deleted file mode 100644 index 439f86e..0000000 --- a/Assets/HybridIK/Scripts/Main/IKDataTypes.cs +++ /dev/null @@ -1,20 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; - -[System.Serializable] -public class IKData -{ - public string robotId; - public Vector3 position; - public List nodesPosition; - public List nodesRotation; - public float deltaTime; -} - -[System.Serializable] -public class IKDataListWrapper -{ - public string robotId; - public List keyFrameList; - //public List nodesList; -} \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/IKDataTypes.cs.meta b/Assets/HybridIK/Scripts/Main/IKDataTypes.cs.meta deleted file mode 100644 index 4e7eef0..0000000 --- a/Assets/HybridIK/Scripts/Main/IKDataTypes.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1073b77c68490294db77f64de40d82cd \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/MqttManager.cs b/Assets/HybridIK/Scripts/Main/MqttManager.cs deleted file mode 100644 index 0931d98..0000000 --- a/Assets/HybridIK/Scripts/Main/MqttManager.cs +++ /dev/null @@ -1,136 +0,0 @@ -using UnityEngine; -using uPLibrary.Networking.M2Mqtt; -using uPLibrary.Networking.M2Mqtt.Messages; -using System; -using System.Text; -using System.Collections.Generic; -using System.Collections.Concurrent; - -public class MqttManager : MonoBehaviour -{ - public static MqttManager Instance { get; private set; } - - [Header("MQTT Broker Settings")] - [SerializeField] private string brokerAddress = "localhost"; - [SerializeField] private int brokerPort = 1883; - - [Header("Robot Config")] - [SerializeField] private TextAsset robotIDconfig; - [SerializeField] private TextAsset robotActionTopics; - - private MqttClient client; - - public static event Action OnMessageReceived; - private readonly ConcurrentQueue> receivedMessages = new ConcurrentQueue>(); - - List topicList=new List(); - - private void Awake() - { - // ½Ì±ÛÅæ ÀνºÅϽº ¼³Á¤ - if (Instance == null) - { - Instance = this; - DontDestroyOnLoad(gameObject); - } - else - { - Destroy(gameObject); - } - } - - void Start() - { - ConnectToBroker(); - } - - private void Update() - { - // ¸Å ÇÁ·¹ÀÓ¸¶´Ù Å¥¿¡ ½×ÀÎ ¸Þ½ÃÁö°¡ ÀÖ´ÂÁö È®ÀÎ - while (receivedMessages.TryDequeue(out var messageItem)) - { - // ¸ÞÀÎ ½º·¹µå¿¡¼­ ¾ÈÀüÇÏ°Ô À̺¥Æ®¸¦ ¹ß»ý½ÃÅ´ - OnMessageReceived?.Invoke(messageItem.Item1, messageItem.Item2); - } - } - - - private void ConnectToBroker() - { - if (client != null && client.IsConnected) - { - Debug.LogWarning("Already connected to MQTT Broker"); - return; - } - try - { - client = new MqttClient(brokerAddress, brokerPort, false, null, null, MqttSslProtocols.None); - client.MqttMsgPublishReceived += OnMqttMessageReceived; - - string clientId = Guid.NewGuid().ToString(); - client.Connect(clientId); - - if (client.IsConnected) - { - Debug.Log("Connected to MQTT Broker"); - SetSubscribeTopics(); - } - } - catch (Exception e) - { - Debug.LogError($"Failed to connect to MQTT Broker: {e.Message}"); - } - } - - // º°µµÀÇ ½º·¹µå¿¡¼­ ½ÇÇàµÊ (MqttManager´Â ¹é±×¶ó¿îµå¿¡¼­ ³×Æ®¿öÅ© ¸Þ½ÃÁö ¹ÞÀ½) -> ¸Þ½ÃÁö Å¥ ¹æ½Ä »ç¿ë - private void OnMqttMessageReceived(object sender, MqttMsgPublishEventArgs e) - { - string message = Encoding.UTF8.GetString(e.Message); - receivedMessages.Enqueue(new Tuple(e.Topic, message)); - } - - public void PublishMessage(string topic, string message) - { - if (string.IsNullOrEmpty(topic)) - { - Debug.LogError("MQTT Publish Canceled: Topic is null or empty!"); - return; - } - - if (client == null || !client.IsConnected) return; - byte[] messageBytes = Encoding.UTF8.GetBytes(message); - client.Publish(topic, messageBytes, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); - } - - void SetSubscribeTopics() - { - var topics = JsonUtility.FromJson(robotIDconfig.text); - var actions = JsonUtility.FromJson(robotActionTopics.text); - - topicList.Add($"robots/{topics.ID}/{actions.Topic1}"); - topicList.Add($"robots/{topics.ID}/{actions.Topic2}"); - SubscribeToTopics(topicList.ToArray()); - } - - public void SubscribeToTopics(string[] topics) - { - if (client == null || !client.IsConnected || topics == null) return; - byte[] qosLevels = new byte[topics.Length]; - for (int i = 0; i < topics.Length; i++) - { - qosLevels[i] = MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE; - } - - client.Subscribe(topics, qosLevels); - Debug.Log($"ÅäÇÈ ±¸µ¶ ½ÃÀÛ: {string.Join(", ",topics)}"); - } - - private void OnDestroy() - { - if (client != null && client.IsConnected) - { - client.Disconnect(); - Debug.Log("Disconnected from MQTT Broker"); - } - } -} \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/MqttManager.cs.meta b/Assets/HybridIK/Scripts/Main/MqttManager.cs.meta deleted file mode 100644 index 25a9e4e..0000000 --- a/Assets/HybridIK/Scripts/Main/MqttManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5491d87c5326c7640be51aa08dba16a7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: -200 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs b/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs deleted file mode 100644 index 107f4d4..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -[Serializable] -public class RobotActionTopics -{ - public string Topic1; - public string Topic2; -} diff --git a/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs.meta b/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs.meta deleted file mode 100644 index 46f5771..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotActionTopics.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 8e59e2e5a53eb5846a7c7ac4b9995c16 \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/RobotController.cs b/Assets/HybridIK/Scripts/Main/RobotController.cs index a11e6cf..3775b75 100644 --- a/Assets/HybridIK/Scripts/Main/RobotController.cs +++ b/Assets/HybridIK/Scripts/Main/RobotController.cs @@ -4,9 +4,6 @@ using System; public class RobotController : MonoBehaviour { - public string robotId = "robot1"; // ·Îº¿ ID - public bool isLocallyControlled = false; // ·ÎÄÿ¡¼­ Á¦¾î ¿©ºÎ - [Header("Motor State")] [SerializeField] private GameObject motorStatusIndicator1; [SerializeField] private GameObject motorStatusIndicator2; @@ -14,7 +11,7 @@ public class RobotController : MonoBehaviour [SerializeField] private Material indicatorMaterial1; // ±âº»»ö(ȸ»ö) [SerializeField] private Material indicatorMaterial2; // ÃÊ·Ï - private bool isMotorOn = false; + private bool isMotorOn; void Start() { @@ -26,14 +23,8 @@ public class RobotController : MonoBehaviour { motorStatusIndicator2.GetComponent().material = indicatorMaterial1; } - - SetMotorState(false); } - /// - /// ·Îº¿ÀÇ ¸ðÅÍ »óÅ ¼³Á¤ (³ªÁß¿¡ UI¿¡¼­ È£ÃâÇÒ ÇÔ¼ö) - /// - /// ¸ðÅ͸¦ ÄÓÁö ¿©ºÎ public void SetMotorState(bool isOn) { isMotorOn = isOn; diff --git a/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs b/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs deleted file mode 100644 index 3086fcc..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System; - -[Serializable] -public class RobotIDConfig -{ - public string ID; -} diff --git a/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs.meta b/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs.meta deleted file mode 100644 index 8fffa69..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotIDConfig.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 7d96c46e3e183d44bbc30211a6e9821d \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/RobotManager.cs b/Assets/HybridIK/Scripts/Main/RobotManager.cs deleted file mode 100644 index 0657453..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotManager.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class RobotManager : MonoBehaviour -{ - public static RobotManager Instance { get; private set; } - - UIManager uiManager => UIManager.Instance; - - [Header("MQTT Settings")] - [SerializeField] private MqttManager mqttManager; - - [Header("Robot Config")] - [SerializeField] private TextAsset robotIDconfig; - [SerializeField] private TextAsset robotActionTopics; - [SerializeField] private HybridInverseKinematicsNode hybridIKNode; - - [Header("UI Settings")] - [Tooltip("°¢ ·Îº¿¿¡ ´ëÇØ »ý¼ºÇÒ UI ÇÁ¸®ÆÕ")] - [SerializeField] private GameObject robotUIPrefab; - [Tooltip("»ý¼ºµÈ UIµéÀÌ À§Ä¡ÇÒ ºÎ¸ð Canvas")] - [SerializeField] private Transform uiParentCanvas; - - // --- MQTT Topic °ü¸® --- - private RobotIDConfig idConfigData; - private RobotActionTopics actionTopicsData; - - // --- ·Îº¿ °ü¸® --- - private readonly Dictionary robotRegistry = new Dictionary();// ·Îº¿ ID¸¦ Ű·Î ÇÏ¿© °ü¸® - private string targetRobotId; // ÇöÀç Á¶ÀÛ ÁßÀÎ ·Îº¿ ID (°¡»ó = Çö½Ç) - private Dictionary robotUIs = new Dictionary(); - - // --- ·Îº¿ ¼±Åà ¹× ±â·Ï °ü¸® --- - private RobotController selectedRobot; // ÇöÀç ¼±ÅÃµÈ ·Îº¿ - private Transform RecordingHandleTarget; // Handle(Àâ´Â ºÎºÐ)ÀÇ Transform - public static event Action OnRobotSelected; // ·Îº¿ ¼±Åà À̺¥Æ® - - private void Awake() - { - if (Instance == null) - { - Instance = this; - DontDestroyOnLoad(gameObject); - } - else - { - Destroy(gameObject); - } - - InitializeRobotRegistry(); - ManageConfig(); - } - - // À̺¥Æ® ±¸µ¶ °ü¸® - private void OnEnable() - { - MqttManager.OnMessageReceived += HandleMessage; // ¸Þ½ÃÁö ¼ö½Å À̺¥Æ® ±¸µ¶ - UIController.OnTransformSendUIClicked += HandlePublishTransformCommand; - UIController.OnKeyframesSendUIClicked += HandlePublishKeyframeListCommand; - } - - private void OnDisable() - { - MqttManager.OnMessageReceived -= HandleMessage; - UIController.OnTransformSendUIClicked -= HandlePublishTransformCommand; - UIController.OnKeyframesSendUIClicked -= HandlePublishKeyframeListCommand; - } - - void Start() - { - InstantiateRobotUIs(); - } - - private void InitializeRobotRegistry() - { - RobotController[] allRobots = FindObjectsByType(FindObjectsSortMode.None); // ºñȰ¼ºÈ­ µÈ °Ç »©°í ã±â - foreach (var robot in allRobots) - { - if (!robotRegistry.ContainsKey(robot.robotId)) - { - robotRegistry.Add(robot.robotId, robot); - } - else - { - Debug.LogWarning($"·Îº¿ ID {robot.robotId}°¡ Áߺ¹µÇ¾ú½À´Ï´Ù. ù ¹øÂ° ·Îº¿¸¸ µî·ÏµË´Ï´Ù."); - } - } - } - - private void InstantiateRobotUIs() - { - if (robotUIPrefab == null || uiParentCanvas == null) - { - Debug.LogError("Robot UI Prefab ¶Ç´Â UI Parent Canvas°¡ ¼³Á¤µÇÁö ¾Ê¾Ò½À´Ï´Ù."); - return; - } - foreach (var entry in robotRegistry) - { - RobotController robot = entry.Value; - // '°¡»ó ·Îº¿ (Æ®À©)'¿¡ ´ëÇØ¼­¸¸ UI¸¦ »ý¼º - if (!robot.isLocallyControlled) - { - GameObject uiInstance = Instantiate(robotUIPrefab, uiParentCanvas); - uiInstance.name = $"UI_{robot.robotId}"; - - // ±âÁ¸ UI PrefabÀº ºñȰ¼ºÈ­ - robotUIPrefab.SetActive(false); - - UIController uiController = uiInstance.GetComponent(); - if (uiController != null) - { - uiController.Initialize(this, uiManager); - robotUIs.Add(robot.robotId, uiInstance); - } - uiInstance.SetActive(false); - } - } - } - - public void SelectRobot(string robotId) - { - if (robotRegistry.TryGetValue(robotId, out RobotController robot)) - { - selectedRobot = robot; - targetRobotId = robotId; // ÇöÀç Á¶ÀÛ ÁßÀÎ ·Îº¿ ID ¼³Á¤ - Debug.Log($"·Îº¿ '{robotId}' ¼±ÅõÊ. ÇöÀç Á¶ÀÛ ÁßÀÎ ·Îº¿ ID·Î ¼³Á¤."); - - // ±â·ÏÇÒ Handle Target ¼³Á¤ - RecordingHandleTarget = GameObject.FindWithTag("Handle")?.transform; - - // ¸ðµç UI ºñȰ¼ºÈ­ - foreach (var ui in robotUIs.Values) ui.SetActive(false); - - // ¼±ÅÃµÈ ·Îº¿ÀÇ UI¸¸ Ȱ¼ºÈ­ - if (robotUIs.TryGetValue(robotId, out GameObject selectedUI)) - { - selectedUI.SetActive(true); - } - - OnRobotSelected?.Invoke(selectedRobot); // UIManagerÀÇ HandleRobotSelected À̺¥Æ® È£Ãâ - SubscribeToTopic(new string[] { $"robots/{targetRobotId}/ {actionTopicsData.Topic1}" }); // Topic1: state - - HandlePublishTransformCommand(); // ¼±Åà ½Ã ÇÑ ¹ø µ¿±âÈ­ - } - } - - #region Publishing Logic - - private void ManageConfig() - { - idConfigData = JsonUtility.FromJson(robotIDconfig.text); - actionTopicsData = JsonUtility.FromJson(robotActionTopics.text); - } - - // °¡»ó ·Îº¿À» Á¶ÀÛÇÏ¿© Çö½Ç ·Îº¿¿¡°Ô ¸í·É ¹ßÇà (UI »ç¿ëÇØ¼­) - public void HandlePublishTransformCommand() - { - Debug.Log("TransformSendUI À̺¥Æ® ½ÇÇàµÇ¾î HandlePublishTransformCommand ºÒ·¯¿È"); - Vector3 commandPosition = RecordingHandleTarget.transform.localPosition; - List commandJoints = hybridIKNode.GetCurrentJointPositions(); - List commandRotations = hybridIKNode.GetCurrentJointRotations(); - - string topic = $"robots/{targetRobotId}/{actionTopicsData.Topic2}"; // Topic2: command - Debug.Log($"topic: {topic}"); - - IKData data = new IKData - { - robotId = targetRobotId, // ·Îº¿ ID (°¡»ó = Çö½Ç) - position = commandPosition, - nodesPosition = new List(commandJoints), - nodesRotation = new List(commandRotations) - }; - string json = JsonUtility.ToJson(data, true); - mqttManager.PublishMessage(topic, json); - Debug.Log($"À§Ä¡ µ¿±âÈ­ ¸í·É ¹ßÇà: {json}"); - } - - public void HandlePublishKeyframeListCommand() - { - Debug.Log("ListSendUI À̺¥Æ® ½ÇÇàµÇ¾î HandlePublishKeyframeListCommand ºÒ·¯¿È"); - IReadOnlyList keyframePositions = UIManager.Instance.KeyframePositions; - - - //List commandJoints = hybridIKNode.GetJointPositionsForKeyframe(); - // ¸®½ºÆ®¸¦ ¸Þ½ÃÁö·Î publish - if (keyframePositions.Count > 0) - { - string topic = $"robots/{targetRobotId}/{actionTopicsData.Topic2}"; // Topic2: command - Debug.Log($"topic: {topic}"); - - IKDataListWrapper wrapper = new IKDataListWrapper - { - robotId = targetRobotId, - keyFrameList = new List(keyframePositions), - //nodesList = commandJoints - }; - string json = JsonUtility.ToJson(wrapper, true); - mqttManager.PublishMessage(topic, json); - Debug.Log($"ŰÇÁ·¹ÀÓ ¸®½ºÆ® ¸í·É ¹ßÇà: {json}"); - } - } - - private void HandleMessage(string topic, string message) - { - string[] topicLevels = topic.Split('/'); - if (topicLevels.Length < 3) return; - - string robotId = topicLevels[1]; - string messageType = topicLevels[2]; - - // ID¿¡ ÇØ´çÇÏ´Â ·Îº¿ÀÌ ÀÖ´ÂÁö È®ÀÎ - if (!robotRegistry.TryGetValue(robotId, out RobotController targetRobot)) - { - return; - } - - //HandleStateUpdate(targetRobot, message); // TODO. °¡»ó Æ®À©ÀÇ À§Ä¡ ¾÷µ¥ÀÌÆ® -> ½ÇÁ¦ ·Îº¿¿¡¼­ ¹öư Ŭ¸¯ÇÏ¸é µ¿±âÈ­ Çϱâ·Î. - } - - private void HandleStateUpdate(RobotController twinRobot, string message) // °¡»ó <- Çö½Ç - { - IKData data = JsonUtility.FromJson(message); - twinRobot.transform.localPosition = data.position; - } - - #endregion - - #region Subscribing Logic - - private void SubscribeToTopic(string[] topics) - { - // MqttManager¿¡¼­ ±¸µ¶ °ü¸® - mqttManager.SubscribeToTopics(topics); - } - - #endregion -} diff --git a/Assets/HybridIK/Scripts/Main/RobotManager.cs.meta b/Assets/HybridIK/Scripts/Main/RobotManager.cs.meta deleted file mode 100644 index ff177ce..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ec0bbd7b79e224641af1518339a681fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: -100 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/HybridIK/Scripts/Main/RobotSelector.cs b/Assets/HybridIK/Scripts/Main/RobotSelector.cs deleted file mode 100644 index 914ce82..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotSelector.cs +++ /dev/null @@ -1,27 +0,0 @@ -using UnityEngine; -using UnityEngine.EventSystems; - -[RequireComponent(typeof(RobotController))] -public class RobotSelector : MonoBehaviour, IPointerClickHandler -{ - private RobotController robotController; - - private void Start() - { - robotController = GetComponent(); - } - - public void OnPointerClick(PointerEventData eventData) - { - Debug.Log("RobotSelector OnPointerClick called."); - if (RobotManager.Instance != null && robotController != null) - { - RobotManager.Instance.SelectRobot(robotController.robotId); - Debug.Log(robotController.robotId + " Ŭ¸¯"); - } - else - { - Debug.LogError("RobotManager Instance or RobotController is null."); - } - } -} \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/RobotSelector.cs.meta b/Assets/HybridIK/Scripts/Main/RobotSelector.cs.meta deleted file mode 100644 index 99c052d..0000000 --- a/Assets/HybridIK/Scripts/Main/RobotSelector.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2c7de44cbc958774c8df01a2be9703bb \ No newline at end of file diff --git a/Assets/HybridIK/Scripts/Main/UIController.cs b/Assets/HybridIK/Scripts/Main/UIController.cs deleted file mode 100644 index 8bfb5cc..0000000 --- a/Assets/HybridIK/Scripts/Main/UIController.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System; -using TMPro; -using UnityEngine; -using UnityEngine.UI; - - -public class UIController : MonoBehaviour -{ - private RobotManager robotManager; - private UIManager uiManager; - - public TextMeshProUGUI keyframeText; - public List