-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzelda_bridge_node.py
executable file
·93 lines (79 loc) · 2.98 KB
/
zelda_bridge_node.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import keyboard
import numpy as np
import rospy
from cv_bridge import CvBridge, CvBridgeError
from geometry_msgs.msg import Twist
from mss import mss
from rospy import Publisher, Subscriber
from sensor_msgs.msg import Image
from std_msgs.msg import Bool
import cv2
class ZeldaBridgeNode(object):
def __init__(self):
rospy.init_node("zelda_bridge_node")
self.arrows = Subscriber("/cmd_vel", Twist, self.arrows_callback)
self.interact = Subscriber(
"/interact", Bool, self.create_button_callback("r"))
self.swing = Subscriber(
"/swing", Bool, self.create_button_callback("d"))
self.item = Subscriber("/item", Bool, self.create_button_callback("s"))
self.map = Subscriber("/map", Bool, self.create_button_callback("e"))
self.menu = Subscriber("/menu", Bool, self.create_button_callback("q"))
self.camera = Publisher("/camera/rgb/image_raw", Image, queue_size=10)
self.keyboard_state = {
"left": False,
"right": False,
"up": False,
"down": False
}
self.bridge = CvBridge()
self.screenshotter = mss()
self.monitor = {"top": 1000, "left": 800, "width": 500, "height": 500}
self.rate = rospy.Rate(30)
while not rospy.is_shutdown():
self.read_image()
if self.keyboard_state["left"]:
keyboard.press("left")
else:
keyboard.release("left")
if self.keyboard_state["right"]:
keyboard.press("right")
else:
keyboard.release("right")
if self.keyboard_state["up"]:
keyboard.press("up")
else:
keyboard.release("up")
if self.keyboard_state["down"]:
keyboard.press("down")
else:
keyboard.release("down")
self.rate.sleep()
def read_image(self):
img = np.array(self.screenshotter.grab(self.monitor))
img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
# resize image
width = int(img.shape[1] * 0.5)
height = int(img.shape[0] * 0.5)
dim = (width, height)
resized = cv2.resize(img, dim)
try:
ros_image = self.bridge.cv2_to_imgmsg(resized, "bgr8")
self.camera.publish(ros_image)
except CvBridgeError as e:
print(e)
def arrows_callback(self, twist):
self.keyboard_state["right"] = twist.angular.z < -0.25
self.keyboard_state["left"] = twist.angular.z > 0.25
self.keyboard_state["up"] = twist.linear.x > 0.25
self.keyboard_state["down"] = twist.linear.x < -0.25
def create_button_callback(self, key):
def callback(bool):
if bool.data:
keyboard.press(key)
for _ in range(3):
self.rate.sleep()
keyboard.release(key)
return callback
if __name__ == "__main__":
ZeldaBridgeNode()