【问题标题】:Publisher/Subscriber ROS Python发布者/订阅者 ROS Python
【发布时间】:2021-07-28 20:40:42
【问题描述】:

晚上好,我需要创建一个发布者,在从我以前的 acuisite 包中读取它们之后发送 pointcloud2。这是为了模拟实时执行。

在 rqt_graph 中,一切似乎都已正确连接,但 pub 和 sub 似乎根本没有通信。

这是我的出版商:

#!/usr/bin/env python
import rospy

from sensor_msgs.msg import PointCloud2
import std_msgs.msg
import sensor_msgs.point_cloud2 as pcl2
import rosbag

def talker(msg):
    pub = rospy.Publisher('chatter', PointCloud2)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(1) #hz
    rospy.loginfo(msg)
    pub.publish(msg)
    rate.sleep()
 
if __name__ == '__main__':
    bag = rosbag.Bag('bag2.bag')
    
    for msg in bag.read_messages(topics=['/d435/depth/color/points']):
        talker(msg)

这是我的订阅者:

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import PointCloud2
import std_msgs.msg
import sensor_msgs.point_cloud2 as pcl2

def callback(data):
   #rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
    print("ptCloud received")

    ptc = Point

def listener():
   rospy.init_node('listener', anonymous=True)

   rospy.Subscriber("chatter", PointCloud2, callback)
   rospy.spin()

if __name__ == '__main__':
   listener()

有人可以帮我吗?尝试使用字符串

from std_msgs.msg import String

通信有效,但点云无效。我是 ROS 新手,求助!

【问题讨论】:

  • 为您的包文件中的每条消息调用talker 将不起作用,因为节点的创建应该只执行一次。查看 ROS wiki 上的示例:wiki.ros.org/ROS/Tutorials/…

标签: python ros point-clouds


【解决方案1】:

在通话方,您多次拨打rospy.init_node。节点初始化应该只进行一次。使用 Python“类”,您可以通过以下方式解决问题:

#!/usr/bin/env python
import rospy

from sensor_msgs.msg import PointCloud2
import std_msgs.msg
import sensor_msgs.point_cloud2 as pcl2
import rosbag

class Talker():
    def __init__(self, bag_file):
        self.pub = rospy.Publisher('chatter', PointCloud2)
        self.rate = rospy.Rate(1) #hz
        self.bag_file = bag_file

    def Talk(self):
        for msg in self.bag_file.read_messages(topics=['/d435/depth/color/points']):
            self.pub.publish(msg)
            self.rate.sleep()

if __name__ == '__main__':
    rospy.init_node('talker', anonymous=True)
    bag = rosbag.Bag('bag2.bag')
    talker = Talker(bag)
    talker.Talk()

【讨论】:

  • 谢谢,你是对的。我已经进行了建议的更改,但我仍然无法收到任何内容,也许我需要编辑主题?这是来自袋子{'/d435/depth/color/points': TopicTuple(msg_type='sensor_msgs/PointCloud2', message_count=2888, connections=1, frequency=30.004750050075828), '/t265/odom/sample': TopicTuple(msg_type='nav_msgs/Odometry', message_count=19227, connections=1, frequency=57456.21917808219)} 的信息另外,似乎在从袋子中发送第一条消息后,脚本退出了,但尝试在另一个脚本中打印消息它们都出现了!
  • 好像根本不发消息,我加了这段代码,只打印了'Error'。 try: self.pub.publish(msg) except: print('Error')
【解决方案2】:

这样做就可以了!

def Talk(self):
    for topic, msg, t in self.bag_file.read_messages(topics=['/d435/depth/color/points']):
        
        self.pub.publish(msg)  
        self.rate.sleep()       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2016-02-07
    • 1970-01-01
    相关资源
    最近更新 更多