Files
PekingGripper/test_dof_control.py
Brunsmeier 111c9bab8a init repo
2026-07-16 14:56:43 +08:00

147 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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