【问题标题】:Unable to access class attribute in another function无法访问另一个函数中的类属性
【发布时间】:2021-12-19 06:14:57
【问题描述】:

import rospy
from sensor_msgs.msg import Imu

class ImuData:
    def __init__(self):
        #self.data = None
        pass

    def get_observation(self):
        rospy.Subscriber('/imu', Imu, self.imu_callback)
        imuData = self.data
        print(imuData)

    def imu_callback(self, msg):
        self.data = msg.orientation
        print(self.data)


if __name__ == '__main__':
    rospy.init_node('gett_imu', anonymous= True)
    idd = ImuData()
    idd.get_observation()

在上面的代码中,我想从get_observation函数访问imu_callback中定义的self.data。问题是我收到错误消息说ImuData 没有属性data。 我该如何解决这个问题?

注意:我觉得这个问题与 python 类有关,与 Ros 和 rospy 无关。

【问题讨论】:

  • 如果您在调用imu_callback 之前先调用get_observation,就会发生这种情况。出于这个原因,在 __init__ 之外初始化属性通常是个坏主意。

标签: python-3.x python-3.7 ros python-3.8 rospy


【解决方案1】:

这里发生了一些事情。一,在评论中提到,你应该在__init__ 中初始化你的属性。您看到的错误部分是由于 Python 以及 self.data 实际上尚未初始化的事实。

您遇到的第二个问题是您设置订阅者的位置。这也应该在__init__ 中完成,并且只进行一次。传感器将以相当恒定的速度发布,因此实际接收有关该主题的任何数据都需要时间。此外,如果您打算多次致电get_observation,您将创建一个您不希望的新订阅。

以下代码为固定示例:

    def __init__(self):
        rospy.Subscriber('/imu', Imu, self.imu_callback)
        self.data = None

    def get_observation(self):
        imuData = self.data
        print(imuData)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多