import time import keyboard from demo_auto_grasp import TactileSensorDAQ, RobotDriver, SafetyGuard # ====== 可按实际机构方向微调的参数 ====== SERVO_HOME_ANGLE = 90 SERVO_CW_TO_OPPOSE_ANGLE = 120 SERVO_HOLD_SEC = 1.0 FORCE_STOP_THRESHOLD = 0.3 PRESSURE_DISPLAY_KPA = 80 ROBOT_COM_PORT = 'COM9' def wait_with_pause(safety, duration_s, step_s=0.02): start = time.time() while (time.time() - start) < duration_s: safety.check_pause() time.sleep(step_s) def run_servo_single_cycle(robot, safety, servo_id): print(f"[Mode {servo_id}] 舵机{servo_id}开始: 手指1顺时针到对握位 -> 回位") safety.check_pause() # 仅发送指定舵机命令,其他舵机不动作 robot.set_servo(servo_id, SERVO_CW_TO_OPPOSE_ANGLE) wait_with_pause(safety, SERVO_HOLD_SEC) safety.check_pause() robot.set_servo(servo_id, SERVO_HOME_ANGLE) wait_with_pause(safety, 0.5) # 明确停止直线电机,确保其不动作 robot.motor_stop() print(f"[Mode {servo_id}] 完成。") def run_linear_mode(robot, safety): print("[Mode 3] 直线电机控制模式 (无传感器)") print("按键: w=张开, s=闭合, q=退出模式") print("规则: 无传感器,按住s持续闭合") print("全局: 空格急停/恢复") motion_state = 'idle' # idle/open/close/force_stop prev_q = False linear_start_time = None def print_runtime(final=False): if linear_start_time is None: return elapsed = time.time() - linear_start_time if final: print(f"[Mode 3] s执行总时长: {elapsed:.2f}s") while True: safety.check_pause() w_now = keyboard.is_pressed('w') s_now = keyboard.is_pressed('s') q_now = keyboard.is_pressed('q') q_edge = q_now and not prev_q if q_edge: robot.motor_stop() print_runtime(final=True) linear_start_time = None print("[Mode 3] 退出直线电机控制模式") break # 仅允许单键控制: w 和 s 同时按下时停止,防止方向冲突 if w_now and not s_now: if motion_state != 'open': robot.motor_open() motion_state = 'open' print("[Mode 3] 张开中 (按住 w)") elif s_now and not w_now: if linear_start_time is None: linear_start_time = time.time() if motion_state != 'close': robot.motor_close() motion_state = 'close' print("[Mode 3] 闭合中 (按住 s)") else: if motion_state in ('open', 'close', 'force_stop'): robot.motor_stop() print_runtime(final=True) motion_state = 'idle' print("[Mode 3] 松开按键, 电机停止") linear_start_time = None prev_q = q_now time.sleep(0.02) def main(): # sensor = TactileSensorDAQ() robot = RobotDriver(port=ROBOT_COM_PORT) safety = SafetyGuard(robot) try: # sensor.start() # print("等待传感器稳定...") # time.sleep(2) # sensor.tare() while True: print("\n========================") print("自由度控制选择:") print(" 1: 舵机1控制 (手指1顺时针到对握后回位)") print(" 2: 舵机2控制 (手指1顺时针到对握后回位)") print(f" 3: 直线电机控制 (w张开/s闭合, 压强显示固定为 {PRESSURE_DISPLAY_KPA}KPa)") print(" q: 退出程序") print("全局: 空格急停/恢复") choice = input("请输入 1/2/3/q: ").strip().lower() if choice == '1': run_servo_single_cycle(robot, safety, servo_id=1) elif choice == '2': run_servo_single_cycle(robot, safety, servo_id=2) elif choice == '3': run_linear_mode(robot, safety) elif choice == 'q': break else: print("输入无效,请重新输入。") except KeyboardInterrupt: pass finally: robot.motor_stop() robot.close() # sensor.stop() try: keyboard.unhook_all() except Exception: pass print("System All Shutdown.") if __name__ == '__main__': main()