2025-09-29 09:19:40 +08:00
|
|
|
|
import sys
|
|
|
|
|
|
import time
|
|
|
|
|
|
import threading
|
|
|
|
|
|
|
|
|
|
|
|
# 原代码5. 运动控制模块完整逻辑(保留原路径导入)
|
|
|
|
|
|
PROJECT_ROOT = "/home/duckpi/open_duck_mini_ws/OPEN_DUCK_MINI/Open_Duck_Mini_Runtime-2"
|
|
|
|
|
|
sys.path.append(PROJECT_ROOT)
|
|
|
|
|
|
from v2_rl_walk_mujoco import RLWalk
|
|
|
|
|
|
|
|
|
|
|
|
class RobotMotionController:
|
|
|
|
|
|
def __init__(self, onnx_model_path, tts_controller, feedback_text):
|
|
|
|
|
|
# 接收调度脚本传入的TTS实例和反馈文本,保持原逻辑调用
|
|
|
|
|
|
self.tts_controller = tts_controller
|
|
|
|
|
|
self.FEEDBACK_TEXT = feedback_text
|
|
|
|
|
|
try:
|
|
|
|
|
|
self.rl_walk = RLWalk(
|
|
|
|
|
|
onnx_model_path=onnx_model_path,
|
|
|
|
|
|
cutoff_frequency=40,
|
|
|
|
|
|
pid=[30, 0, 0]
|
|
|
|
|
|
)
|
|
|
|
|
|
self.walk_thread = threading.Thread(target=self.rl_walk.run, daemon=True)
|
|
|
|
|
|
self.walk_thread.start()
|
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
print("🤖 运动控制模块初始化成功")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 运动控制失败:{str(e)}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
def execute_motion(self, action_name: str, seconds: int):
|
|
|
|
|
|
# 全局变量由调度脚本传入,保留原逻辑
|
|
|
|
|
|
global is_processing
|
|
|
|
|
|
is_processing = True
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 播放反馈(同步执行确保声音输出)
|
|
|
|
|
|
self.tts_controller.speak(self.FEEDBACK_TEXT[action_name])
|
|
|
|
|
|
|
|
|
|
|
|
# 执行运动
|
|
|
|
|
|
seconds = max(2, min(seconds, 5))
|
|
|
|
|
|
if action_name == "move_forward":
|
|
|
|
|
|
print(f"\n🚶 前进{seconds}秒...")
|
|
|
|
|
|
self.rl_walk.last_commands[0] = 0.17
|
|
|
|
|
|
elif action_name == "move_backward":
|
|
|
|
|
|
print(f"\n🚶 后退{seconds}秒...")
|
|
|
|
|
|
self.rl_walk.last_commands[0] = -0.17
|
|
|
|
|
|
elif action_name == "turn_left":
|
|
|
|
|
|
print(f"\n🔄 左转{seconds}秒...")
|
|
|
|
|
|
self.rl_walk.last_commands[2] = 1.1
|
|
|
|
|
|
elif action_name == "turn_right":
|
|
|
|
|
|
print(f"\n🔄 右转{seconds}秒...")
|
|
|
|
|
|
self.rl_walk.last_commands[2] = -1.1
|
|
|
|
|
|
|
|
|
|
|
|
time.sleep(seconds)
|
|
|
|
|
|
self.rl_walk.last_commands = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
|
|
|
|
|
print(f"✅ 运动完成")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 运动执行失败:{str(e)}")
|
|
|
|
|
|
self.rl_walk.last_commands = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
|
|
|
|
|
|
finally:
|
|
|
|
|
|
is_processing = False
|