ezgo 0.0.4__tar.gz → 0.0.6__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.
- {ezgo-0.0.4/src/ezgo.egg-info → ezgo-0.0.6}/PKG-INFO +177 -2
- ezgo-0.0.6/README.md +389 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/pyproject.toml +1 -1
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/__init__.py +1 -1
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/go2.py +153 -35
- {ezgo-0.0.4 → ezgo-0.0.6/src/ezgo.egg-info}/PKG-INFO +177 -2
- ezgo-0.0.4/README.md +0 -214
- {ezgo-0.0.4 → ezgo-0.0.6}/LICENSE +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/setup.cfg +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/camera.py +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/go2_camera.py +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/go2_vui.py +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo/ui.py +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo.egg-info/SOURCES.txt +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo.egg-info/dependency_links.txt +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo.egg-info/requires.txt +0 -0
- {ezgo-0.0.4 → ezgo-0.0.6}/src/ezgo.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ezgo
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.6
|
|
4
4
|
Summary: 宇树Go2机器狗Python控制库
|
|
5
5
|
Author-email: ezgo <noreply@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -43,7 +43,9 @@ Requires-Dist: Pillow>=8.0.0; extra == "basic"
|
|
|
43
43
|
|
|
44
44
|
## 功能特性
|
|
45
45
|
|
|
46
|
-
- 🚶
|
|
46
|
+
- 🚶 **基础运动控制**: 支持阻尼、站立、坐下、行走等基本动作
|
|
47
|
+
- 🏃 **高级运动模式**: 支持灵动、并腿跑、跳跃跑、交叉步等多种步态
|
|
48
|
+
- 🤸 **特技动作**: 支持空翻、倒立、舞蹈等表演动作
|
|
47
49
|
- 📷 **摄像头控制**: 支持图片获取和视频流处理
|
|
48
50
|
- 🔊 **声光控制**: 支持LED灯光和音量控制
|
|
49
51
|
- 🎮 **UI界面**: 提供图形化控制界面
|
|
@@ -140,6 +142,76 @@ if vui.init():
|
|
|
140
142
|
vui.set_volume(3)
|
|
141
143
|
```
|
|
142
144
|
|
|
145
|
+
### 高级运动模式
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
import ezgo
|
|
149
|
+
|
|
150
|
+
robot = ezgo.Go2()
|
|
151
|
+
if robot.init():
|
|
152
|
+
# 步态模式切换
|
|
153
|
+
robot.FreeWalk(True) # 开启灵动模式
|
|
154
|
+
robot.FreeWalk(False) # 关闭灵动模式
|
|
155
|
+
|
|
156
|
+
# 特殊步态(自动演示后关闭)
|
|
157
|
+
robot.FreeBound(True) # 并腿跑模式(2秒后自动关闭)
|
|
158
|
+
robot.FreeJump(True) # 跳跃模式(4秒后自动关闭)
|
|
159
|
+
robot.FreeAvoid(True) # 闪避模式(2秒后自动关闭)
|
|
160
|
+
robot.WalkUpright(True) # 后腿直立模式(4秒后自动关闭)
|
|
161
|
+
robot.CrossStep(True) # 交叉步模式(4秒后自动关闭)
|
|
162
|
+
|
|
163
|
+
# 常规运动模式
|
|
164
|
+
robot.TrotRun() # 进入常规跑步模式
|
|
165
|
+
robot.StaticWalk() # 进入常规行走模式
|
|
166
|
+
robot.EconomicGait() # 进入常规续航模式
|
|
167
|
+
robot.ClassicWalk(True) # 开启经典步态
|
|
168
|
+
robot.ClassicWalk(False) # 关闭经典步态
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 特技动作
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
import ezgo
|
|
175
|
+
|
|
176
|
+
robot = ezgo.Go2()
|
|
177
|
+
if robot.init():
|
|
178
|
+
# 表演动作
|
|
179
|
+
robot.Hello() # 打招呼
|
|
180
|
+
robot.Stretch() # 伸懒腰
|
|
181
|
+
robot.Content() # 开心
|
|
182
|
+
robot.Heart() # 比心
|
|
183
|
+
robot.Scrape() # 拜年作揖
|
|
184
|
+
robot.Dance1() # 舞蹈段落1
|
|
185
|
+
robot.Dance2() # 舞蹈段落2
|
|
186
|
+
|
|
187
|
+
# 特技动作
|
|
188
|
+
robot.FrontJump() # 前跳
|
|
189
|
+
robot.FrontPounce() # 向前扑人
|
|
190
|
+
robot.LeftFlip() # 左空翻
|
|
191
|
+
robot.BackFlip() # 后空翻
|
|
192
|
+
robot.HandStand(True) # 倒立(4秒后自动关闭)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 自动翻身功能
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
import ezgo
|
|
199
|
+
|
|
200
|
+
robot = ezgo.Go2()
|
|
201
|
+
if robot.init():
|
|
202
|
+
# 设置自动翻身
|
|
203
|
+
success = robot.AutoRecoverSet(True)
|
|
204
|
+
if success:
|
|
205
|
+
print("自动翻身已开启")
|
|
206
|
+
|
|
207
|
+
# 查询自动翻身状态
|
|
208
|
+
is_enabled = robot.AutoRecoverGet()
|
|
209
|
+
print(f"自动翻身状态: {'开启' if is_enabled else '关闭'}")
|
|
210
|
+
|
|
211
|
+
# 关闭自动翻身
|
|
212
|
+
robot.AutoRecoverSet(False)
|
|
213
|
+
```
|
|
214
|
+
|
|
143
215
|
## API 参考
|
|
144
216
|
|
|
145
217
|
### Go2 类
|
|
@@ -148,12 +220,68 @@ if vui.init():
|
|
|
148
220
|
|
|
149
221
|
#### 主要方法
|
|
150
222
|
|
|
223
|
+
**基础控制**:
|
|
151
224
|
- `init()`: 初始化与Go2的连接
|
|
152
225
|
- `Damp()`: 进入阻尼状态
|
|
153
226
|
- `BalanceStand()`: 平衡站立
|
|
154
227
|
- `StopMove()`: 停止所有移动动作
|
|
228
|
+
- `StandUp()`: 关节锁定,站高
|
|
229
|
+
- `StandDown()`: 关节锁定,站低
|
|
230
|
+
- `Sit()`: 坐下
|
|
231
|
+
- `RiseSit()`: 站起(相对于坐下)
|
|
232
|
+
|
|
233
|
+
**移动控制**:
|
|
234
|
+
- `Move(vx, vy, vyaw)`: 移动(速度范围:vx, vy: -1~1, vyaw: -2~2)
|
|
235
|
+
- `MoveForDuration(vx, vy, vyaw, duration)`: 持续移动指定时间
|
|
236
|
+
- `StartMove(vx, vy, vyaw)`: 开始持续移动
|
|
237
|
+
- `Forward(speed=0.3, duration=2.0)`: 向前移动
|
|
238
|
+
- `Backward(speed=0.3, duration=2.0)`: 向后移动
|
|
239
|
+
- `Left(speed=0.3, duration=2.0)`: 向左移动
|
|
240
|
+
- `Right(speed=0.3, duration=2.0)`: 向右移动
|
|
241
|
+
- `TurnLeft(speed=0.5, duration=2.0)`: 左转
|
|
242
|
+
- `TurnRight(speed=0.5, duration=2.0)`: 右转
|
|
243
|
+
|
|
244
|
+
**步态模式**:
|
|
245
|
+
- `FreeWalk(flag=None)`: 灵动模式(默认步态)
|
|
246
|
+
- `FreeBound(flag)`: 并腿跑模式
|
|
247
|
+
- `FreeJump(flag)`: 跳跃模式
|
|
248
|
+
- `FreeAvoid(flag)`: 闪避模式
|
|
249
|
+
- `WalkUpright(flag)`: 后腿直立模式
|
|
250
|
+
- `CrossStep(flag)`: 交叉步模式
|
|
251
|
+
- `ClassicWalk(flag)`: 经典步态
|
|
252
|
+
- `TrotRun()`: 进入常规跑步模式
|
|
253
|
+
- `StaticWalk()`: 进入常规行走模式
|
|
254
|
+
- `EconomicGait()`: 进入常规续航模式
|
|
255
|
+
|
|
256
|
+
**表演动作**:
|
|
257
|
+
- `Hello()`: 打招呼
|
|
258
|
+
- `Stretch()`: 伸懒腰
|
|
259
|
+
- `Content()`: 开心
|
|
260
|
+
- `Heart()`: 比心
|
|
261
|
+
- `Scrape()`: 拜年作揖
|
|
262
|
+
- `Dance1()`: 舞蹈段落1
|
|
263
|
+
- `Dance2()`: 舞蹈段落2
|
|
264
|
+
|
|
265
|
+
**特技动作**:
|
|
266
|
+
- `FrontJump()`: 前跳
|
|
267
|
+
- `FrontPounce()`: 向前扑人
|
|
268
|
+
- `LeftFlip()`: 左空翻
|
|
269
|
+
- `BackFlip()`: 后空翻
|
|
270
|
+
- `HandStand(flag)`: 倒立行走
|
|
271
|
+
|
|
272
|
+
**自动功能**:
|
|
273
|
+
- `AutoRecoverSet(flag)`: 设置自动翻身是否生效
|
|
274
|
+
- `AutoRecoverGet()`: 查询自动翻身是否生效
|
|
275
|
+
- `SwitchAvoidMode()`: 闪避模式下,关闭摇杆未推时前方障碍物的闪避
|
|
276
|
+
|
|
277
|
+
**便利方法**:
|
|
155
278
|
- `get_camera()`: 获取摄像头控制对象
|
|
156
279
|
- `get_vui()`: 获取声光控制对象
|
|
280
|
+
- `capture_image(save_path=None)`: 获取一张图片
|
|
281
|
+
- `start_video_stream(width=480, height=320)`: 开始视频流
|
|
282
|
+
- `get_video_frame()`: 获取最新视频帧
|
|
283
|
+
- `stop_video_stream()`: 停止视频流
|
|
284
|
+
- `cleanup()`: 清理资源
|
|
157
285
|
|
|
158
286
|
### Go2Camera 类
|
|
159
287
|
|
|
@@ -231,6 +359,53 @@ pip install opencv-python numpy Pillow netifaces
|
|
|
231
359
|
|
|
232
360
|
## 更新日志
|
|
233
361
|
|
|
362
|
+
### v0.0.5 (2025-12-04)
|
|
363
|
+
**新增功能**:
|
|
364
|
+
- ✨ 新增15种高级运动模式和特技动作
|
|
365
|
+
- ✨ 支持灵动模式、并腿跑、跳跃跑、交叉步等多种步态
|
|
366
|
+
- ✨ 新增空翻、倒立、舞蹈等表演动作
|
|
367
|
+
- ✨ 增加自动翻身功能设置和查询
|
|
368
|
+
- ✨ 完善移动控制API,支持持续移动和定时移动
|
|
369
|
+
|
|
370
|
+
**改进**:
|
|
371
|
+
- 🔧 优化网络连接检查,支持非sudo ping
|
|
372
|
+
- 🔧 改进初始化流程,连接失败时仅显示警告
|
|
373
|
+
- 🔧 增强错误处理,对不支持的SDK版本提供友好提示
|
|
374
|
+
- 🔧 所有新函数都包含适当的异常处理
|
|
375
|
+
|
|
376
|
+
**修复**:
|
|
377
|
+
- 🐛 修复包构建问题,确保源代码正确包含
|
|
378
|
+
- 🐛 修复依赖配置,核心库无强制依赖
|
|
379
|
+
|
|
380
|
+
### v0.0.4 (2025-12-04)
|
|
381
|
+
**修复**:
|
|
382
|
+
- 🐛 修复包结构问题,源代码未正确包含在PyPI包中
|
|
383
|
+
- 🔧 重新组织包结构,确保所有模块正确打包
|
|
384
|
+
|
|
385
|
+
### v0.0.3 (2025-12-04)
|
|
386
|
+
**改进**:
|
|
387
|
+
- 🔧 优化依赖配置,移除强制依赖
|
|
388
|
+
- 📦 所有依赖改为可选依赖,支持按需安装
|
|
389
|
+
- 📚 更新安装说明和依赖文档
|
|
390
|
+
|
|
391
|
+
### v0.0.2 (2025-12-04)
|
|
392
|
+
**新增功能**:
|
|
393
|
+
- ✨ 集成go2_vui声光控制模块
|
|
394
|
+
- ✨ 集成go2_camera摄像头控制模块
|
|
395
|
+
- ✨ 优化模块导入结构,使用相对导入
|
|
396
|
+
|
|
397
|
+
**改进**:
|
|
398
|
+
- 🔧 修复get_camera方法路径配置
|
|
399
|
+
- 🔧 添加get_vui方法支持声光控制
|
|
400
|
+
- 🔧 完善懒加载机制
|
|
401
|
+
|
|
402
|
+
### v0.0.1 (2025-12-04)
|
|
403
|
+
**初始发布**:
|
|
404
|
+
- 🎉 基础运动控制功能
|
|
405
|
+
- 📷 摄像头基础支持
|
|
406
|
+
- 🔊 声光控制基础支持
|
|
407
|
+
- 📦 PyPI包发布
|
|
408
|
+
|
|
234
409
|
### v0.0.2
|
|
235
410
|
- 添加了 Go2Camera 摄像头控制类
|
|
236
411
|
- 添加了 Go2VUI 声光控制类
|
ezgo-0.0.6/README.md
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# ezgo - 宇树Go2机器狗Python控制库
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/py/ezgo)
|
|
4
|
+
[](https://pypi.org/project/ezgo/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
这是一个用于控制宇树Go2机器狗的Python库,提供了简单易用的API接口。支持运动控制、视频流获取、声光控制等功能。
|
|
8
|
+
|
|
9
|
+
## 功能特性
|
|
10
|
+
|
|
11
|
+
- 🚶 **基础运动控制**: 支持阻尼、站立、坐下、行走等基本动作
|
|
12
|
+
- 🏃 **高级运动模式**: 支持灵动、并腿跑、跳跃跑、交叉步等多种步态
|
|
13
|
+
- 🤸 **特技动作**: 支持空翻、倒立、舞蹈等表演动作
|
|
14
|
+
- 📷 **摄像头控制**: 支持图片获取和视频流处理
|
|
15
|
+
- 🔊 **声光控制**: 支持LED灯光和音量控制
|
|
16
|
+
- 🎮 **UI界面**: 提供图形化控制界面
|
|
17
|
+
- 🔧 **易于使用**: 简洁的API设计,支持懒加载
|
|
18
|
+
- 📦 **可选依赖**: 核心功能轻量,按需安装依赖
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
### 基础安装(仅核心库,无强制依赖)
|
|
23
|
+
```bash
|
|
24
|
+
pip install ezgo
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 完整功能安装(包含所有可选依赖)
|
|
28
|
+
```bash
|
|
29
|
+
pip install ezgo[full]
|
|
30
|
+
n```
|
|
31
|
+
|
|
32
|
+
### 仅基础功能(图像处理相关依赖)
|
|
33
|
+
```bash
|
|
34
|
+
pip install ezgo[basic]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **注意**: `ezgo` 核心库本身没有任何强制依赖。所有依赖都是可选的,您可以根据需要手动安装:
|
|
38
|
+
> - `unitree-sdk2py`: 机器人通信必需
|
|
39
|
+
> - `opencv-python`: 摄像头功能必需
|
|
40
|
+
> - `numpy`: 数值计算支持
|
|
41
|
+
> - `Pillow`: 图像处理支持
|
|
42
|
+
> - `netifaces`: �络接口检测
|
|
43
|
+
|
|
44
|
+
## 快速开始
|
|
45
|
+
|
|
46
|
+
### 基本运动控制
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
import ezgo
|
|
50
|
+
|
|
51
|
+
# 创建Go2控制对象
|
|
52
|
+
robot = ezgo.Go2()
|
|
53
|
+
|
|
54
|
+
# 初始化连接
|
|
55
|
+
if robot.init():
|
|
56
|
+
print("连接成功!")
|
|
57
|
+
|
|
58
|
+
# 基本动作
|
|
59
|
+
robot.Damp() # 进入阻尼状态
|
|
60
|
+
robot.BalanceStand() # 平衡站立
|
|
61
|
+
robot.StopMove() # 停止移动
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 摄像头控制
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
import ezgo
|
|
68
|
+
|
|
69
|
+
# 方法1: 通过Go2对象获取摄像头
|
|
70
|
+
robot = ezgo.Go2()
|
|
71
|
+
camera = robot.get_camera()
|
|
72
|
+
|
|
73
|
+
# 方法2: 直接使用摄像头类
|
|
74
|
+
camera = ezgo.Go2Camera()
|
|
75
|
+
|
|
76
|
+
# 初始化摄像头
|
|
77
|
+
if camera.init():
|
|
78
|
+
# 获取单张图片
|
|
79
|
+
image = camera.capture_image("photo.jpg")
|
|
80
|
+
|
|
81
|
+
# 打开视频流
|
|
82
|
+
if camera.open_video_stream():
|
|
83
|
+
frame = camera.read_frame()
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 声光控制
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
import ezgo
|
|
90
|
+
|
|
91
|
+
# 方法1: 通过Go2对象获取VUI控制
|
|
92
|
+
robot = ezgo.Go2()
|
|
93
|
+
vui = robot.get_vui()
|
|
94
|
+
|
|
95
|
+
# 方法2: 直接使用VUI类
|
|
96
|
+
vui = ezgo.Go2VUI()
|
|
97
|
+
|
|
98
|
+
# 初始化VUI
|
|
99
|
+
if vui.init():
|
|
100
|
+
# 设置LED亮度 (0-10)
|
|
101
|
+
vui.set_brightness(5)
|
|
102
|
+
|
|
103
|
+
# 获取当前亮度
|
|
104
|
+
success, brightness = vui.get_brightness()
|
|
105
|
+
|
|
106
|
+
# 设置音量 (0-10)
|
|
107
|
+
vui.set_volume(3)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 高级运动模式
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
import ezgo
|
|
114
|
+
|
|
115
|
+
robot = ezgo.Go2()
|
|
116
|
+
if robot.init():
|
|
117
|
+
# 步态模式切换
|
|
118
|
+
robot.FreeWalk(True) # 开启灵动模式
|
|
119
|
+
robot.FreeWalk(False) # 关闭灵动模式
|
|
120
|
+
|
|
121
|
+
# 特殊步态(自动演示后关闭)
|
|
122
|
+
robot.FreeBound(True) # 并腿跑模式(2秒后自动关闭)
|
|
123
|
+
robot.FreeJump(True) # 跳跃模式(4秒后自动关闭)
|
|
124
|
+
robot.FreeAvoid(True) # 闪避模式(2秒后自动关闭)
|
|
125
|
+
robot.WalkUpright(True) # 后腿直立模式(4秒后自动关闭)
|
|
126
|
+
robot.CrossStep(True) # 交叉步模式(4秒后自动关闭)
|
|
127
|
+
|
|
128
|
+
# 常规运动模式
|
|
129
|
+
robot.TrotRun() # 进入常规跑步模式
|
|
130
|
+
robot.StaticWalk() # 进入常规行走模式
|
|
131
|
+
robot.EconomicGait() # 进入常规续航模式
|
|
132
|
+
robot.ClassicWalk(True) # 开启经典步态
|
|
133
|
+
robot.ClassicWalk(False) # 关闭经典步态
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 特技动作
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
import ezgo
|
|
140
|
+
|
|
141
|
+
robot = ezgo.Go2()
|
|
142
|
+
if robot.init():
|
|
143
|
+
# 表演动作
|
|
144
|
+
robot.Hello() # 打招呼
|
|
145
|
+
robot.Stretch() # 伸懒腰
|
|
146
|
+
robot.Content() # 开心
|
|
147
|
+
robot.Heart() # 比心
|
|
148
|
+
robot.Scrape() # 拜年作揖
|
|
149
|
+
robot.Dance1() # 舞蹈段落1
|
|
150
|
+
robot.Dance2() # 舞蹈段落2
|
|
151
|
+
|
|
152
|
+
# 特技动作
|
|
153
|
+
robot.FrontJump() # 前跳
|
|
154
|
+
robot.FrontPounce() # 向前扑人
|
|
155
|
+
robot.LeftFlip() # 左空翻
|
|
156
|
+
robot.BackFlip() # 后空翻
|
|
157
|
+
robot.HandStand(True) # 倒立(4秒后自动关闭)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 自动翻身功能
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
import ezgo
|
|
164
|
+
|
|
165
|
+
robot = ezgo.Go2()
|
|
166
|
+
if robot.init():
|
|
167
|
+
# 设置自动翻身
|
|
168
|
+
success = robot.AutoRecoverSet(True)
|
|
169
|
+
if success:
|
|
170
|
+
print("自动翻身已开启")
|
|
171
|
+
|
|
172
|
+
# 查询自动翻身状态
|
|
173
|
+
is_enabled = robot.AutoRecoverGet()
|
|
174
|
+
print(f"自动翻身状态: {'开启' if is_enabled else '关闭'}")
|
|
175
|
+
|
|
176
|
+
# 关闭自动翻身
|
|
177
|
+
robot.AutoRecoverSet(False)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## API 参考
|
|
181
|
+
|
|
182
|
+
### Go2 类
|
|
183
|
+
|
|
184
|
+
主要的机器狗控制类,提供运动控制和状态管理功能。
|
|
185
|
+
|
|
186
|
+
#### 主要方法
|
|
187
|
+
|
|
188
|
+
**基础控制**:
|
|
189
|
+
- `init()`: 初始化与Go2的连接
|
|
190
|
+
- `Damp()`: 进入阻尼状态
|
|
191
|
+
- `BalanceStand()`: 平衡站立
|
|
192
|
+
- `StopMove()`: 停止所有移动动作
|
|
193
|
+
- `StandUp()`: 关节锁定,站高
|
|
194
|
+
- `StandDown()`: 关节锁定,站低
|
|
195
|
+
- `Sit()`: 坐下
|
|
196
|
+
- `RiseSit()`: 站起(相对于坐下)
|
|
197
|
+
|
|
198
|
+
**移动控制**:
|
|
199
|
+
- `Move(vx, vy, vyaw)`: 移动(速度范围:vx, vy: -1~1, vyaw: -2~2)
|
|
200
|
+
- `MoveForDuration(vx, vy, vyaw, duration)`: 持续移动指定时间
|
|
201
|
+
- `StartMove(vx, vy, vyaw)`: 开始持续移动
|
|
202
|
+
- `Forward(speed=0.3, duration=2.0)`: 向前移动
|
|
203
|
+
- `Backward(speed=0.3, duration=2.0)`: 向后移动
|
|
204
|
+
- `Left(speed=0.3, duration=2.0)`: 向左移动
|
|
205
|
+
- `Right(speed=0.3, duration=2.0)`: 向右移动
|
|
206
|
+
- `TurnLeft(speed=0.5, duration=2.0)`: 左转
|
|
207
|
+
- `TurnRight(speed=0.5, duration=2.0)`: 右转
|
|
208
|
+
|
|
209
|
+
**步态模式**:
|
|
210
|
+
- `FreeWalk(flag=None)`: 灵动模式(默认步态)
|
|
211
|
+
- `FreeBound(flag)`: 并腿跑模式
|
|
212
|
+
- `FreeJump(flag)`: 跳跃模式
|
|
213
|
+
- `FreeAvoid(flag)`: 闪避模式
|
|
214
|
+
- `WalkUpright(flag)`: 后腿直立模式
|
|
215
|
+
- `CrossStep(flag)`: 交叉步模式
|
|
216
|
+
- `ClassicWalk(flag)`: 经典步态
|
|
217
|
+
- `TrotRun()`: 进入常规跑步模式
|
|
218
|
+
- `StaticWalk()`: 进入常规行走模式
|
|
219
|
+
- `EconomicGait()`: 进入常规续航模式
|
|
220
|
+
|
|
221
|
+
**表演动作**:
|
|
222
|
+
- `Hello()`: 打招呼
|
|
223
|
+
- `Stretch()`: 伸懒腰
|
|
224
|
+
- `Content()`: 开心
|
|
225
|
+
- `Heart()`: 比心
|
|
226
|
+
- `Scrape()`: 拜年作揖
|
|
227
|
+
- `Dance1()`: 舞蹈段落1
|
|
228
|
+
- `Dance2()`: 舞蹈段落2
|
|
229
|
+
|
|
230
|
+
**特技动作**:
|
|
231
|
+
- `FrontJump()`: 前跳
|
|
232
|
+
- `FrontPounce()`: 向前扑人
|
|
233
|
+
- `LeftFlip()`: 左空翻
|
|
234
|
+
- `BackFlip()`: 后空翻
|
|
235
|
+
- `HandStand(flag)`: 倒立行走
|
|
236
|
+
|
|
237
|
+
**自动功能**:
|
|
238
|
+
- `AutoRecoverSet(flag)`: 设置自动翻身是否生效
|
|
239
|
+
- `AutoRecoverGet()`: 查询自动翻身是否生效
|
|
240
|
+
- `SwitchAvoidMode()`: 闪避模式下,关闭摇杆未推时前方障碍物的闪避
|
|
241
|
+
|
|
242
|
+
**便利方法**:
|
|
243
|
+
- `get_camera()`: 获取摄像头控制对象
|
|
244
|
+
- `get_vui()`: 获取声光控制对象
|
|
245
|
+
- `capture_image(save_path=None)`: 获取一张图片
|
|
246
|
+
- `start_video_stream(width=480, height=320)`: 开始视频流
|
|
247
|
+
- `get_video_frame()`: 获取最新视频帧
|
|
248
|
+
- `stop_video_stream()`: 停止视频流
|
|
249
|
+
- `cleanup()`: 清理资源
|
|
250
|
+
|
|
251
|
+
### Go2Camera 类
|
|
252
|
+
|
|
253
|
+
摄像头控制类,提供图片获取和视频流功能。
|
|
254
|
+
|
|
255
|
+
#### 主要方法
|
|
256
|
+
|
|
257
|
+
- `init()`: 初始化摄像头连接
|
|
258
|
+
- `capture_image(save_path=None)`: 获取单张图片
|
|
259
|
+
- `open_video_stream(width=480, height=320)`: 打开视频流
|
|
260
|
+
- `read_frame()`: 从视频流读取一帧
|
|
261
|
+
- `start_stream(width=480, height=320)`: 开始后台视频流
|
|
262
|
+
|
|
263
|
+
### Go2VUI 类
|
|
264
|
+
|
|
265
|
+
声光控制类,提供LED灯光和音量控制功能。
|
|
266
|
+
|
|
267
|
+
#### 主要方法
|
|
268
|
+
|
|
269
|
+
- `init()`: 初始化VUI客户端
|
|
270
|
+
- `set_brightness(level)`: 设置LED亮度 (0-10)
|
|
271
|
+
- `get_brightness()`: 获取当前LED亮度
|
|
272
|
+
- `set_volume(level)`: 设置音量 (0-10)
|
|
273
|
+
- `get_volume()`: 获取当前音量
|
|
274
|
+
|
|
275
|
+
## 依赖要求
|
|
276
|
+
|
|
277
|
+
### 核心依赖
|
|
278
|
+
- Python >= 3.7
|
|
279
|
+
|
|
280
|
+
### 可选依赖
|
|
281
|
+
|
|
282
|
+
**基础功能**:
|
|
283
|
+
- opencv-python >= 4.5.0
|
|
284
|
+
- numpy >= 1.19.0
|
|
285
|
+
- Pillow >= 8.0.0
|
|
286
|
+
|
|
287
|
+
**完整功能**:
|
|
288
|
+
- netifaces >= 0.10.0
|
|
289
|
+
- unitree-sdk2py (需要从官方源安装)
|
|
290
|
+
|
|
291
|
+
## 注意事项
|
|
292
|
+
|
|
293
|
+
1. **网络连接**: 确保计算机与Go2机器狗在同一网络中
|
|
294
|
+
2. **权限要求**: 某些功能可能需要管理员权限
|
|
295
|
+
3. **依赖安装**: `unitree-sdk2py` 需要从宇树官方源安装
|
|
296
|
+
4. **接口检测**: 库会自动检测网络接口,也可手动指定
|
|
297
|
+
|
|
298
|
+
## 故障排除
|
|
299
|
+
|
|
300
|
+
### 常见问题
|
|
301
|
+
|
|
302
|
+
1. **导入错误**: 确保已安装所有必需的依赖包
|
|
303
|
+
2. **连接失败**: 检查网络连接和防火墙设置
|
|
304
|
+
3. **摄像头问题**: 确保GStreamer正确安装
|
|
305
|
+
4. **权限问题**: 在某些系统上可能需要管理员权限
|
|
306
|
+
|
|
307
|
+
### 依赖安装
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# 安装基础依赖
|
|
311
|
+
pip install opencv-python numpy Pillow netifaces
|
|
312
|
+
|
|
313
|
+
# unitree-sdk2py 需要从官方源安装
|
|
314
|
+
# 请参考宇树官方文档
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## 许可证
|
|
318
|
+
|
|
319
|
+
本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。
|
|
320
|
+
|
|
321
|
+
## 贡献
|
|
322
|
+
|
|
323
|
+
欢迎提交 Issue 和 Pull Request!
|
|
324
|
+
|
|
325
|
+
## 更新日志
|
|
326
|
+
|
|
327
|
+
### v0.0.5 (2025-12-04)
|
|
328
|
+
**新增功能**:
|
|
329
|
+
- ✨ 新增15种高级运动模式和特技动作
|
|
330
|
+
- ✨ 支持灵动模式、并腿跑、跳跃跑、交叉步等多种步态
|
|
331
|
+
- ✨ 新增空翻、倒立、舞蹈等表演动作
|
|
332
|
+
- ✨ 增加自动翻身功能设置和查询
|
|
333
|
+
- ✨ 完善移动控制API,支持持续移动和定时移动
|
|
334
|
+
|
|
335
|
+
**改进**:
|
|
336
|
+
- 🔧 优化网络连接检查,支持非sudo ping
|
|
337
|
+
- 🔧 改进初始化流程,连接失败时仅显示警告
|
|
338
|
+
- 🔧 增强错误处理,对不支持的SDK版本提供友好提示
|
|
339
|
+
- 🔧 所有新函数都包含适当的异常处理
|
|
340
|
+
|
|
341
|
+
**修复**:
|
|
342
|
+
- 🐛 修复包构建问题,确保源代码正确包含
|
|
343
|
+
- 🐛 修复依赖配置,核心库无强制依赖
|
|
344
|
+
|
|
345
|
+
### v0.0.4 (2025-12-04)
|
|
346
|
+
**修复**:
|
|
347
|
+
- 🐛 修复包结构问题,源代码未正确包含在PyPI包中
|
|
348
|
+
- 🔧 重新组织包结构,确保所有模块正确打包
|
|
349
|
+
|
|
350
|
+
### v0.0.3 (2025-12-04)
|
|
351
|
+
**改进**:
|
|
352
|
+
- 🔧 优化依赖配置,移除强制依赖
|
|
353
|
+
- 📦 所有依赖改为可选依赖,支持按需安装
|
|
354
|
+
- 📚 更新安装说明和依赖文档
|
|
355
|
+
|
|
356
|
+
### v0.0.2 (2025-12-04)
|
|
357
|
+
**新增功能**:
|
|
358
|
+
- ✨ 集成go2_vui声光控制模块
|
|
359
|
+
- ✨ 集成go2_camera摄像头控制模块
|
|
360
|
+
- ✨ 优化模块导入结构,使用相对导入
|
|
361
|
+
|
|
362
|
+
**改进**:
|
|
363
|
+
- 🔧 修复get_camera方法路径配置
|
|
364
|
+
- 🔧 添加get_vui方法支持声光控制
|
|
365
|
+
- 🔧 完善懒加载机制
|
|
366
|
+
|
|
367
|
+
### v0.0.1 (2025-12-04)
|
|
368
|
+
**初始发布**:
|
|
369
|
+
- 🎉 基础运动控制功能
|
|
370
|
+
- 📷 摄像头基础支持
|
|
371
|
+
- 🔊 声光控制基础支持
|
|
372
|
+
- 📦 PyPI包发布
|
|
373
|
+
|
|
374
|
+
### v0.0.2
|
|
375
|
+
- 添加了 Go2Camera 摄像头控制类
|
|
376
|
+
- 添加了 Go2VUI 声光控制类
|
|
377
|
+
- 优化了导入和错误处理
|
|
378
|
+
- 改进了文档和示例
|
|
379
|
+
|
|
380
|
+
### v0.0.1
|
|
381
|
+
- 初始版本发布
|
|
382
|
+
- 基本运动控制功能
|
|
383
|
+
- UI界面支持
|
|
384
|
+
|
|
385
|
+
## 链接
|
|
386
|
+
|
|
387
|
+
- [PyPI 项目页面](https://pypi.org/project/ezgo/)
|
|
388
|
+
- [GitHub 仓库](https://github.com/your-username/ezgo)
|
|
389
|
+
- [问题反馈](https://github.com/your-username/ezgo/issues)
|
|
@@ -87,7 +87,13 @@ class Go2:
|
|
|
87
87
|
def check_go2_connection(self):
|
|
88
88
|
"""检查机器狗IP连通性"""
|
|
89
89
|
try:
|
|
90
|
-
#
|
|
90
|
+
# 先尝试不使用sudo ping
|
|
91
|
+
result = subprocess.run(['ping', '-c', '1', '-W', '2', '192.168.123.161'],
|
|
92
|
+
capture_output=True, text=True, timeout=5)
|
|
93
|
+
if result.returncode == 0:
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
# 如果不使用sudo失败,尝试使用sudo
|
|
91
97
|
result = subprocess.run(['sudo', 'ping', '-c', '1', '-W', '2', '192.168.123.161'],
|
|
92
98
|
capture_output=True, text=True, timeout=5)
|
|
93
99
|
return result.returncode == 0
|
|
@@ -104,26 +110,31 @@ class Go2:
|
|
|
104
110
|
def init(self):
|
|
105
111
|
"""初始化与Go2的连接"""
|
|
106
112
|
|
|
107
|
-
# 检查机器狗IP
|
|
113
|
+
# 检查机器狗IP连通性(仅作为警告,不阻止初始化)
|
|
108
114
|
if not self.check_go2_connection():
|
|
109
|
-
print("
|
|
110
|
-
|
|
115
|
+
print("警告:无法ping通机器狗IP,但继续尝试初始化SDK")
|
|
116
|
+
print("请确保机器狗已开机且网络连接正常")
|
|
111
117
|
|
|
112
|
-
|
|
118
|
+
try:
|
|
119
|
+
ChannelFactoryInitialize(0, self.interface)
|
|
113
120
|
|
|
114
|
-
|
|
115
|
-
|
|
121
|
+
# 启动状态订阅
|
|
122
|
+
self.sub_state(self.callback)
|
|
116
123
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
# 初始化运动控制客户端
|
|
125
|
+
self.sport_client = SportClient()
|
|
126
|
+
self.sport_client.SetTimeout(self.timeout)
|
|
127
|
+
self.sport_client.Init()
|
|
128
|
+
|
|
129
|
+
# 注意:视频流不再自动初始化,按需开启
|
|
130
|
+
# self.cap = self.open_video() # 移除自动初始化
|
|
131
|
+
|
|
132
|
+
self._initialized = True
|
|
133
|
+
print("Go2 SDK初始化成功")
|
|
134
|
+
return True
|
|
135
|
+
except Exception as e:
|
|
136
|
+
print(f"SDK初始化失败: {e}")
|
|
137
|
+
return False
|
|
127
138
|
|
|
128
139
|
|
|
129
140
|
def open_video(self, width: int = 480, height: int = 320):
|
|
@@ -594,67 +605,174 @@ class Go2:
|
|
|
594
605
|
|
|
595
606
|
def HandStand(self, flag: int):
|
|
596
607
|
"""倒立行走。"""
|
|
597
|
-
|
|
608
|
+
# 执行指令
|
|
609
|
+
self._call(lambda: self.sport_client.HandStand(bool(flag)))
|
|
610
|
+
if flag:
|
|
611
|
+
time.sleep(4)
|
|
612
|
+
self._call(lambda: self.sport_client.HandStand(False))
|
|
598
613
|
|
|
599
614
|
def LeftFlip(self):
|
|
600
615
|
"""左空翻。"""
|
|
601
|
-
|
|
616
|
+
# 执行指令
|
|
617
|
+
result = self._call(self.sport_client.LeftFlip)
|
|
618
|
+
return result == 0 if result is not None else False
|
|
602
619
|
|
|
603
620
|
def BackFlip(self):
|
|
604
621
|
"""后空翻。"""
|
|
605
|
-
|
|
622
|
+
# 执行指令
|
|
623
|
+
result = self._call(self.sport_client.BackFlip)
|
|
624
|
+
return result == 0 if result is not None else False
|
|
606
625
|
|
|
607
|
-
def FreeWalk(self, flag: int):
|
|
626
|
+
def FreeWalk(self, flag: int = None):
|
|
608
627
|
""" 灵动模式(默认步态)。"""
|
|
609
|
-
|
|
628
|
+
# 执行指令
|
|
629
|
+
if flag is None:
|
|
630
|
+
# 切换模式
|
|
631
|
+
result = self._call(lambda: self.sport_client.FreeWalk())
|
|
632
|
+
else:
|
|
633
|
+
# 根据flag值执行相应操作
|
|
634
|
+
if flag:
|
|
635
|
+
# 开启灵动模式
|
|
636
|
+
result = self._call(lambda: self.sport_client.FreeWalk())
|
|
637
|
+
else:
|
|
638
|
+
# 关闭灵动模式 - 切换到其他模式
|
|
639
|
+
result = self._call(lambda: self.sport_client.StandUp())
|
|
640
|
+
return result == 0 if result is not None else False
|
|
610
641
|
|
|
611
642
|
def FreeBound(self, flag: int):
|
|
612
643
|
""" 并腿跑模式。"""
|
|
613
|
-
|
|
644
|
+
# 执行指令
|
|
645
|
+
result = self._call(lambda: self.sport_client.FreeBound(bool(flag)))
|
|
646
|
+
success = result == 0 if result is not None else False
|
|
647
|
+
|
|
648
|
+
if flag and success:
|
|
649
|
+
# 如果成功开启,等待2秒后自动关闭(这是为了演示效果)
|
|
650
|
+
time.sleep(2)
|
|
651
|
+
self._call(lambda: self.sport_client.FreeBound(False))
|
|
652
|
+
|
|
653
|
+
return success
|
|
614
654
|
|
|
615
655
|
def FreeJump(self, flag: int):
|
|
616
656
|
""" 跳跃模式。"""
|
|
617
|
-
|
|
657
|
+
# 执行指令
|
|
658
|
+
result = self._call(lambda: self.sport_client.FreeJump(bool(flag)))
|
|
659
|
+
success = result == 0 if result is not None else False
|
|
660
|
+
|
|
661
|
+
if flag and success:
|
|
662
|
+
# 如果成功开启,等待4秒后自动关闭(这是为了演示效果)
|
|
663
|
+
time.sleep(4)
|
|
664
|
+
self._call(lambda: self.sport_client.FreeJump(False))
|
|
665
|
+
|
|
666
|
+
return success
|
|
618
667
|
|
|
619
668
|
def FreeAvoid(self, flag: int):
|
|
620
669
|
""" 闪避模式。"""
|
|
621
|
-
|
|
670
|
+
# 执行指令
|
|
671
|
+
result = self._call(lambda: self.sport_client.FreeAvoid(bool(flag)))
|
|
672
|
+
success = result == 0 if result is not None else False
|
|
673
|
+
|
|
674
|
+
if flag and success:
|
|
675
|
+
# 如果成功开启,等待2秒后自动关闭(这是为了演示效果)
|
|
676
|
+
time.sleep(2)
|
|
677
|
+
self._call(lambda: self.sport_client.FreeAvoid(False))
|
|
678
|
+
|
|
679
|
+
return success
|
|
622
680
|
|
|
623
681
|
def WalkUpright(self, flag: int):
|
|
624
682
|
""" 后腿直立模式。"""
|
|
625
|
-
|
|
683
|
+
# 执行指令
|
|
684
|
+
result = self._call(lambda: self.sport_client.WalkUpright(bool(flag)))
|
|
685
|
+
success = result == 0 if result is not None else False
|
|
686
|
+
|
|
687
|
+
if flag and success:
|
|
688
|
+
# 如果成功开启,等待4秒后自动关闭(这是为了演示效果)
|
|
689
|
+
time.sleep(4)
|
|
690
|
+
self._call(lambda: self.sport_client.WalkUpright(False))
|
|
691
|
+
|
|
692
|
+
return success
|
|
626
693
|
|
|
627
694
|
def CrossStep(self, flag: int):
|
|
628
695
|
""" 交叉步模式。"""
|
|
629
|
-
|
|
696
|
+
# 执行指令
|
|
697
|
+
result = self._call(lambda: self.sport_client.CrossStep(bool(flag)))
|
|
698
|
+
success = result == 0 if result is not None else False
|
|
699
|
+
|
|
700
|
+
if flag and success:
|
|
701
|
+
# 如果成功开启,等待4秒后自动关闭(这是为了演示效果)
|
|
702
|
+
time.sleep(4)
|
|
703
|
+
self._call(lambda: self.sport_client.CrossStep(False))
|
|
704
|
+
|
|
705
|
+
return success
|
|
630
706
|
|
|
631
707
|
def AutoRecoverSet(self, flag: int):
|
|
632
708
|
""" 设置自动翻身是否生效。"""
|
|
633
|
-
|
|
709
|
+
try:
|
|
710
|
+
# 执行指令
|
|
711
|
+
result = self._call(lambda: self.sport_client.AutoRecoverSet(bool(flag)))
|
|
712
|
+
return result == 0 if result is not None else False
|
|
713
|
+
except AttributeError:
|
|
714
|
+
print("警告: AutoRecoverSet 方法在当前SDK版本中不可用")
|
|
715
|
+
return False
|
|
634
716
|
|
|
635
717
|
def AutoRecoverGet(self):
|
|
636
718
|
""" 查询自动翻身是否生效。"""
|
|
637
|
-
|
|
719
|
+
try:
|
|
720
|
+
# 执行指令
|
|
721
|
+
result = self._call(self.sport_client.AutoRecoverGet)
|
|
722
|
+
return result if result is not None else False
|
|
723
|
+
except AttributeError:
|
|
724
|
+
print("警告: AutoRecoverGet 方法在当前SDK版本中不可用")
|
|
725
|
+
return False
|
|
638
726
|
|
|
639
727
|
def ClassicWalk(self, flag: int):
|
|
640
728
|
""" 经典步态。"""
|
|
641
|
-
|
|
729
|
+
try:
|
|
730
|
+
# 执行指令
|
|
731
|
+
result = self._call(lambda: self.sport_client.ClassicWalk(bool(flag)))
|
|
732
|
+
return result == 0 if result is not None else False
|
|
733
|
+
except AttributeError:
|
|
734
|
+
print("警告: ClassicWalk 方法在当前SDK版本中不可用")
|
|
735
|
+
return False
|
|
642
736
|
|
|
643
737
|
def TrotRun(self):
|
|
644
738
|
""" 进入常规跑步模式 """
|
|
645
|
-
|
|
739
|
+
try:
|
|
740
|
+
# 执行指令
|
|
741
|
+
result = self._call(self.sport_client.TrotRun)
|
|
742
|
+
return result == 0 if result is not None else False
|
|
743
|
+
except AttributeError:
|
|
744
|
+
print("警告: TrotRun 方法在当前SDK版本中不可用")
|
|
745
|
+
return False
|
|
646
746
|
|
|
647
747
|
def StaticWalk(self):
|
|
648
748
|
""" 进入常规行走模式"""
|
|
649
|
-
|
|
749
|
+
try:
|
|
750
|
+
# 执行指令
|
|
751
|
+
result = self._call(self.sport_client.StaticWalk)
|
|
752
|
+
return result == 0 if result is not None else False
|
|
753
|
+
except AttributeError:
|
|
754
|
+
print("警告: StaticWalk 方法在当前SDK版本中不可用")
|
|
755
|
+
return False
|
|
650
756
|
|
|
651
757
|
def EconomicGait(self):
|
|
652
758
|
""" 进入常规续航模式 """
|
|
653
|
-
|
|
759
|
+
try:
|
|
760
|
+
# 执行指令
|
|
761
|
+
result = self._call(self.sport_client.EconomicGait)
|
|
762
|
+
return result == 0 if result is not None else False
|
|
763
|
+
except AttributeError:
|
|
764
|
+
print("警告: EconomicGait 方法在当前SDK版本中不可用")
|
|
765
|
+
return False
|
|
654
766
|
|
|
655
767
|
def SwitchAvoidMode(self):
|
|
656
768
|
""" 闪避模式下,关闭摇杆未推时前方障碍物的闪避以及后方的障碍物躲避"""
|
|
657
|
-
|
|
769
|
+
try:
|
|
770
|
+
# 执行指令
|
|
771
|
+
result = self._call(self.sport_client.SwitchAvoidMode)
|
|
772
|
+
return result == 0 if result is not None else False
|
|
773
|
+
except AttributeError:
|
|
774
|
+
print("警告: SwitchAvoidMode 方法在当前SDK版本中不可用")
|
|
775
|
+
return False
|
|
658
776
|
|
|
659
777
|
def get_camera(self):
|
|
660
778
|
"""
|
|
@@ -674,7 +792,7 @@ class Go2:
|
|
|
674
792
|
"""
|
|
675
793
|
获取声光控制对象(按需初始化)
|
|
676
794
|
|
|
677
|
-
Returns:
|
|
795
|
+
Returns:
|
|
678
796
|
Go2VUI: 声光控制对象
|
|
679
797
|
"""
|
|
680
798
|
if not hasattr(self, '_vui') or self._vui is None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ezgo
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.6
|
|
4
4
|
Summary: 宇树Go2机器狗Python控制库
|
|
5
5
|
Author-email: ezgo <noreply@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -43,7 +43,9 @@ Requires-Dist: Pillow>=8.0.0; extra == "basic"
|
|
|
43
43
|
|
|
44
44
|
## 功能特性
|
|
45
45
|
|
|
46
|
-
- 🚶
|
|
46
|
+
- 🚶 **基础运动控制**: 支持阻尼、站立、坐下、行走等基本动作
|
|
47
|
+
- 🏃 **高级运动模式**: 支持灵动、并腿跑、跳跃跑、交叉步等多种步态
|
|
48
|
+
- 🤸 **特技动作**: 支持空翻、倒立、舞蹈等表演动作
|
|
47
49
|
- 📷 **摄像头控制**: 支持图片获取和视频流处理
|
|
48
50
|
- 🔊 **声光控制**: 支持LED灯光和音量控制
|
|
49
51
|
- 🎮 **UI界面**: 提供图形化控制界面
|
|
@@ -140,6 +142,76 @@ if vui.init():
|
|
|
140
142
|
vui.set_volume(3)
|
|
141
143
|
```
|
|
142
144
|
|
|
145
|
+
### 高级运动模式
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
import ezgo
|
|
149
|
+
|
|
150
|
+
robot = ezgo.Go2()
|
|
151
|
+
if robot.init():
|
|
152
|
+
# 步态模式切换
|
|
153
|
+
robot.FreeWalk(True) # 开启灵动模式
|
|
154
|
+
robot.FreeWalk(False) # 关闭灵动模式
|
|
155
|
+
|
|
156
|
+
# 特殊步态(自动演示后关闭)
|
|
157
|
+
robot.FreeBound(True) # 并腿跑模式(2秒后自动关闭)
|
|
158
|
+
robot.FreeJump(True) # 跳跃模式(4秒后自动关闭)
|
|
159
|
+
robot.FreeAvoid(True) # 闪避模式(2秒后自动关闭)
|
|
160
|
+
robot.WalkUpright(True) # 后腿直立模式(4秒后自动关闭)
|
|
161
|
+
robot.CrossStep(True) # 交叉步模式(4秒后自动关闭)
|
|
162
|
+
|
|
163
|
+
# 常规运动模式
|
|
164
|
+
robot.TrotRun() # 进入常规跑步模式
|
|
165
|
+
robot.StaticWalk() # 进入常规行走模式
|
|
166
|
+
robot.EconomicGait() # 进入常规续航模式
|
|
167
|
+
robot.ClassicWalk(True) # 开启经典步态
|
|
168
|
+
robot.ClassicWalk(False) # 关闭经典步态
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 特技动作
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
import ezgo
|
|
175
|
+
|
|
176
|
+
robot = ezgo.Go2()
|
|
177
|
+
if robot.init():
|
|
178
|
+
# 表演动作
|
|
179
|
+
robot.Hello() # 打招呼
|
|
180
|
+
robot.Stretch() # 伸懒腰
|
|
181
|
+
robot.Content() # 开心
|
|
182
|
+
robot.Heart() # 比心
|
|
183
|
+
robot.Scrape() # 拜年作揖
|
|
184
|
+
robot.Dance1() # 舞蹈段落1
|
|
185
|
+
robot.Dance2() # 舞蹈段落2
|
|
186
|
+
|
|
187
|
+
# 特技动作
|
|
188
|
+
robot.FrontJump() # 前跳
|
|
189
|
+
robot.FrontPounce() # 向前扑人
|
|
190
|
+
robot.LeftFlip() # 左空翻
|
|
191
|
+
robot.BackFlip() # 后空翻
|
|
192
|
+
robot.HandStand(True) # 倒立(4秒后自动关闭)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 自动翻身功能
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
import ezgo
|
|
199
|
+
|
|
200
|
+
robot = ezgo.Go2()
|
|
201
|
+
if robot.init():
|
|
202
|
+
# 设置自动翻身
|
|
203
|
+
success = robot.AutoRecoverSet(True)
|
|
204
|
+
if success:
|
|
205
|
+
print("自动翻身已开启")
|
|
206
|
+
|
|
207
|
+
# 查询自动翻身状态
|
|
208
|
+
is_enabled = robot.AutoRecoverGet()
|
|
209
|
+
print(f"自动翻身状态: {'开启' if is_enabled else '关闭'}")
|
|
210
|
+
|
|
211
|
+
# 关闭自动翻身
|
|
212
|
+
robot.AutoRecoverSet(False)
|
|
213
|
+
```
|
|
214
|
+
|
|
143
215
|
## API 参考
|
|
144
216
|
|
|
145
217
|
### Go2 类
|
|
@@ -148,12 +220,68 @@ if vui.init():
|
|
|
148
220
|
|
|
149
221
|
#### 主要方法
|
|
150
222
|
|
|
223
|
+
**基础控制**:
|
|
151
224
|
- `init()`: 初始化与Go2的连接
|
|
152
225
|
- `Damp()`: 进入阻尼状态
|
|
153
226
|
- `BalanceStand()`: 平衡站立
|
|
154
227
|
- `StopMove()`: 停止所有移动动作
|
|
228
|
+
- `StandUp()`: 关节锁定,站高
|
|
229
|
+
- `StandDown()`: 关节锁定,站低
|
|
230
|
+
- `Sit()`: 坐下
|
|
231
|
+
- `RiseSit()`: 站起(相对于坐下)
|
|
232
|
+
|
|
233
|
+
**移动控制**:
|
|
234
|
+
- `Move(vx, vy, vyaw)`: 移动(速度范围:vx, vy: -1~1, vyaw: -2~2)
|
|
235
|
+
- `MoveForDuration(vx, vy, vyaw, duration)`: 持续移动指定时间
|
|
236
|
+
- `StartMove(vx, vy, vyaw)`: 开始持续移动
|
|
237
|
+
- `Forward(speed=0.3, duration=2.0)`: 向前移动
|
|
238
|
+
- `Backward(speed=0.3, duration=2.0)`: 向后移动
|
|
239
|
+
- `Left(speed=0.3, duration=2.0)`: 向左移动
|
|
240
|
+
- `Right(speed=0.3, duration=2.0)`: 向右移动
|
|
241
|
+
- `TurnLeft(speed=0.5, duration=2.0)`: 左转
|
|
242
|
+
- `TurnRight(speed=0.5, duration=2.0)`: 右转
|
|
243
|
+
|
|
244
|
+
**步态模式**:
|
|
245
|
+
- `FreeWalk(flag=None)`: 灵动模式(默认步态)
|
|
246
|
+
- `FreeBound(flag)`: 并腿跑模式
|
|
247
|
+
- `FreeJump(flag)`: 跳跃模式
|
|
248
|
+
- `FreeAvoid(flag)`: 闪避模式
|
|
249
|
+
- `WalkUpright(flag)`: 后腿直立模式
|
|
250
|
+
- `CrossStep(flag)`: 交叉步模式
|
|
251
|
+
- `ClassicWalk(flag)`: 经典步态
|
|
252
|
+
- `TrotRun()`: 进入常规跑步模式
|
|
253
|
+
- `StaticWalk()`: 进入常规行走模式
|
|
254
|
+
- `EconomicGait()`: 进入常规续航模式
|
|
255
|
+
|
|
256
|
+
**表演动作**:
|
|
257
|
+
- `Hello()`: 打招呼
|
|
258
|
+
- `Stretch()`: 伸懒腰
|
|
259
|
+
- `Content()`: 开心
|
|
260
|
+
- `Heart()`: 比心
|
|
261
|
+
- `Scrape()`: 拜年作揖
|
|
262
|
+
- `Dance1()`: 舞蹈段落1
|
|
263
|
+
- `Dance2()`: 舞蹈段落2
|
|
264
|
+
|
|
265
|
+
**特技动作**:
|
|
266
|
+
- `FrontJump()`: 前跳
|
|
267
|
+
- `FrontPounce()`: 向前扑人
|
|
268
|
+
- `LeftFlip()`: 左空翻
|
|
269
|
+
- `BackFlip()`: 后空翻
|
|
270
|
+
- `HandStand(flag)`: 倒立行走
|
|
271
|
+
|
|
272
|
+
**自动功能**:
|
|
273
|
+
- `AutoRecoverSet(flag)`: 设置自动翻身是否生效
|
|
274
|
+
- `AutoRecoverGet()`: 查询自动翻身是否生效
|
|
275
|
+
- `SwitchAvoidMode()`: 闪避模式下,关闭摇杆未推时前方障碍物的闪避
|
|
276
|
+
|
|
277
|
+
**便利方法**:
|
|
155
278
|
- `get_camera()`: 获取摄像头控制对象
|
|
156
279
|
- `get_vui()`: 获取声光控制对象
|
|
280
|
+
- `capture_image(save_path=None)`: 获取一张图片
|
|
281
|
+
- `start_video_stream(width=480, height=320)`: 开始视频流
|
|
282
|
+
- `get_video_frame()`: 获取最新视频帧
|
|
283
|
+
- `stop_video_stream()`: 停止视频流
|
|
284
|
+
- `cleanup()`: 清理资源
|
|
157
285
|
|
|
158
286
|
### Go2Camera 类
|
|
159
287
|
|
|
@@ -231,6 +359,53 @@ pip install opencv-python numpy Pillow netifaces
|
|
|
231
359
|
|
|
232
360
|
## 更新日志
|
|
233
361
|
|
|
362
|
+
### v0.0.5 (2025-12-04)
|
|
363
|
+
**新增功能**:
|
|
364
|
+
- ✨ 新增15种高级运动模式和特技动作
|
|
365
|
+
- ✨ 支持灵动模式、并腿跑、跳跃跑、交叉步等多种步态
|
|
366
|
+
- ✨ 新增空翻、倒立、舞蹈等表演动作
|
|
367
|
+
- ✨ 增加自动翻身功能设置和查询
|
|
368
|
+
- ✨ 完善移动控制API,支持持续移动和定时移动
|
|
369
|
+
|
|
370
|
+
**改进**:
|
|
371
|
+
- 🔧 优化网络连接检查,支持非sudo ping
|
|
372
|
+
- 🔧 改进初始化流程,连接失败时仅显示警告
|
|
373
|
+
- 🔧 增强错误处理,对不支持的SDK版本提供友好提示
|
|
374
|
+
- 🔧 所有新函数都包含适当的异常处理
|
|
375
|
+
|
|
376
|
+
**修复**:
|
|
377
|
+
- 🐛 修复包构建问题,确保源代码正确包含
|
|
378
|
+
- 🐛 修复依赖配置,核心库无强制依赖
|
|
379
|
+
|
|
380
|
+
### v0.0.4 (2025-12-04)
|
|
381
|
+
**修复**:
|
|
382
|
+
- 🐛 修复包结构问题,源代码未正确包含在PyPI包中
|
|
383
|
+
- 🔧 重新组织包结构,确保所有模块正确打包
|
|
384
|
+
|
|
385
|
+
### v0.0.3 (2025-12-04)
|
|
386
|
+
**改进**:
|
|
387
|
+
- 🔧 优化依赖配置,移除强制依赖
|
|
388
|
+
- 📦 所有依赖改为可选依赖,支持按需安装
|
|
389
|
+
- 📚 更新安装说明和依赖文档
|
|
390
|
+
|
|
391
|
+
### v0.0.2 (2025-12-04)
|
|
392
|
+
**新增功能**:
|
|
393
|
+
- ✨ 集成go2_vui声光控制模块
|
|
394
|
+
- ✨ 集成go2_camera摄像头控制模块
|
|
395
|
+
- ✨ 优化模块导入结构,使用相对导入
|
|
396
|
+
|
|
397
|
+
**改进**:
|
|
398
|
+
- 🔧 修复get_camera方法路径配置
|
|
399
|
+
- 🔧 添加get_vui方法支持声光控制
|
|
400
|
+
- 🔧 完善懒加载机制
|
|
401
|
+
|
|
402
|
+
### v0.0.1 (2025-12-04)
|
|
403
|
+
**初始发布**:
|
|
404
|
+
- 🎉 基础运动控制功能
|
|
405
|
+
- 📷 摄像头基础支持
|
|
406
|
+
- 🔊 声光控制基础支持
|
|
407
|
+
- 📦 PyPI包发布
|
|
408
|
+
|
|
234
409
|
### v0.0.2
|
|
235
410
|
- 添加了 Go2Camera 摄像头控制类
|
|
236
411
|
- 添加了 Go2VUI 声光控制类
|
ezgo-0.0.4/README.md
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
# ezgo - 宇树Go2机器狗Python控制库
|
|
2
|
-
|
|
3
|
-
[](https://badge.fury.io/py/ezgo)
|
|
4
|
-
[](https://pypi.org/project/ezgo/)
|
|
5
|
-
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
|
|
7
|
-
这是一个用于控制宇树Go2机器狗的Python库,提供了简单易用的API接口。支持运动控制、视频流获取、声光控制等功能。
|
|
8
|
-
|
|
9
|
-
## 功能特性
|
|
10
|
-
|
|
11
|
-
- 🚶 **运动控制**: 支持行走、跑步、跳跃等多种运动模式
|
|
12
|
-
- 📷 **摄像头控制**: 支持图片获取和视频流处理
|
|
13
|
-
- 🔊 **声光控制**: 支持LED灯光和音量控制
|
|
14
|
-
- 🎮 **UI界面**: 提供图形化控制界面
|
|
15
|
-
- 🔧 **易于使用**: 简洁的API设计,支持懒加载
|
|
16
|
-
- 📦 **可选依赖**: 核心功能轻量,按需安装依赖
|
|
17
|
-
|
|
18
|
-
## 安装
|
|
19
|
-
|
|
20
|
-
### 基础安装(仅核心库,无强制依赖)
|
|
21
|
-
```bash
|
|
22
|
-
pip install ezgo
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 完整功能安装(包含所有可选依赖)
|
|
26
|
-
```bash
|
|
27
|
-
pip install ezgo[full]
|
|
28
|
-
n```
|
|
29
|
-
|
|
30
|
-
### 仅基础功能(图像处理相关依赖)
|
|
31
|
-
```bash
|
|
32
|
-
pip install ezgo[basic]
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
> **注意**: `ezgo` 核心库本身没有任何强制依赖。所有依赖都是可选的,您可以根据需要手动安装:
|
|
36
|
-
> - `unitree-sdk2py`: 机器人通信必需
|
|
37
|
-
> - `opencv-python`: 摄像头功能必需
|
|
38
|
-
> - `numpy`: 数值计算支持
|
|
39
|
-
> - `Pillow`: 图像处理支持
|
|
40
|
-
> - `netifaces`: �络接口检测
|
|
41
|
-
|
|
42
|
-
## 快速开始
|
|
43
|
-
|
|
44
|
-
### 基本运动控制
|
|
45
|
-
|
|
46
|
-
```python
|
|
47
|
-
import ezgo
|
|
48
|
-
|
|
49
|
-
# 创建Go2控制对象
|
|
50
|
-
robot = ezgo.Go2()
|
|
51
|
-
|
|
52
|
-
# 初始化连接
|
|
53
|
-
if robot.init():
|
|
54
|
-
print("连接成功!")
|
|
55
|
-
|
|
56
|
-
# 基本动作
|
|
57
|
-
robot.Damp() # 进入阻尼状态
|
|
58
|
-
robot.BalanceStand() # 平衡站立
|
|
59
|
-
robot.StopMove() # 停止移动
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### 摄像头控制
|
|
63
|
-
|
|
64
|
-
```python
|
|
65
|
-
import ezgo
|
|
66
|
-
|
|
67
|
-
# 方法1: 通过Go2对象获取摄像头
|
|
68
|
-
robot = ezgo.Go2()
|
|
69
|
-
camera = robot.get_camera()
|
|
70
|
-
|
|
71
|
-
# 方法2: 直接使用摄像头类
|
|
72
|
-
camera = ezgo.Go2Camera()
|
|
73
|
-
|
|
74
|
-
# 初始化摄像头
|
|
75
|
-
if camera.init():
|
|
76
|
-
# 获取单张图片
|
|
77
|
-
image = camera.capture_image("photo.jpg")
|
|
78
|
-
|
|
79
|
-
# 打开视频流
|
|
80
|
-
if camera.open_video_stream():
|
|
81
|
-
frame = camera.read_frame()
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### 声光控制
|
|
85
|
-
|
|
86
|
-
```python
|
|
87
|
-
import ezgo
|
|
88
|
-
|
|
89
|
-
# 方法1: 通过Go2对象获取VUI控制
|
|
90
|
-
robot = ezgo.Go2()
|
|
91
|
-
vui = robot.get_vui()
|
|
92
|
-
|
|
93
|
-
# 方法2: 直接使用VUI类
|
|
94
|
-
vui = ezgo.Go2VUI()
|
|
95
|
-
|
|
96
|
-
# 初始化VUI
|
|
97
|
-
if vui.init():
|
|
98
|
-
# 设置LED亮度 (0-10)
|
|
99
|
-
vui.set_brightness(5)
|
|
100
|
-
|
|
101
|
-
# 获取当前亮度
|
|
102
|
-
success, brightness = vui.get_brightness()
|
|
103
|
-
|
|
104
|
-
# 设置音量 (0-10)
|
|
105
|
-
vui.set_volume(3)
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## API 参考
|
|
109
|
-
|
|
110
|
-
### Go2 类
|
|
111
|
-
|
|
112
|
-
主要的机器狗控制类,提供运动控制和状态管理功能。
|
|
113
|
-
|
|
114
|
-
#### 主要方法
|
|
115
|
-
|
|
116
|
-
- `init()`: 初始化与Go2的连接
|
|
117
|
-
- `Damp()`: 进入阻尼状态
|
|
118
|
-
- `BalanceStand()`: 平衡站立
|
|
119
|
-
- `StopMove()`: 停止所有移动动作
|
|
120
|
-
- `get_camera()`: 获取摄像头控制对象
|
|
121
|
-
- `get_vui()`: 获取声光控制对象
|
|
122
|
-
|
|
123
|
-
### Go2Camera 类
|
|
124
|
-
|
|
125
|
-
摄像头控制类,提供图片获取和视频流功能。
|
|
126
|
-
|
|
127
|
-
#### 主要方法
|
|
128
|
-
|
|
129
|
-
- `init()`: 初始化摄像头连接
|
|
130
|
-
- `capture_image(save_path=None)`: 获取单张图片
|
|
131
|
-
- `open_video_stream(width=480, height=320)`: 打开视频流
|
|
132
|
-
- `read_frame()`: 从视频流读取一帧
|
|
133
|
-
- `start_stream(width=480, height=320)`: 开始后台视频流
|
|
134
|
-
|
|
135
|
-
### Go2VUI 类
|
|
136
|
-
|
|
137
|
-
声光控制类,提供LED灯光和音量控制功能。
|
|
138
|
-
|
|
139
|
-
#### 主要方法
|
|
140
|
-
|
|
141
|
-
- `init()`: 初始化VUI客户端
|
|
142
|
-
- `set_brightness(level)`: 设置LED亮度 (0-10)
|
|
143
|
-
- `get_brightness()`: 获取当前LED亮度
|
|
144
|
-
- `set_volume(level)`: 设置音量 (0-10)
|
|
145
|
-
- `get_volume()`: 获取当前音量
|
|
146
|
-
|
|
147
|
-
## 依赖要求
|
|
148
|
-
|
|
149
|
-
### 核心依赖
|
|
150
|
-
- Python >= 3.7
|
|
151
|
-
|
|
152
|
-
### 可选依赖
|
|
153
|
-
|
|
154
|
-
**基础功能**:
|
|
155
|
-
- opencv-python >= 4.5.0
|
|
156
|
-
- numpy >= 1.19.0
|
|
157
|
-
- Pillow >= 8.0.0
|
|
158
|
-
|
|
159
|
-
**完整功能**:
|
|
160
|
-
- netifaces >= 0.10.0
|
|
161
|
-
- unitree-sdk2py (需要从官方源安装)
|
|
162
|
-
|
|
163
|
-
## 注意事项
|
|
164
|
-
|
|
165
|
-
1. **网络连接**: 确保计算机与Go2机器狗在同一网络中
|
|
166
|
-
2. **权限要求**: 某些功能可能需要管理员权限
|
|
167
|
-
3. **依赖安装**: `unitree-sdk2py` 需要从宇树官方源安装
|
|
168
|
-
4. **接口检测**: 库会自动检测网络接口,也可手动指定
|
|
169
|
-
|
|
170
|
-
## 故障排除
|
|
171
|
-
|
|
172
|
-
### 常见问题
|
|
173
|
-
|
|
174
|
-
1. **导入错误**: 确保已安装所有必需的依赖包
|
|
175
|
-
2. **连接失败**: 检查网络连接和防火墙设置
|
|
176
|
-
3. **摄像头问题**: 确保GStreamer正确安装
|
|
177
|
-
4. **权限问题**: 在某些系统上可能需要管理员权限
|
|
178
|
-
|
|
179
|
-
### 依赖安装
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
# 安装基础依赖
|
|
183
|
-
pip install opencv-python numpy Pillow netifaces
|
|
184
|
-
|
|
185
|
-
# unitree-sdk2py 需要从官方源安装
|
|
186
|
-
# 请参考宇树官方文档
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## 许可证
|
|
190
|
-
|
|
191
|
-
本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。
|
|
192
|
-
|
|
193
|
-
## 贡献
|
|
194
|
-
|
|
195
|
-
欢迎提交 Issue 和 Pull Request!
|
|
196
|
-
|
|
197
|
-
## 更新日志
|
|
198
|
-
|
|
199
|
-
### v0.0.2
|
|
200
|
-
- 添加了 Go2Camera 摄像头控制类
|
|
201
|
-
- 添加了 Go2VUI 声光控制类
|
|
202
|
-
- 优化了导入和错误处理
|
|
203
|
-
- 改进了文档和示例
|
|
204
|
-
|
|
205
|
-
### v0.0.1
|
|
206
|
-
- 初始版本发布
|
|
207
|
-
- 基本运动控制功能
|
|
208
|
-
- UI界面支持
|
|
209
|
-
|
|
210
|
-
## 链接
|
|
211
|
-
|
|
212
|
-
- [PyPI 项目页面](https://pypi.org/project/ezgo/)
|
|
213
|
-
- [GitHub 仓库](https://github.com/your-username/ezgo)
|
|
214
|
-
- [问题反馈](https://github.com/your-username/ezgo/issues)
|
|
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
|