ezgo 0.0.15__py3-none-any.whl → 0.0.17__py3-none-any.whl
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/go2.py +66 -17
- {ezgo-0.0.15.dist-info → ezgo-0.0.17.dist-info}/METADATA +62 -15
- {ezgo-0.0.15.dist-info → ezgo-0.0.17.dist-info}/RECORD +6 -6
- {ezgo-0.0.15.dist-info → ezgo-0.0.17.dist-info}/WHEEL +1 -1
- {ezgo-0.0.15.dist-info → ezgo-0.0.17.dist-info}/LICENSE +0 -0
- {ezgo-0.0.15.dist-info → ezgo-0.0.17.dist-info}/top_level.txt +0 -0
ezgo/go2.py
CHANGED
|
@@ -63,10 +63,14 @@ class Go2:
|
|
|
63
63
|
self._moving = False
|
|
64
64
|
self._move_params = (0, 0, 0)
|
|
65
65
|
self._move_thread = None
|
|
66
|
-
|
|
66
|
+
|
|
67
|
+
# 步态模式保持 - 用于持续保持常规运动模式
|
|
68
|
+
self._gait_mode = None # 当前保持的步态模式: 'trot', 'static', 'economic' 或 None
|
|
69
|
+
self._gait_mode_lock = threading.Lock() # 步态模式锁
|
|
70
|
+
|
|
67
71
|
# 摄像头对象
|
|
68
72
|
self.camera = None
|
|
69
|
-
|
|
73
|
+
|
|
70
74
|
# 声光控制对象
|
|
71
75
|
self._vui = None
|
|
72
76
|
|
|
@@ -283,18 +287,23 @@ class Go2:
|
|
|
283
287
|
if self.error_code in forbidden_move_states:
|
|
284
288
|
print(f"当前状态不允许移动: {self.error_code} - {error_code.get(self.error_code, '未知状态')}")
|
|
285
289
|
return False
|
|
286
|
-
|
|
290
|
+
|
|
287
291
|
# 限制速度范围
|
|
288
292
|
vx = max(-1.0, min(1.0, vx)) # 前后速度限制在-1到1之间
|
|
289
293
|
vy = max(-1.0, min(1.0, vy)) # 左右速度限制在-1到1之间
|
|
290
294
|
vyaw = max(-2.0, min(2.0, vyaw)) # 转动速度限制在-2到2之间
|
|
291
|
-
|
|
295
|
+
|
|
296
|
+
# 如果设置了步态模式,在移动前保持该模式
|
|
297
|
+
with self._gait_mode_lock:
|
|
298
|
+
if self._gait_mode is not None:
|
|
299
|
+
self._maintain_gait_mode()
|
|
300
|
+
|
|
292
301
|
def move_thread():
|
|
293
302
|
ret = self.sport_client.Move(vx, vy, vyaw)
|
|
294
303
|
success = ret == 0
|
|
295
|
-
print(f"Move 执行结果: {ret}, 成功: {success}")
|
|
304
|
+
# print(f"Move 执行结果: {ret}, 成功: {success}")
|
|
296
305
|
return success
|
|
297
|
-
|
|
306
|
+
|
|
298
307
|
t = threading.Thread(target=move_thread)
|
|
299
308
|
t.start()
|
|
300
309
|
t.join()
|
|
@@ -303,30 +312,33 @@ class Go2:
|
|
|
303
312
|
def MoveForDuration(self, vx, vy, vyaw, duration):
|
|
304
313
|
"""
|
|
305
314
|
持续移动指定时间
|
|
306
|
-
|
|
315
|
+
|
|
307
316
|
Args:
|
|
308
317
|
vx (float): 前后速度 (-1.0 到 1.0)
|
|
309
|
-
vy (float): 左右速度 (-1.0 到 1.0)
|
|
318
|
+
vy (float): 左右速度 (-1.0 到 1.0)
|
|
310
319
|
vyaw (float): 转动速度 (-2.0 到 2.0)
|
|
311
320
|
duration (float): 移动时间(秒)
|
|
312
|
-
|
|
321
|
+
|
|
313
322
|
Returns:
|
|
314
323
|
bool: 是否成功执行
|
|
315
324
|
"""
|
|
316
325
|
print(f"开始移动: vx={vx}, vy={vy}, vyaw={vyaw}, 持续时间={duration}秒")
|
|
317
326
|
start_time = time.time()
|
|
318
|
-
|
|
327
|
+
|
|
319
328
|
try:
|
|
320
329
|
while time.time() - start_time < duration:
|
|
321
330
|
if not self.Move(vx, vy, vyaw):
|
|
322
331
|
return False
|
|
323
332
|
time.sleep(0.1) # 每100ms调用一次
|
|
324
|
-
|
|
333
|
+
|
|
334
|
+
# 时间到后,主动停止移动
|
|
335
|
+
self.StopMove()
|
|
325
336
|
print("移动完成")
|
|
326
337
|
return True
|
|
327
|
-
|
|
338
|
+
|
|
328
339
|
except KeyboardInterrupt:
|
|
329
340
|
print("移动被用户中断")
|
|
341
|
+
self.StopMove()
|
|
330
342
|
return False
|
|
331
343
|
|
|
332
344
|
def Forward(self, speed=0.3, duration=2.0):
|
|
@@ -379,6 +391,10 @@ class Go2:
|
|
|
379
391
|
def continuous_move():
|
|
380
392
|
while self._moving:
|
|
381
393
|
# 持续移动不需要每次都检查状态,因为已经在开始时检查过
|
|
394
|
+
# 但需要保持步态模式
|
|
395
|
+
with self._gait_mode_lock:
|
|
396
|
+
if self._gait_mode is not None:
|
|
397
|
+
self._maintain_gait_mode()
|
|
382
398
|
try:
|
|
383
399
|
ret = self.sport_client.Move(vx, vy, vyaw)
|
|
384
400
|
success = ret == 0
|
|
@@ -634,7 +650,7 @@ class Go2:
|
|
|
634
650
|
return result == 0 if result is not None else False
|
|
635
651
|
|
|
636
652
|
def FreeWalk(self, flag: int = None):
|
|
637
|
-
"""
|
|
653
|
+
""" 灵动模式(默认步态)。开启后会清除常规运动模式的保持。"""
|
|
638
654
|
# 执行指令
|
|
639
655
|
if flag is None:
|
|
640
656
|
# 切换模式
|
|
@@ -642,8 +658,11 @@ class Go2:
|
|
|
642
658
|
else:
|
|
643
659
|
# 根据flag值执行相应操作
|
|
644
660
|
if flag:
|
|
645
|
-
# 开启灵动模式
|
|
661
|
+
# 开启灵动模式 - 清除步态模式保持
|
|
646
662
|
result = self._call(lambda: self.sport_client.FreeWalk())
|
|
663
|
+
if result == 0:
|
|
664
|
+
with self._gait_mode_lock:
|
|
665
|
+
self._gait_mode = None
|
|
647
666
|
else:
|
|
648
667
|
# 关闭灵动模式 - 切换到其他模式
|
|
649
668
|
result = self._call(lambda: self.sport_client.StandUp())
|
|
@@ -714,31 +733,61 @@ class Go2:
|
|
|
714
733
|
print("警告: ClassicWalk 方法在当前SDK版本中不可用")
|
|
715
734
|
return False
|
|
716
735
|
|
|
736
|
+
def _maintain_gait_mode(self):
|
|
737
|
+
"""保持当前的步态模式(内部函数)"""
|
|
738
|
+
if self._gait_mode == 'trot':
|
|
739
|
+
try:
|
|
740
|
+
self.sport_client.TrotRun()
|
|
741
|
+
except:
|
|
742
|
+
pass
|
|
743
|
+
elif self._gait_mode == 'static':
|
|
744
|
+
try:
|
|
745
|
+
self.sport_client.StaticWalk()
|
|
746
|
+
except:
|
|
747
|
+
pass
|
|
748
|
+
elif self._gait_mode == 'economic':
|
|
749
|
+
try:
|
|
750
|
+
self.sport_client.EconomicGait()
|
|
751
|
+
except:
|
|
752
|
+
pass
|
|
753
|
+
|
|
717
754
|
def TrotRun(self):
|
|
718
|
-
"""
|
|
755
|
+
""" 进入常规跑步模式(保持模式,直到切换到其他模式或调用FreeWalk) """
|
|
719
756
|
try:
|
|
720
757
|
# 执行指令
|
|
721
758
|
result = self._call(self.sport_client.TrotRun)
|
|
759
|
+
if result == 0:
|
|
760
|
+
with self._gait_mode_lock:
|
|
761
|
+
self._gait_mode = 'trot'
|
|
762
|
+
print("已进入常规跑步模式(持续保持)")
|
|
722
763
|
return result == 0 if result is not None else False
|
|
723
764
|
except AttributeError:
|
|
724
765
|
print("警告: TrotRun 方法在当前SDK版本中不可用")
|
|
725
766
|
return False
|
|
726
767
|
|
|
727
768
|
def StaticWalk(self):
|
|
728
|
-
"""
|
|
769
|
+
""" 进入常规行走模式(保持模式,直到切换到其他模式或调用FreeWalk)"""
|
|
729
770
|
try:
|
|
730
771
|
# 执行指令
|
|
731
772
|
result = self._call(self.sport_client.StaticWalk)
|
|
773
|
+
if result == 0:
|
|
774
|
+
with self._gait_mode_lock:
|
|
775
|
+
self._gait_mode = 'static'
|
|
776
|
+
print("已进入常规行走模式(持续保持)")
|
|
732
777
|
return result == 0 if result is not None else False
|
|
733
778
|
except AttributeError:
|
|
734
779
|
print("警告: StaticWalk 方法在当前SDK版本中不可用")
|
|
735
780
|
return False
|
|
736
781
|
|
|
737
782
|
def EconomicGait(self):
|
|
738
|
-
"""
|
|
783
|
+
""" 进入常规续航模式(保持模式,直到切换到其他模式或调用FreeWalk) """
|
|
739
784
|
try:
|
|
740
785
|
# 执行指令
|
|
741
786
|
result = self._call(self.sport_client.EconomicGait)
|
|
787
|
+
if result == 0:
|
|
788
|
+
with self._gait_mode_lock:
|
|
789
|
+
self._gait_mode = 'economic'
|
|
790
|
+
print("已进入常规续航模式(持续保持)")
|
|
742
791
|
return result == 0 if result is not None else False
|
|
743
792
|
except AttributeError:
|
|
744
793
|
print("警告: EconomicGait 方法在当前SDK版本中不可用")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ezgo
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.17
|
|
4
4
|
Summary: 宇树Go2机器狗Python控制库
|
|
5
5
|
Author-email: ezgo <noreply@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -208,24 +208,44 @@ import ezgo
|
|
|
208
208
|
robot = ezgo.Go2() # 需要unitree-sdk2py
|
|
209
209
|
if robot.init():
|
|
210
210
|
# 步态模式切换
|
|
211
|
-
robot.FreeWalk(True) #
|
|
211
|
+
robot.FreeWalk(True) # 开启灵动模式(默认步态)
|
|
212
212
|
robot.FreeWalk(False) # 关闭灵动模式
|
|
213
|
-
|
|
214
|
-
#
|
|
215
|
-
robot.FreeBound(True) # 并腿跑模式(
|
|
216
|
-
robot.
|
|
217
|
-
robot.
|
|
218
|
-
robot.
|
|
219
|
-
robot.
|
|
220
|
-
|
|
221
|
-
#
|
|
222
|
-
robot.
|
|
223
|
-
robot.
|
|
224
|
-
robot.
|
|
225
|
-
|
|
213
|
+
|
|
214
|
+
# 特殊步态(需手动开启/关闭)
|
|
215
|
+
robot.FreeBound(True) # 并腿跑模式(flag=1开启,flag=0关闭)
|
|
216
|
+
robot.FreeBound(False) # 关闭并腿跑模式
|
|
217
|
+
robot.FreeJump(True) # 跳跃模式(flag=1开启,flag=0关闭)
|
|
218
|
+
robot.FreeJump(False) # 关闭跳跃模式
|
|
219
|
+
robot.FreeAvoid(True) # 闪避模式(flag=1开启,flag=0关闭)
|
|
220
|
+
robot.FreeAvoid(False) # 关闭闪避模式
|
|
221
|
+
robot.WalkUpright(True) # 后腿直立模式(flag=1开启,flag=0关闭)
|
|
222
|
+
robot.WalkUpright(False) # 关闭后腿直立模式
|
|
223
|
+
robot.CrossStep(True) # 交叉步模式(flag=1开启,flag=0关闭)
|
|
224
|
+
robot.CrossStep(False) # 关闭交叉步模式
|
|
225
|
+
|
|
226
|
+
# 常规运动模式(持续保持,直到切换到其他模式)
|
|
227
|
+
robot.TrotRun() # 进入常规跑步模式(持续保持)
|
|
228
|
+
robot.StaticWalk() # 进入常规行走模式(持续保持)
|
|
229
|
+
robot.EconomicGait() # 进入常规续航模式(持续保持)
|
|
230
|
+
robot.ClassicWalk(True) # 开启经典步态(flag=1开启,flag=0关闭)
|
|
226
231
|
robot.ClassicWalk(False) # 关闭经典步态
|
|
232
|
+
|
|
233
|
+
# 切换回灵动模式会清除常规运动模式的保持
|
|
234
|
+
robot.FreeWalk(True) # 开启灵动模式,清除之前的常规模式
|
|
235
|
+
|
|
236
|
+
# 示例:使用常规跑步模式完成动作组合
|
|
237
|
+
robot.TrotRun() # 进入常规跑步模式
|
|
238
|
+
robot.Forward(0.5, 2) # 前进2秒(保持在跑步模式)
|
|
239
|
+
robot.TurnLeft(0.5, 2) # 左转2秒(仍保持在跑步模式)
|
|
240
|
+
robot.Forward(0.3, 1) # 继续前进1秒(仍保持在跑步模式)
|
|
227
241
|
```
|
|
228
242
|
|
|
243
|
+
**重要说明**:
|
|
244
|
+
- `TrotRun()`、`StaticWalk()`、`EconomicGait()` 调用后会**持续保持**该模式
|
|
245
|
+
- 移动控制函数(`Move`、`Forward`、`TurnLeft` 等)会自动保持当前设置的步态模式
|
|
246
|
+
- 要退出常规运动模式,可调用 `FreeWalk(True)` 切换回灵动模式
|
|
247
|
+
- 其他模式函数(`FreeBound`、`FreeJump` 等)仍需手动控制开启/关闭
|
|
248
|
+
|
|
229
249
|
### 特技动作
|
|
230
250
|
|
|
231
251
|
```python
|
|
@@ -417,6 +437,33 @@ pip install opencv-python numpy Pillow netifaces
|
|
|
417
437
|
|
|
418
438
|
## 更新日志
|
|
419
439
|
|
|
440
|
+
### v0.0.17 (2026-02-04)
|
|
441
|
+
**新增功能**:
|
|
442
|
+
- ✨ 常规运动模式(`TrotRun`、`StaticWalk`、`EconomicGait`)现在支持持续保持
|
|
443
|
+
- ✨ 移动控制函数自动保持当前设置的步态模式
|
|
444
|
+
- ✨ 添加步态模式锁机制,确保线程安全
|
|
445
|
+
|
|
446
|
+
**修复**:
|
|
447
|
+
- 🐛 修复常规运动模式在移动后自动关闭的问题
|
|
448
|
+
- 🐛 修复使用经典步态/跑步模式等组合动作时模式失效的问题
|
|
449
|
+
- 🐛 `FreeWalk(True)` 现在会清除常规运动模式的保持
|
|
450
|
+
|
|
451
|
+
**改进**:
|
|
452
|
+
- 🔧 优化步态模式保持机制,确保移动过程中模式不被打断
|
|
453
|
+
- 🔧 更新文档说明,明确常规运动模式的持续保持特性
|
|
454
|
+
- 🔧 添加模式切换的清晰示例
|
|
455
|
+
|
|
456
|
+
### v0.0.16 (2026-02-04)
|
|
457
|
+
**修复**:
|
|
458
|
+
- 🐛 修复 MoveForDuration 函数在 duration 时间结束后未自动停止移动的问题
|
|
459
|
+
- 🐛 Forward、Backward、Left、Right、TurnLeft、TurnRight 等移动控制函数现在会在指定时间后准确停止
|
|
460
|
+
- 🐛 MoveForDuration 在循环结束后自动调用 StopMove() 确保机器狗停止移动
|
|
461
|
+
- 🐛 修复 Keyboard 中断时未停止移动的问题
|
|
462
|
+
|
|
463
|
+
**改进**:
|
|
464
|
+
- 🔧 移动控制函数的行为现在与文档描述一致,duration 参数真正控制移动时间
|
|
465
|
+
- 🔧 提升用户体验,无需手动调用 StopMove() 即可实现定时移动
|
|
466
|
+
|
|
420
467
|
### v0.0.15 (2025-12-24)
|
|
421
468
|
**修复**:
|
|
422
469
|
- 🐛 移除所有模式函数的自动关闭逻辑,用户可以自主控制开启和关闭
|
|
@@ -2,12 +2,12 @@ ezgo/__init__.py,sha256=XdJGNtFRNZwouVByMsopJ7APB23zkdAa7v5NvLrcpLw,2268
|
|
|
2
2
|
ezgo/camera.py,sha256=Vsr44vFtaop4LE0DlWyOHyvxF-jHnVO8iMPUwp5mbsE,2538
|
|
3
3
|
ezgo/ezcamera.py,sha256=6-3y-1X_L60QsWdsd5-caLoj7Quy9rpyHdp3Tq3JFbU,6536
|
|
4
4
|
ezgo/eztk.py,sha256=MHWkkZYIL1AFjUXFu2Qq8U9idJV_E1VxFUBe82dvbyA,10463
|
|
5
|
-
ezgo/go2.py,sha256=
|
|
5
|
+
ezgo/go2.py,sha256=hIu5OMjQ3hJNFF9rXY03dSILv_sEeJi02MrCCAuQpDA,33512
|
|
6
6
|
ezgo/go2_camera.py,sha256=nawUSLyvqTNiVRQ2sM-UdoJzqwZcySltLbCfUb0G9Qc,8614
|
|
7
7
|
ezgo/go2_vui.py,sha256=52I4Y8uqGkW9muDEnDzQ236HqVVTIgNIN_2gW5RTC48,10161
|
|
8
8
|
ezgo/ui.py,sha256=jUik6maaoemI2vsBM92OLZfJfskg54W7hwMls_gxppg,2777
|
|
9
|
-
ezgo-0.0.
|
|
10
|
-
ezgo-0.0.
|
|
11
|
-
ezgo-0.0.
|
|
12
|
-
ezgo-0.0.
|
|
13
|
-
ezgo-0.0.
|
|
9
|
+
ezgo-0.0.17.dist-info/LICENSE,sha256=Zk4eZBT3KaBhqM3LB_xN7QquwnoWsEHAoA6eLdE6W5M,1060
|
|
10
|
+
ezgo-0.0.17.dist-info/METADATA,sha256=1H0XVKBVN1FhH35Rid_fCmiWtisgqDPJNMJ6vhyBORU,19901
|
|
11
|
+
ezgo-0.0.17.dist-info/WHEEL,sha256=WnJ8fYhv8N4SYVK2lLYNI6N0kVATA7b0piVUNvqIIJE,91
|
|
12
|
+
ezgo-0.0.17.dist-info/top_level.txt,sha256=BdCFEVD5V_4FxUtvH0BVlZKgxYnp7EKNsYs5OyFxj-g,5
|
|
13
|
+
ezgo-0.0.17.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|