|
|
|
@ -9,10 +9,10 @@ import cv2
|
|
|
|
import numpy as np
|
|
|
|
import numpy as np
|
|
|
|
from sensor_msgs.msg import Image
|
|
|
|
from sensor_msgs.msg import Image
|
|
|
|
|
|
|
|
|
|
|
|
from skeleton.mediapipe_detector import MediaPipeDetector
|
|
|
|
from unity_robot_controller.gesture_rec.skeleton.mediapipe_detector import MediaPipeDetector
|
|
|
|
from gesture_control.special_gestures import SpecialGestureDetector
|
|
|
|
from unity_robot_controller.gesture_rec.gesture_control.special_gestures import SpecialGestureDetector
|
|
|
|
from gesture_control.arm_control import ArmController
|
|
|
|
from unity_robot_controller.gesture_rec.gesture_control.arm_control import ArmController
|
|
|
|
from ml_gestures_dynamic.predict import DynamicGesturePredictor
|
|
|
|
#from unity_robot_controller.gesture_rec.ml_gestures_dynamic.predict import DynamicGesturePredictor
|
|
|
|
|
|
|
|
|
|
|
|
class BaseGestureControlNode(Node):
|
|
|
|
class BaseGestureControlNode(Node):
|
|
|
|
|
|
|
|
|
|
|
|
@ -25,9 +25,6 @@ class BaseGestureControlNode(Node):
|
|
|
|
|
|
|
|
|
|
|
|
self.bridge = CvBridge()
|
|
|
|
self.bridge = CvBridge()
|
|
|
|
self.cv_image = None
|
|
|
|
self.cv_image = None
|
|
|
|
|
|
|
|
|
|
|
|
# subscriptions
|
|
|
|
|
|
|
|
self.create_subscription(Image, 'image', self.image_cb, 10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ros params?
|
|
|
|
#ros params?
|
|
|
|
ARM_CONTROL = {
|
|
|
|
ARM_CONTROL = {
|
|
|
|
@ -41,9 +38,9 @@ class BaseGestureControlNode(Node):
|
|
|
|
|
|
|
|
|
|
|
|
SPECIAL_GESTURE_MODE = 'geometric' # 'ml' или 'geometric'
|
|
|
|
SPECIAL_GESTURE_MODE = 'geometric' # 'ml' или 'geometric'
|
|
|
|
ML_GESTURE_MODEL = "path/to/special_gestures_rf.pkl"
|
|
|
|
ML_GESTURE_MODEL = "path/to/special_gestures_rf.pkl"
|
|
|
|
ML_GESTURE_CLASSES ['dome', 'cross', 'none']
|
|
|
|
ML_GESTURE_CLASSES = ['dome', 'cross', 'none']
|
|
|
|
|
|
|
|
|
|
|
|
DG_ENABLED = True
|
|
|
|
DG_ENABLED = False
|
|
|
|
DG_MODEL_PATH = "path/to/dynamic_model.h5"
|
|
|
|
DG_MODEL_PATH = "path/to/dynamic_model.h5"
|
|
|
|
DG_CLASSES_PATH = "path/to/dynamic_model_classes.pkl"
|
|
|
|
DG_CLASSES_PATH = "path/to/dynamic_model_classes.pkl"
|
|
|
|
DG_WINDOW_SIZE = 14
|
|
|
|
DG_WINDOW_SIZE = 14
|
|
|
|
@ -80,9 +77,13 @@ class BaseGestureControlNode(Node):
|
|
|
|
self.image_pub = self.create_publisher(Image, 'skeleton_image', 10)
|
|
|
|
self.image_pub = self.create_publisher(Image, 'skeleton_image', 10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# subscriptions
|
|
|
|
|
|
|
|
self.create_subscription(Image, 'image', self.image_cb, 10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def image_cb(self, msg):
|
|
|
|
def image_cb(self, msg):
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
self.cv_image = self.bridge.imgmsg_to_cv2(raw_msg, desired_encoding='bgr8')
|
|
|
|
self.cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
self.get_logger().error(f"Failed to convert image: {e}")
|
|
|
|
self.get_logger().error(f"Failed to convert image: {e}")
|
|
|
|
self.cv_image = None
|
|
|
|
self.cv_image = None
|
|
|
|
@ -123,7 +124,7 @@ class BaseGestureControlNode(Node):
|
|
|
|
# Команда тушения
|
|
|
|
# Команда тушения
|
|
|
|
if self.enabled:
|
|
|
|
if self.enabled:
|
|
|
|
if special == 'dome' and not self.dome_processed:
|
|
|
|
if special == 'dome' and not self.dome_processed:
|
|
|
|
self.URC.send_fire_ext_burst_cmd():
|
|
|
|
self.URC.send_fire_ext_burst_cmd()
|
|
|
|
self.dome_processed = True
|
|
|
|
self.dome_processed = True
|
|
|
|
elif special != 'dome':
|
|
|
|
elif special != 'dome':
|
|
|
|
self.dome_processed = False
|
|
|
|
self.dome_processed = False
|
|
|
|
|