| 
									
										
										
										
											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 |