kuavo-humanoid-sdk-ws 1.2.1__tar.gz → 1.2.1b1625__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.
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/PKG-INFO +1 -1
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/README.md +2 -2
- kuavo_humanoid_sdk_ws-1.2.1b1625/kuavo_humanoid_sdk/common/launch_robot_tool.py +170 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/state.py +1 -1
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/tools.py +3 -2
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot.py +66 -2
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk_ws.egg-info/PKG-INFO +1 -1
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk_ws.egg-info/SOURCES.txt +1 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/__init__.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/common/logger.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/common/websocket_kuavo_sdk.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/interfaces/__init__.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/interfaces/data_types.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/interfaces/end_effector.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/interfaces/robot.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/interfaces/robot_info.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/__init__.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/audio.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/core.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/audio.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/control.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/observation.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/param.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros/vision.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/core/ros_env.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/dexterous_hand.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/leju_claw.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_arm.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_audio.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_head.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_info.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_observation.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_state.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_tool.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot_vision.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo_strategy/__init__.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/msg/__init__.py +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk_ws.egg-info/dependency_links.txt +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk_ws.egg-info/requires.txt +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk_ws.egg-info/top_level.txt +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/setup.cfg +0 -0
- {kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/setup.py +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Kuavo Humanoid SDK
|
|
2
|
-
[](https://pypi.org/project/kuavo-humanoid-sdk/)[](#)[](https://pypi.python.org/pypi/kuavo-humanoid-sdk)
|
|
2
|
+
[](https://pypi.org/project/kuavo-humanoid-sdk-ws/)[](#)[](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
|
|
41
|
-
SDKLogger.error("
|
|
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,
|
{kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/kuavo/robot.py
RENAMED
|
@@ -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")
|
{kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/__init__.py
RENAMED
|
File without changes
|
{kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/common/logger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kuavo_humanoid_sdk_ws-1.2.1 → kuavo_humanoid_sdk_ws-1.2.1b1625}/kuavo_humanoid_sdk/msg/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|