【问题标题】:Subscriber receives String with 'Data: ""'订阅者收到带有“数据:”的字符串
【发布时间】:2021-12-30 15:48:37
【问题描述】:

我有一个发布者发送一个从 0 到 6 或无的数字。所以我在发送之前将其转换为字符串,以确保它可以发送“None”值。

        self.pub = rospy.Publisher("jugada", String, queue_size=1)
        self.pub.publish(str(col))

然后我希望订阅者收到它:

    class clicker(object):
        def __init__(self):
            self.jugada_sub = rospy.Subscriber("jugada",String, self.callback)

        def callback(self, data): 
            jugada = data
            print(jugada)

而不是打印:

3

而是打印

数据:“3”

它分解了我需要该数字(或无)的其余代码。 我尝试 str(data) 然后尝试编辑字符串以删除“数据:”部分,但这不起作用。 我试着用谷歌搜索了一个小时,但不知道如何摆脱“数据:”或如何更改消息类型以仅发送字符串。

PS 稍后在我做的代码中:

        if jugada != "None":
            jugada = int(jugada)

我得到错误:int() 参数必须是一个字符串

如果我在开始时执行 jugada = str(data),我会收到错误:Invalid literal for int() with base 10: 'data: "3"'

【问题讨论】:

  • 你正在使用一些库,它没有将原始消息传递给回调。查阅该库的文档以了解类型是什么,以及如何从中获取原始数据。

标签: python ros rospy


【解决方案1】:

ROS 消息被定义为类,而不是内置类型。对于std_msg 类型,您需要使用.data 属性直接检索数据。举个例子:

def callback(self, data): 
    jugada = data.data
    print(jugada)

另外几个笔记。发布数据时,最好不要将原始类型直接传递给.publish,而是使用如下消息类型:

output_msg = String()
output_msg.data = 'some string val'
pub.publish(output_msg)

最后,如果您要发布整数数据,您应该使用以下整数类型之一:Int8Int16Int32

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多