【问题标题】:Python callback attribute errorPython回调属性错误
【发布时间】:2018-08-29 14:42:46
【问题描述】:

我编写了一个 python ROS 节点来订阅两个不同的主题,并使用 ApproximateTimeSynchroniser 基本上通过它们的时间戳匹配消息并将这些消息捆绑到一个回调例程中。如果我使用回调简单地打印出收到的两条消息,它工作正常。

但是,我想使用回调例程中接收到的 Pose 2D 数据中的 x 和 y 位置来填充 geometry_msgs/Pose 消息。使用下面的代码,我通过在回调中创建一个空的 Pose 对象来完成此操作例行公事:

  #!/usr/bin/env python


import message_filters
import rospy
from laser_line_extraction.msg import LineSegmentList
from geometry_msgs.msg import Pose,  Pose2D
from std_msgs.msg import Int32, Float32

rospy.init_node('simul-subscriber')

def callback(Pose2D, LineSegmentList): 
 pose = Pose()
 pose.position.x =  Pose2D.position.x 
 pose.position.y =  Pose2D.position.y 
 pose.position.z = 0
 #print(Pose2D,  LineSegmentList, pose)
 print(pose)
 print(LineSegmentList)

line_segment_sub = message_filters.Subscriber('/line_segments', LineSegmentList)
pose_2D_sub = message_filters.Subscriber('/pose2D',Pose2D)

ts = message_filters.ApproximateTimeSynchronizer([line_segment_sub, pose_2D_sub], 10, 0.1, allow_headerless=True)
ts.registerCallback(callback)

rospy.spin()

不幸的是,这在运行此节点时会产生一个奇怪的错误:

[ERROR] [1535552711.709928, 1381.743000]: bad callback: <bound method Subscriber.callback of <message_filters.Subscriber object at 0x7f7af3cee9d0>>
Traceback (most recent call last):
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
    cb(msg)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/message_filters/__init__.py", line 75, in callback
    self.signalMessage(msg)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/message_filters/__init__.py", line 57, in signalMessage
    cb(*(msg + args))
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/message_filters/__init__.py", line 287, in add
    self.signalMessage(*msgs)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/message_filters/__init__.py", line 57, in signalMessage
    cb(*(msg + args))
  File "/home/elisabeth/catkin_ws/src/hector_quadrotor/hector_quadrotor_demo/python_scripts/simul-subscriber.py", line 14, in callback
    pose.position.x =  Pose2D.position.x
AttributeError: 'LineSegmentList' object has no attribute 'position'

这很奇怪,因为位置属性仅用于 Pose 2D 而不是 LineSegmentList msg。我怀疑这更像是一个 python 问题而不是 ROS 问题,任何人都可以提供帮助将不胜感激!

我正在关注http://wiki.ros.org/message_filters 中的示例,他们在其中获取了两个不同的主题 image 和 cameraInfo 并将它们传递给回调函数

  1 import message_filters
   2 from sensor_msgs.msg import Image, CameraInfo
   3 
   4 def callback(image, camera_info):
   5   # Solve all of perception here...
   6 
   7 image_sub = message_filters.Subscriber('image', Image)
   8 info_sub = message_filters.Subscriber('camera_info', CameraInfo)
   9 
  10 ts = message_filters.TimeSynchronizer([image_sub, info_sub], 10)
  11 ts.registerCallback(callback)
  12 rospy.spin()

【问题讨论】:

  • 你为什么混淆类名和函数参数? from laser_line_extraction.msg import LineSegmentList from geometry_msgs.msg import Pose, Pose2D def callback(Pose2D, LineSegmentList):只是自找麻烦
  • 感谢响应等待,那么 def 回调中应该包含哪些参数?
  • 您当前拥有的任何其他名称。除非message_filters 以一种非常奇怪的方式工作。
  • 我将添加我正在关注的模板示例
  • 你显然没有遵循模板。

标签: python ros sensor-fusion


【解决方案1】:

您将类名与对象名混淆了。 对您的程序的修复应该是直截了当的。 我已将Pose2D 更改为pose2d,并将LineSegmentList 更改为linesegmentlist,并在必要的地方添加了# --- Change ...

#!/usr/bin/env python
import message_filters
import rospy
from laser_line_extraction.msg import LineSegmentList
from geometry_msgs.msg import Pose,  Pose2D
from std_msgs.msg import Int32, Float32

rospy.init_node('simul-subscriber')

# --- CHANGE: using proper object names instread of class names
def callback(pose2d, linesegmentlist): 
 pose = Pose()
 # --- CHANGE: using the object
 pose.position.x =  pose2d.position.x 
 pose.position.y =  pose2d.position.y 
 pose.position.z = 0
 #print(pose2d,  linesegmentlist, pose)
 print(pose)
 print(linesegmentlist)

line_segment_sub = message_filters.Subscriber('/line_segments', LineSegmentList)
pose_2D_sub = message_filters.Subscriber('/pose2D',Pose2D)

ts = message_filters.ApproximateTimeSynchronizer([line_segment_sub, pose_2D_sub], 10, 0.1, allow_headerless=True)
ts.registerCallback(callback)

rospy.spin()

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 2014-03-21
    • 2013-07-01
    • 2011-10-12
    • 1970-01-01
    • 2016-05-01
    • 2021-07-24
    • 2012-10-31
    相关资源
    最近更新 更多