kuavo-humanoid-sdk-ws 1.2.1__tar.gz → 1.2.1b1675__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/PKG-INFO +1 -1
  2. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/README.md +2 -2
  3. kuavo_humanoid_sdk_ws-1.2.1b1675/kuavo_humanoid_sdk/common/launch_robot_tool.py +170 -0
  4. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/state.py +1 -1
  5. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/tools.py +3 -2
  6. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot.py +66 -2
  7. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk_ws.egg-info/PKG-INFO +1 -1
  8. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk_ws.egg-info/SOURCES.txt +1 -0
  9. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/__init__.py +0 -0
  10. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/common/logger.py +0 -0
  11. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/common/websocket_kuavo_sdk.py +0 -0
  12. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/__init__.py +0 -0
  13. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/data_types.py +0 -0
  14. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/end_effector.py +0 -0
  15. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot.py +0 -0
  16. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/interfaces/robot_info.py +0 -0
  17. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/__init__.py +0 -0
  18. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/audio.py +0 -0
  19. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/core.py +0 -0
  20. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +0 -0
  21. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +0 -0
  22. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/audio.py +0 -0
  23. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/control.py +0 -0
  24. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/observation.py +0 -0
  25. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/param.py +0 -0
  26. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +0 -0
  27. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros/vision.py +0 -0
  28. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/core/ros_env.py +0 -0
  29. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/dexterous_hand.py +0 -0
  30. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/leju_claw.py +0 -0
  31. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_arm.py +0 -0
  32. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_audio.py +0 -0
  33. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_head.py +0 -0
  34. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_info.py +0 -0
  35. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_observation.py +0 -0
  36. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_state.py +0 -0
  37. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_tool.py +0 -0
  38. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo/robot_vision.py +0 -0
  39. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/__init__.py +0 -0
  40. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +0 -0
  41. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +0 -0
  42. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk/msg/__init__.py +0 -0
  43. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk_ws.egg-info/dependency_links.txt +0 -0
  44. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk_ws.egg-info/requires.txt +0 -0
  45. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/kuavo_humanoid_sdk_ws.egg-info/top_level.txt +0 -0
  46. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/setup.cfg +0 -0
  47. {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1675}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuavo_humanoid_sdk_ws
3
- Version: 1.2.1
3
+ Version: 1.2.1b1675
4
4
  Summary: A Python SDK for kuavo humanoid robot.
5
5
  Home-page: https://gitee.com/leju-robot/kuavo-ros-opensource/
6
6
  Author: ['lejurobot']
@@ -1,11 +1,11 @@
1
1
  # Kuavo Humanoid SDK
2
- [![Version](https://img.shields.io/pypi/v/kuavo-humanoid-sdk.svg)](https://pypi.org/project/kuavo-humanoid-sdk/)[![License](https://img.shields.io/pypi/l/kuavo-humanoid-sdk.svg)](#)[![Supported Python Versions](https://img.shields.io/pypi/pyversions/kuavo-humanoid-sdk.svg)](https://pypi.python.org/pypi/kuavo-humanoid-sdk)
2
+ [![Version](https://img.shields.io/pypi/v/kuavo-humanoid-sdk-ws.svg)](https://pypi.org/project/kuavo-humanoid-sdk-ws/)[![License](https://img.shields.io/pypi/l/kuavo-humanoid-sdk-ws.svg)](#)[![Supported Python Versions](https://img.shields.io/pypi/pyversions/kuavo-humanoid-sdk-ws.svg)](https://pypi.python.org/pypi/kuavo-humanoid-sdk-ws)
3
3
 
4
4
  一个全面的 Python SDK,用于控制 Kuavo 人形机器人。该 SDK 提供了机器人状态管理、手臂和头部控制以及末端执行器操作的接口。它设计用于与 ROS(机器人操作系统)环境一起工作。
5
5
 
6
6
  **警告**:该 SDK 目前仅支持 **ROS1**。不支持 ROS2。
7
7
 
8
- PyPI 项目地址: https://pypi.org/project/kuavo-humanoid-sdk/
8
+ PyPI 项目地址: https://pypi.org/project/kuavo-humanoid-sdk-ws/
9
9
 
10
10
  ## 安装
11
11
  **提示:对于本 SDK 目前存在两个版本,正式发布版与beta内测版, 他们的区别是:**
@@ -0,0 +1,170 @@
1
+ import roslibpy
2
+ import time
3
+ from typing import Tuple
4
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
5
+ from kuavo_humanoid_sdk.common.websocket_kuavo_sdk import WebSocketKuavoSDK
6
+
7
+
8
+ class LaunchRobotStatus:
9
+ # 与硬件节点保持一致
10
+ UNLAUNCH = 'unlaunch'
11
+ INITING = 'initing'
12
+ UNKNOWN = 'unknown'
13
+ READY_STANCE = 'ready_stance'
14
+ CALIBRATE = 'calibrate'
15
+ LAUNCHED = 'launched'
16
+
17
+ class LaunchRobotTool:
18
+ def __init__(self):
19
+ self._websocket = WebSocketKuavoSDK()
20
+ self._stand_timeout = 10.0
21
+ self._srv_robot_start = roslibpy.Service(self._websocket.client, '/websocket_sdk_srv/start_robot', 'std_srvs/Trigger')
22
+ self._srv_robot_stand = roslibpy.Service(self._websocket.client, '/websocket_sdk_srv/stand_robot', 'std_srvs/Trigger')
23
+ self._srv_get_robot_launch_status = roslibpy.Service(self._websocket.client, '/websocket_sdk_srv/get_robot_launch_status', 'std_srvs/Trigger')
24
+ self._srv_robot_stop = roslibpy.Service(self._websocket.client, '/websocket_sdk_srv/stop_robot', 'std_srvs/Trigger')
25
+
26
+ def is_unlaunch(self, status:str)->bool:
27
+ return status == LaunchRobotStatus.UNLAUNCH or status == LaunchRobotStatus.UNKNOWN
28
+
29
+ def is_launched(self, status:str)->bool:
30
+ return status == LaunchRobotStatus.LAUNCHED
31
+
32
+ def is_launching(self, status:str)->bool:
33
+ return self.is_calibrate(status) or self.is_ready_stance(status)
34
+
35
+ def is_calibrate(self, status:str)->bool:
36
+ return status == LaunchRobotStatus.CALIBRATE
37
+
38
+ def is_ready_stance(self, status:str)->bool:
39
+ return status == LaunchRobotStatus.READY_STANCE
40
+
41
+ def robot_start(self) -> bool:
42
+ # launch robot
43
+ if not self.pub_start_command():
44
+ return False
45
+ try:
46
+ timeout = 120 # 120s 等待进入校准或准备姿态
47
+ start_time = time.time()
48
+ last_print = time.time()
49
+ print("\033[32m>_ 机器人启动中\033[0m", end="", flush=True)
50
+ while True:
51
+ if time.time() - start_time > timeout:
52
+ SDKLogger.error("Robot launch timed out")
53
+ return False
54
+ success, status = self.get_robot_launch_status()
55
+ # 如果机器人启动成功,已经进入校准或准备状态或者launched状态,则启动成功
56
+ if success and (self.is_launched(status) or self.is_launching(status)):
57
+ print("\n")
58
+ return True
59
+
60
+ current_time = time.time()
61
+ if current_time - last_print >= 0.8:
62
+ print("\033[32m.\033[0m", end="", flush=True)
63
+ last_print = current_time
64
+ time.sleep(0.2)
65
+ except KeyboardInterrupt:
66
+ print("\n")
67
+ SDKLogger.info("Received keyboard interrupt, stopping robot launch")
68
+ return False
69
+
70
+ def robot_stop(self)->bool:
71
+ """
72
+ 停止机器人
73
+ """
74
+ try:
75
+ request = roslibpy.ServiceRequest({})
76
+ response = self._srv_robot_stop.call(request)
77
+ return response.get('success', False)
78
+ except Exception as e:
79
+ SDKLogger.error(f"[Error] calling stop robot service: {e}")
80
+ return False
81
+
82
+ def robot_stand(self)->bool:
83
+ try:
84
+ while True:
85
+ # 获取当前启动状态, 如果已启动则返回
86
+ success, status = self.get_robot_launch_status()
87
+ if not success:
88
+ SDKLogger.error(f"[Error] Failed to get robot launch status: {status}")
89
+ return False
90
+ if self.is_launched(status):
91
+ return True
92
+
93
+ # 从当前状态确认下一个状态
94
+ next_state = None
95
+ if self.is_calibrate(status):
96
+ print("\033[32m>_ [校准状态]: 机器人当前处于校准状态,确认无误,请输入 y 键进入准备姿态\033[0m")
97
+ next_state = LaunchRobotStatus.READY_STANCE
98
+ elif self.is_ready_stance(status):
99
+ print("\033[32m>_ [准备姿态]: 请等待机器人缩腿到下蹲姿势,并将其下降到距离地面 2cm 处,确认无误后,请输入 y 键\033[0m")
100
+ next_state = LaunchRobotStatus.LAUNCHED
101
+
102
+ if self.is_calibrate(status) or self.is_ready_stance(status):
103
+ while True:
104
+ try:
105
+ choice = input().lower()
106
+ if choice == 'y':
107
+ break
108
+ elif choice == 'n':
109
+ return False
110
+ else:
111
+ SDKLogger.error("输入错误,请输入 y 键")
112
+ except KeyboardInterrupt:
113
+ return False
114
+
115
+ # 发布站立命令
116
+ if not self.pub_stand_command():
117
+ return False
118
+
119
+ # 等待进入下一个状态
120
+ start_time = time.time()
121
+ while True:
122
+ if time.time() - start_time > self._stand_timeout:
123
+ break
124
+ success, current_status = self.get_robot_launch_status()
125
+ if not success:
126
+ SDKLogger.error(f"[Error] Wait next state Failed to get robot launch status: {current_status}")
127
+ return False
128
+ if self.is_launched(current_status):
129
+ return True
130
+ elif current_status == next_state:
131
+ # 成功进入下一个状态
132
+ break
133
+ time.sleep(0.2)
134
+ time.sleep(0.2)
135
+ except KeyboardInterrupt:
136
+ SDKLogger.info("Received keyboard interrupt, stopping robot stand")
137
+ return False
138
+
139
+ def pub_start_command(self) -> bool:
140
+ try:
141
+ request = roslibpy.ServiceRequest({})
142
+ response = self._srv_robot_start.call(request)
143
+ result = response.get('success', False)
144
+ return result
145
+ except Exception as e:
146
+ SDKLogger.error(f"[Error] calling start service: {e}")
147
+ return False
148
+
149
+ def pub_stand_command(self) -> bool:
150
+ try:
151
+ request = {}
152
+ response = self._srv_robot_stand.call(request)
153
+ if not response.get('success', False):
154
+ SDKLogger.error(f"Failed to make robot stand: {response.get('message', '')}")
155
+ return response.get('success', False)
156
+ except Exception as e:
157
+ SDKLogger.error(f"[Error] calling stand service: {e}")
158
+ return False
159
+
160
+
161
+ def get_robot_launch_status(self)->Tuple[bool, str]:
162
+ try:
163
+ request = roslibpy.ServiceRequest({})
164
+ response = self._srv_get_robot_launch_status.call(request)
165
+ success = response.get('success', False)
166
+ status = response.get('message', 'unknown')
167
+ return success, status
168
+ except Exception as e:
169
+ SDKLogger.error(f"[Error] calling get robot launch status service: {e}")
170
+ return False, "unknown"
@@ -340,7 +340,7 @@ class KuavoRobotStateCoreWebsocket:
340
340
 
341
341
  def _humanoid_mpc_observation_callback(self, msg) -> None:
342
342
  try:
343
- SDKLogger.debug(f"[State] Received MPC observation message: {msg}")
343
+ # SDKLogger.debug(f"[State] Received MPC observation message: {msg}")
344
344
  self._mpc_observation_data = msg
345
345
  if hasattr(self, '_initialized'):
346
346
  curr_time = self._mpc_observation_data['time']
@@ -37,8 +37,9 @@ class KuavoRobotToolsCoreWebsocket:
37
37
  self._transform_cache = {}
38
38
  self._initialized = True
39
39
  except Exception as e:
40
- SDKLogger.error(f"Failed to initialize tf2_web_republisher: {str(e)}")
41
- SDKLogger.error("Please make sure tf2_web_republisher node is running")
40
+ SDKLogger.error(f"Failed to initialize kuavo_tf2_web_republisher: {str(e)}")
41
+ SDKLogger.error(f"kuavo_tf2_web_republisher 节点未运行")
42
+ SDKLogger.error("请运行 `cd <kuavo_ros_application> && source devel/setup.bash && rosrun kuavo_tf2_web_republisher kuavo_tf2_web_republisher` 启动 kuavo_tf2_web_republisher 节点")
42
43
  raise
43
44
 
44
45
  def _get_tf_tree_transform(self, target_frame: str, source_frame: str,
@@ -11,6 +11,7 @@ from kuavo_humanoid_sdk.kuavo.robot_info import KuavoRobotInfo
11
11
  from kuavo_humanoid_sdk.kuavo.robot_arm import KuavoRobotArm
12
12
  from kuavo_humanoid_sdk.kuavo.robot_head import KuavoRobotHead
13
13
  from kuavo_humanoid_sdk.common.websocket_kuavo_sdk import WebSocketKuavoSDK
14
+ from kuavo_humanoid_sdk.common.launch_robot_tool import LaunchRobotTool
14
15
 
15
16
  """
16
17
  Kuavo SDK - Python Interface for Kuavo Robot Control
@@ -78,6 +79,59 @@ class KuavoSDK:
78
79
  SDKLogger.setLevel(log_level.upper())
79
80
  SDKLogger.debug(f" ================= Kuavo Humanoid Websocket SDK =================")
80
81
 
82
+ def launch_robot()->bool:
83
+ import time
84
+ import os
85
+ start_time = time.time()
86
+ launch_robot_tool = LaunchRobotTool()
87
+
88
+ # 获取机器人启动状态
89
+ success, status = launch_robot_tool.get_robot_launch_status()
90
+ if not success:
91
+ # 可能websocket服务未启动或网络不通原因
92
+ SDKLogger.error(f"[SDK] Failed to get robot launch status: {status}")
93
+ return False
94
+
95
+ SDKLogger.info(f"[SDK] Robot launch status: {status}, time elapsed: {time.time() - start_time:.2f}s")
96
+
97
+ # 如果机器人已经启动,则直接返回True
98
+ if launch_robot_tool.is_launched(status):
99
+ return True
100
+
101
+ # 未启动则启动
102
+ if launch_robot_tool.is_unlaunch(status):
103
+ print("\033[32m\n>_ 温馨提示: 机器人未启动,现在可以选择手动启动,如果需要请输入 y ,否则输入 n 退出\033[0m")
104
+ try:
105
+ while True:
106
+ choice = input().lower()
107
+ if choice == 'y':
108
+ if not launch_robot_tool.robot_start():
109
+ SDKLogger.error("机器人启动失败,请检查机器人状态")
110
+ os._exit(1)
111
+ break
112
+ elif choice == 'n':
113
+ SDKLogger.warning("用户选择不启动机器人,程序退出。")
114
+ os._exit(1)
115
+ else:
116
+ SDKLogger.error("输入错误,请输入 y 或 n")
117
+ except KeyboardInterrupt:
118
+ os._exit(1)
119
+
120
+ SDKLogger.debug(f"等待机器人启动,已耗时: {time.time() - start_time:.2f}s")
121
+
122
+ if not launch_robot_tool.robot_stand():
123
+ SDKLogger.error("机器人站立失败,请检查机器人状态")
124
+ os._exit(1)
125
+
126
+ end_time = time.time()
127
+ SDKLogger.info(f"[SDK] Robot launch time: {end_time - start_time} seconds")
128
+ return True
129
+
130
+ # Launch robot
131
+ if not launch_robot():
132
+ SDKLogger.error("[SDK] Failed to launch robot.")
133
+ return False
134
+
81
135
  # Initialize core components, connect ROS Topics...
82
136
  kuavo_core = KuavoRobotCore()
83
137
  if log_level.upper() == 'DEBUG':
@@ -90,8 +144,6 @@ class KuavoSDK:
90
144
  print("\033[31m\nError:WithIK option is enabled but ik_node is not running, please run `roslaunch motion_capture_ik ik_node.launch`\033[0m")
91
145
  exit(1)
92
146
 
93
-
94
-
95
147
  if not kuavo_core.initialize(debug=debug):
96
148
  SDKLogger.error("[SDK] Failed to initialize core components.")
97
149
  return False
@@ -103,6 +155,18 @@ class KuavoSDK:
103
155
  """Disable all logging output from the SDK."""
104
156
  disable_sdk_logging()
105
157
 
158
+ @staticmethod
159
+ def StopRobot()->bool:
160
+ """Stop the robot."""
161
+ launch_robot_tool = LaunchRobotTool()
162
+ success, status = launch_robot_tool.get_robot_launch_status()
163
+ if not success:
164
+ SDKLogger.error(f"[SDK] Failed to get robot launch status: {status}")
165
+ return False
166
+ if launch_robot_tool.is_unlaunch(status):
167
+ return True
168
+ return launch_robot_tool.robot_stop()
169
+
106
170
  class KuavoRobot(RobotBase):
107
171
  def __init__(self):
108
172
  super().__init__(robot_type="kuavo")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuavo-humanoid-sdk-ws
3
- Version: 1.2.1
3
+ Version: 1.2.1b1675
4
4
  Summary: A Python SDK for kuavo humanoid robot.
5
5
  Home-page: https://gitee.com/leju-robot/kuavo-ros-opensource/
6
6
  Author: ['lejurobot']
@@ -1,6 +1,7 @@
1
1
  README.md
2
2
  setup.py
3
3
  kuavo_humanoid_sdk/__init__.py
4
+ kuavo_humanoid_sdk/common/launch_robot_tool.py
4
5
  kuavo_humanoid_sdk/common/logger.py
5
6
  kuavo_humanoid_sdk/common/websocket_kuavo_sdk.py
6
7
  kuavo_humanoid_sdk/interfaces/__init__.py