fubo_pneumatic_finger.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import logging
  2. import serial
  3. from serial.tools.list_ports import comports
  4. logger = logging.getLogger(__name__)
  5. def get_serial_ports():
  6. """获取可选端口"""
  7. ports = list(comports(include_links=False))
  8. available_ports_list = [port.device for port in ports]
  9. return available_ports_list
  10. class FingerController:
  11. def __init__(self, init_params):
  12. self.hand = FuboPneumaticFingerClient(init_params)
  13. self.current_state = 'rest'
  14. def move(self, action='flex'):
  15. if self.current_state == 'extend':
  16. self.hand.start(action)
  17. self.current_state = action
  18. elif self.current_state == action:
  19. self.hand.start('extend')
  20. self.current_state = 'extend'
  21. else: # rest or any other
  22. self.hand.start(action)
  23. self.current_state = action
  24. class FuboPneumaticFingerClient:
  25. """富伯客户端"""
  26. COMMAND_TABLE = {
  27. 'rest': b"R",
  28. 'cylinder': b"C",
  29. 'ball': b"B",
  30. 'flex': b"F",
  31. 'double': b"D",
  32. 'treble': b"T",
  33. 'extend': b"E",
  34. }
  35. def __init__(self, init_params=None):
  36. self.baud_rate = 9600
  37. self.data_bite = 8
  38. self.timeout = 1
  39. self.stop_bit = serial.STOPBITS_ONE # 停止位
  40. self.parity_bit = serial.PARITY_NONE # 校验位
  41. self.is_connected = False
  42. self.ser = None # 连接对象
  43. self.port = "COM 4"
  44. if init_params:
  45. self.port = init_params["port"]
  46. self.connect()
  47. def __del__(self):
  48. self.ser.close()
  49. def connect(self):
  50. try:
  51. self.ser = serial.Serial(port=self.port,
  52. baudrate=self.baud_rate,
  53. parity=self.parity_bit,
  54. stopbits=self.stop_bit,
  55. timeout=self.timeout)
  56. if self.ser.is_open:
  57. self.is_connected = True
  58. logger.info("connect")
  59. return 1
  60. else:
  61. self.is_connected = False
  62. logger.warning("open failed")
  63. return 0
  64. except OSError as e:
  65. warning_info = f"pneumatic finger connect failed: {e}"
  66. logger.warning(warning_info)
  67. return 0
  68. def start(self, command):
  69. self.ser.write(self.COMMAND_TABLE[command])
  70. def status(self):
  71. status = {"is_connected": self.is_connected}
  72. return status
  73. def close(self):
  74. if self.ser:
  75. self.ser.close()
  76. self.is_connected = False
  77. return {"is_connected": self.is_connected}