I created a class, in which I want to subscribe both to image_raw and Joy topics, then I want to combine the data to draw/write something on the image with openCV. My code works and is able to
correctly subscribe image_raw
correctly subscribe Joy
publish some extracted values from Joy (PS3 Joystick)
write things on the image with openCV.
The code:
class image_converter:
def __init__(self):
self.image_pub = rospy.Publisher("image_topic_2",Image,queue_size=10)
self.bridge = CvBridge()
self.image_sub = rospy.Subscriber("usb_cam/image_raw",Image,self.callback)
def callback(self,data):
try:
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
gray = cv2.cvtColor(cv_image,cv2.COLOR_BGR2GRAY)
start = time.time() #simulate FPS count
global myjoy_p
global myjoy
myjoy3 = rospy.Subscriber("joy", Joy, self.joyread)
myjoy_p = rospy.Publisher("copy_topic", Int16MultiArray,queue_size=1)
#AA = myjoy_p.data[1] THIS IS MY QUESTION, SEE BELOW
BB = 7.5
cv2.putText(cv_image, 'JOY: {0}'.format(int(BB)),(40,300),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255))
elapsed = time.time() - start
cv2.putText(cv_image, 'FPS: {0}'.format(int(1 / elapsed)),(10,40),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255))
cv2.imshow("Modified Image", cv_image)
cv2.waitKey(1)
except CvBridgeError as e:
print(e)
try:
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
except CvBridgeError as e:
print(e)
def joyread(self,data):
global myjoy
#Declaration type
myjoy = Int16MultiArray()
myjoy1 = Int16MultiArray()
myjoy1.data.append(int(255*data.axes[0])) #LEFT LEFTWARD
myjoy1.data.append(int(255*data.axes[1])) #LEFT UPWARD
myjoy1.data.append(int(255*data.axes[2])) #RIGHT LEFTWARD
myjoy1.data.append(int(255*data.axes[3])) #RIGHT UPWARD
myjoy = myjoy1
#publish
myjoy_p.publish(myjoy1)
This code works, even if there are 4 different myjoy variables (myjoy, myjoy_p, myjoy1, myjoy3) because I'm not a ROS expert and I made a lot of tries.
The question: I would like to extract one of the values from myjoy and store the value in AA, then use AA instead of BB. This is what I tried to do in the commented line
AA = myjoy_p.data[1]
The problem: I can not access to myjoy values out of the joyread callback. the error message is
AttributeError: 'Publisher' object has no attribute 'data'
I tried all of myjoy variables. They are different object types (the error message changes a bit) but none of them seems to work. What I have to do? Thank you in advance. (ROS Indigo and Python script)
Originally posted by marcoresk on ROS Answers with karma: 76 on 2017-04-15
Post score: 0