2025-05-15 20:08:16 +08:00
|
|
|
|
import time
|
2025-05-15 16:43:36 +08:00
|
|
|
|
|
|
|
|
|
class BaseMsg:
|
|
|
|
|
def __init__(self, ctrl, msg):
|
|
|
|
|
self.ctrl = ctrl
|
|
|
|
|
self.msg = msg
|
|
|
|
|
|
|
|
|
|
def stop_force(self):
|
2025-05-15 16:41:00 +00:00
|
|
|
|
"""
|
|
|
|
|
强制停止,但是大部分场景不好用,容易导致 robot 崩坏。
|
|
|
|
|
"""
|
2025-05-15 16:43:36 +08:00
|
|
|
|
self.msg.mode = 0
|
|
|
|
|
self.msg.gait_id = 0
|
|
|
|
|
self.msg.duration = 0
|
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
2025-05-15 20:08:16 +08:00
|
|
|
|
self.ctrl.Wait_finish(0, 0)
|
2025-05-15 14:26:27 +00:00
|
|
|
|
|
2025-05-15 15:22:26 +00:00
|
|
|
|
def stop(self, wait_time=200):
|
2025-05-15 14:26:27 +00:00
|
|
|
|
self.msg.mode = 11
|
2025-05-15 16:41:00 +00:00
|
|
|
|
self.msg.gait_id = 27
|
2025-05-15 14:26:27 +00:00
|
|
|
|
self.msg.vel_des = [0, 0, 0]
|
2025-05-15 15:22:26 +00:00
|
|
|
|
self.msg.duration = wait_time
|
2025-05-15 14:26:27 +00:00
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
|
|
|
|
if wait_time:
|
2025-05-15 15:22:26 +00:00
|
|
|
|
time.sleep(wait_time / 1000)
|
2025-05-16 00:22:31 +08:00
|
|
|
|
|
|
|
|
|
def stop_smooth(self, wait_time=300):
|
|
|
|
|
"""平滑停止,采用逐渐减速的方式实现更柔和的停止过程"""
|
|
|
|
|
# 获取当前速度
|
|
|
|
|
current_vel = self.msg.vel_des.copy() if hasattr(self.msg, 'vel_des') and self.msg.vel_des else [0, 0, 0]
|
|
|
|
|
|
|
|
|
|
# 如果当前速度已经为零,直接调用普通停止
|
|
|
|
|
if all(abs(v) < 0.01 for v in current_vel):
|
|
|
|
|
self.stop(wait_time)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# 计算减速步数和每步减速量
|
|
|
|
|
steps = 5 # 减速分5步完成
|
|
|
|
|
step_time = wait_time / steps
|
|
|
|
|
vel_step = [v / steps for v in current_vel]
|
|
|
|
|
|
|
|
|
|
# 逐步减速
|
|
|
|
|
for i in range(steps):
|
|
|
|
|
# 计算当前步骤的目标速度
|
|
|
|
|
target_vel = [current_vel[j] - vel_step[j] * (i + 1) for j in range(len(current_vel))]
|
|
|
|
|
|
|
|
|
|
# 发送减速命令
|
|
|
|
|
self.msg.mode = 11
|
|
|
|
|
self.msg.gait_id = 26
|
|
|
|
|
self.msg.vel_des = target_vel
|
|
|
|
|
self.msg.duration = step_time
|
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
|
|
|
|
time.sleep(step_time / 1000)
|
|
|
|
|
|
|
|
|
|
# 最后确保完全停止
|
|
|
|
|
self.msg.vel_des = [0, 0, 0]
|
|
|
|
|
self.msg.duration = step_time
|
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
|
|
|
|
time.sleep(step_time / 1000)
|
2025-05-17 11:27:39 +08:00
|
|
|
|
|
|
|
|
|
def lie_down(self, wait_time=500):
|
|
|
|
|
"""发送趴下指令
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
wait_time: 等待时间(毫秒),默认为500ms
|
|
|
|
|
"""
|
|
|
|
|
assert wait_time != 0 or wait_time > 3000, "wait_time 必须在 0 or > 3000"
|
|
|
|
|
self.msg.mode = 7
|
|
|
|
|
self.msg.gait_id = 1
|
|
|
|
|
self.msg.duration = wait_time
|
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
|
|
|
|
if wait_time:
|
|
|
|
|
time.sleep(wait_time / 1000)
|
|
|
|
|
|
|
|
|
|
def stand_up(self):
|
|
|
|
|
self.msg.mode = 12
|
|
|
|
|
self.msg.gait_id = 0
|
|
|
|
|
self.msg.life_count += 1
|
|
|
|
|
self.ctrl.Send_cmd(self.msg)
|
|
|
|
|
self.ctrl.Wait_finish(12, 0)
|
2025-05-15 22:58:18 +08:00
|
|
|
|
|