这已经被问了很多次的SO,但我有我没有看到一些其它的错误:
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from rosbook.msg import Detector
def scan_callback(msg):
global closest
global closest_dir
closest_dir = ""
closest = min(msg.forward, msg.left, msg.right, msg.back)
if (msg.forward == closest):
closest_dir = "forward"
elif (msg.left == closets):
closest_dir = "left"
elif (msg.right == closest):
closest_dir = "right"
else:
closest_dir = "back"
# Create a Publisher object. queue_size=1 means that messages that are
# published but not handled by received are lost beyond queue size.
cmd_vel_pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
detect_sub = rospy.Subscriber('detector', Detector, scan_callback)
# Initialize this program as a node
rospy.init_node('pid_demo')
print (rospy.Time.now())
tw_for = Twist()
tw_for.linear.x = 0.3
tw_rot = Twist()
tw_for.angular.z = 0.5
# rate object gets a sleep() method which will sleep 1/10 seconds
rate = rospy.Rate(1)
while not rospy.is_shutdown():
print (rospy.Time.now())
if (closest_dir != "forward"):
cmd_vel_pub.publish(tw_for)
else:
cmd_vel_pub.publish(tw_rot)
rate.sleep()
给出了错误:
0
0
Traceback (most recent call last):
File "/home/pitosalas/catkin_ws/src/rosbook/scripts/pid_driver.py", line 42, in <module>
if (closest_dir != "forward"):
NameError: global name 'closest_dir' is not defined
这两个0的很有趣。这意味着回调调用之前while循环跑一次,并触发该错误。我试着动了全球各地,并更改名称,但对我来说,这看起来完全有效的!
只要定义方法closest
之外的变量closest_dir
和scan_callback
。充满希望你不会看到回溯
closest_dir = None
closest = None
def scan_callback(msg): ...