|
|
|
@ -9,6 +9,9 @@ from std_srvs.srv import Trigger
|
|
|
|
from std_msgs.msg import Bool, String
|
|
|
|
from std_msgs.msg import Bool, String
|
|
|
|
import numpy as np
|
|
|
|
import numpy as np
|
|
|
|
from tf2_ros import Buffer, TransformListener
|
|
|
|
from tf2_ros import Buffer, TransformListener
|
|
|
|
|
|
|
|
from cv_bridge import CvBridge
|
|
|
|
|
|
|
|
from sensor_msgs.msg import Image
|
|
|
|
|
|
|
|
import cv2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnityRobotController(RobotController):
|
|
|
|
class UnityRobotController(RobotController):
|
|
|
|
@ -45,6 +48,8 @@ class UnityRobotController(RobotController):
|
|
|
|
|
|
|
|
|
|
|
|
super().__init__(fire_ext_max_capacity = fire_ext_max_capacity)
|
|
|
|
super().__init__(fire_ext_max_capacity = fire_ext_max_capacity)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._bridge = CvBridge()
|
|
|
|
|
|
|
|
|
|
|
|
self._tf_buffer = Buffer()
|
|
|
|
self._tf_buffer = Buffer()
|
|
|
|
self._tf_listener = TransformListener(self._tf_buffer, self._node)
|
|
|
|
self._tf_listener = TransformListener(self._tf_buffer, self._node)
|
|
|
|
|
|
|
|
|
|
|
|
@ -52,6 +57,7 @@ class UnityRobotController(RobotController):
|
|
|
|
self._target_point_pub = self._node.create_publisher(Point, 'target_point', 10)
|
|
|
|
self._target_point_pub = self._node.create_publisher(Point, 'target_point', 10)
|
|
|
|
|
|
|
|
|
|
|
|
self._status_str_pub = self._node.create_publisher(String, 'status', 10)
|
|
|
|
self._status_str_pub = self._node.create_publisher(String, 'status', 10)
|
|
|
|
|
|
|
|
self._status_image_pub = self._node.create_publisher(Image, 'status_image', 10)
|
|
|
|
|
|
|
|
|
|
|
|
self.fe_burst_srv = self._node.create_client(Trigger, 'fe_burst')
|
|
|
|
self.fe_burst_srv = self._node.create_client(Trigger, 'fe_burst')
|
|
|
|
|
|
|
|
|
|
|
|
@ -66,6 +72,46 @@ class UnityRobotController(RobotController):
|
|
|
|
self._node.create_subscription(Bool, 'collision_detection', self.collision_cb, 10)
|
|
|
|
self._node.create_subscription(Bool, 'collision_detection', self.collision_cb, 10)
|
|
|
|
self.proc_timer = self._node.create_timer(0.1, self.proc_timer_cb)
|
|
|
|
self.proc_timer = self._node.create_timer(0.1, self.proc_timer_cb)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._node.create_subscription(Image, 'crosshair_image', self.ch_image_cb, 10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ch_image_cb(self, msg):
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
cv_image = self._bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
self._node.get_logger().error(f"Failed to convert image: {e}")
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fh = 22
|
|
|
|
|
|
|
|
scale = 0.5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.putText(cv_image, f"CHARGE: {round(self._charge_points/self._start_charge * 100 ,1)}%", (1, int(5 + fh * scale)), cv2.FONT_HERSHEY_SIMPLEX, scale, (255, 255, 255), thickness=None, lineType=None, bottomLeftOrigin=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.putText(cv_image, f"HP: {round(self._hit_points/self._start_hp * 100 ,1)}%", (int(cv_image.shape[1]/4), int(5 + fh * scale)), cv2.FONT_HERSHEY_SIMPLEX, scale, (255, 255, 255), thickness=None, lineType=None, bottomLeftOrigin=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.putText(cv_image, f"SCORE: {round(self.get_score(),1)}", (int(cv_image.shape[1]/4*2), int(5 + fh * scale)), cv2.FONT_HERSHEY_SIMPLEX, scale, (255, 255, 255), thickness=None, lineType=None, bottomLeftOrigin=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.putText(cv_image, f"F.E. left: {self._fire_ext_capacity}", (int(cv_image.shape[1]/4*3), int(5 + fh * scale)), cv2.FONT_HERSHEY_SIMPLEX, scale, (255, 255, 255), thickness=None, lineType=None, bottomLeftOrigin=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self._FALL:
|
|
|
|
|
|
|
|
text = "FALLEN"
|
|
|
|
|
|
|
|
scale = 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(text_w, text_h), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, scale, None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x = int((cv_image.shape[1] - text_w) / 2)
|
|
|
|
|
|
|
|
y = int((cv_image.shape[0] + text_h) / 2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.putText(cv_image, "FALLEN", (x, y), cv2.FONT_HERSHEY_SIMPLEX, scale, (0, 0, 255), thickness=None, lineType=None, bottomLeftOrigin=None)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
ros_image = self._bridge.cv2_to_imgmsg(cv_image, encoding='bgr8')
|
|
|
|
|
|
|
|
ros_image.header = msg.header
|
|
|
|
|
|
|
|
self._status_image_pub.publish(ros_image)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
self.get_logger().error(f"Failed to publish image: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def pub_status(self):
|
|
|
|
def pub_status(self):
|
|
|
|
msg = String()
|
|
|
|
msg = String()
|
|
|
|
status = self.get_str_status()
|
|
|
|
status = self.get_str_status()
|
|
|
|
|