ros_comm
ros_comm copied to clipboard
Remap cycle in rospy and inconsistent names between publisher and its implementation
Remapping is done twice - in publisher and its internal implementation which leads to possible cycles and the publisher and its internal implementation reporting different topic names. In some cases remapping just does not work.
(I edited the issue to simplify it.)
One of failure cases is switching topics: you can't remap a
to b
and b
to a
in the same node.
The cycle may appear with resolved names.
Example with rospy_remap_cycle
node
#!/usr/bin/env python
import rospy
from std_msgs.msg import Empty
rospy.init_node('rospy_remap_cycle')
pub = rospy.Publisher('published', Empty, queue_size=1)
sub = rospy.Subscriber('subscribed', Empty, lambda msg: None, queue_size=1)
for name, obj in [('pub', pub), ('pub.impl', pub.impl), ('sub', sub), ('sub.impl', sub.impl)]:
print('%-8s name: %s, resolved: %s' % (name, obj.name, obj.resolved_name))
rospy.spin()
launched from commandline:
source /opt/ros/noetic/setup.bash
roscore &
./rospy_remap_cycle published:=subscribed subscribed:=published
pub name: /subscribed, resolved: /subscribed
pub.impl name: /published, resolved: /published
sub name: /published, resolved: /published
sub.impl name: /subscribed, resolved: /subscribed
With cycle appearing with resolved names:
./rospy_remap_cycle __ns:=private published:=/private/subscribed subscribed:=/private/published
pub name: /private/subscribed, resolved: /private/subscribed
pub.impl name: /private/published, resolved: /private/published
sub name: /private/published, resolved: /private/published
sub.impl name: /private/subscribed, resolved: /private/subscribed
Note that the publisher/subscriber reports expected topic names but not so the internal implementations.
Workaround for nodes you can edit: put the following snippet before you start creating publishers and subscribers:
orig_init = rospy.topics._TopicImpl.__init__
def new_init(self, name, dataclass):
orig_init(self, name, dataclass)
self.name = self.resolved_name = name
rospy.topics._TopicImpl.__init__ = new_init