0

也就是说,pub = None下面的值是多少?何时以及为什么这是一个好习惯?

counter = 0
pub = None

def callback_receive_number_data(msg):
    global counter
    counter += msg.data
    new_msg = Int64()
    new_msg.data = counter
    pub.publish(new_msg)

sub = rospy.Subscriber('/number', Int64, callback_receive_number_data)
pub = rospy.Publisher('/number_count', Int64, queue_size=10)
4

3 回答 3

2

谷歌搜索部分代码将我带到这个页面,该页面分解了每一行代码。

具体到上面有问题的部分,该网站指出:

我们初始化一个全局计数器以及一个发布者。如果我们想在程序的所有函数中使用它们,我们必须在全局范围内声明它们,这远非最优。稍后我们将看到 OOP 代码将解决该问题。

因此,简而言之,这是一种声明变量而无需为其分配任何内容的方法。如果它是一个字符串,你可以像这样声明它,some_string = ""但是因为它pub是一个“发布者”,所以这只是一种更简单的方式来声明它以供以后在代码中使用。

于 2019-04-18T21:29:37.287 回答
1

我主要这样做是为了让我的 IDE 不会对我大喊该变量可能未声明。在上面的示例中,如果您没有该pub = None行,一些编辑为了聪明,会突出显示该行pub.publish(new_msg)并说“pub 可能未声明!” 或类似的东西。只要在运行时中,pub在调用该函数之前就存在,这不是问题。编辑器无法仅通过查看您的代码来弄清楚这一点(至少不容易),因此为了避免警告,pub在使用它之前确保名称空间中存在更容易。

于 2019-04-18T21:41:00.113 回答
0

pub = None不需要这条线。它可能很有用,但是对于编写的其余代码,它不是。

问题是您正在编写一个函数,该函数期望有一个全局变量pub,它将调用某些方法。pub如果未定义,该代码将失败。不幸的是,如果是(只是以不同的方式)它也会失败。pubNone

现在,只要在pub获得实际值之前没有调用该函数,这可能不是问题。但是在这段代码中,该函数确实作为回调传递给rospy.Subscriberbeforepub被重新分配,因此(在不知道任何关于的情况下rospy)理论上它可能会在顶层的下一行运行之前立即被调用,给出pub一个实际值。

有几种方法可以让事情变得更好。首先,您可以pub在使用. 考虑只交换最后两行的顺序,以便首先定义,然后(将函数作为其回调)。callback_receive_number_datapubsub

其次,您可以将错误处理代码添加到回调函数以检测何时pub尚未定义。如果没有适当的值,这将使函数以受控方式运行pub。对于这种方法,pub = None赋值会很有帮助,因为在变量中检测到错误值比在变量完全丢失时更容易。但是这种方法也可能会抑制真正的错误,所以我只会在你确定在每种情况下都有一种处理错误的好方法时才会选择它(而不是崩溃并希望向程序员指出错误的回溯) .

于 2019-04-18T21:48:45.937 回答