Skip to content

Commit 79e3d97

Browse files
committed
Subscription to multiple ROS topics fixed
1 parent 64b0fce commit 79e3d97

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

CollisionAvoidanceManager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ def __init__(self):
4747

4848
Cfg.RTODCfg["callback"] = self.updateRTDetection #NB modifying a global/static dictionary, but who cares
4949
self._rtod = RTOD(Cfg.RTODCfg)
50-
self._rosSubColor = ImageSubscriberWrapper('/color/image_raw', self._rtod.ProcessNumpyImage)
51-
52-
self._rosSubDepth = ImageSubscriberWrapper('/depth/image_rect_raw', self.processDepthImage)
50+
self._rosSub = ImageSubscriberWrapper()
51+
self._rosSub.subscribe('/color/image_raw', self._rtod.ProcessNumpyImage)
52+
self._rosSub.subscribe('/depth/image_rect_raw', self.processDepthImage)
5353

5454
self._steeringCmdRel = None
5555
self._speedCmdRel = None

ROS_ImageSubscriber.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,54 @@
55
from sensor_msgs.msg import Image # Image is the message type
66
from cv_bridge import CvBridge, CvBridgeError # Package to convert between ROS and OpenCV Images
77

8+
from functools import partial #std::bind for python
9+
810
from threading import Thread
911

1012
class ImageSubscriber(Node):
11-
def __init__(self, ros_topic_name, callback_):
12-
"""
13-
Class constructor to set up the node
14-
"""
13+
def __init__(self):
1514
# Initiate the Node class's constructor and give it a name
16-
super().__init__('image_subscriber')
15+
super().__init__('ImageSubscriber')
16+
17+
self._callbacks = {}
18+
19+
def subscribe(self, ros_topic_name, callback):
20+
self._callbacks[ros_topic_name] = callback
21+
subscriber_callback_bound = partial(self.subscriber_callback, ros_topic_name_=ros_topic_name)
1722

18-
self.callback = callback_
19-
# Create the subscriber. This subscriber will receive an Image
20-
# from the video_frames topic. The queue size is 10 messages.
21-
self.sub = self.create_subscription(
22-
Image,
23-
ros_topic_name,
24-
self.subscriber_callback,
25-
qos_profile_sensor_data)
26-
self.get_logger().info('Subscribed on ' + ros_topic_name)
27-
28-
# Used to convert between ROS and OpenCV images
29-
self.br = CvBridge()
30-
31-
def subscriber_callback(self, data):
23+
# Create the subscriber. This subscriber will receive an Image from the topic. The queue size is 10 messages.
24+
self.create_subscription(
25+
Image,
26+
ros_topic_name,
27+
subscriber_callback_bound,
28+
qos_profile_sensor_data)
29+
30+
self.get_logger().info('Subscribed on ' + ros_topic_name)
31+
32+
33+
def subscriber_callback(self, data, ros_topic_name_):
3234
try:
3335
# Convert ROS Image message to OpenCV/numpy image
3436
imageNumpy = CvBridge().imgmsg_to_cv2(data)
3537
self.get_logger().info('Received video frame dimensions {0}x{1}'.format(imageNumpy.shape[1], imageNumpy.shape[0]))
36-
if (self.callback is not None):
37-
self.callback(imageNumpy)
38+
39+
callback = self._callbacks.get(ros_topic_name_)
40+
if (callback is not None):
41+
callback(imageNumpy)
3842
except CvBridgeError as exc:
3943
self.get_logger().error(exc)
4044

4145
class ImageSubscriberWrapper:
42-
def __init__(self, ros_topic_name, callback = None):
46+
47+
def __init__(self):
4348
rclpy.init()
44-
self.node = ImageSubscriber(ros_topic_name, callback)
49+
self.node = ImageSubscriber()
4550
self.thread = Thread(target=self._threadFunc)
4651
self.thread.start()
4752

53+
def subscribe(self, ros_topic_name, callback = None):
54+
self.node.subscribe(ros_topic_name, callback)
55+
4856
def _threadFunc(self):
4957
rclpy.spin(self.node)
5058
rclpy.shutdown()

0 commit comments

Comments
 (0)