为什么 turtlebot 不连续移动?
Why is the turtlebot not moving continously?
if __name__ == '__main__':
rospy.init_node('gray')
settings = termios.tcgetattr(sys.stdin)
pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
x = 0
th = 0
node = Gray()
node.main()
我们把publisher(cmd_vel)放在main里,运行主函数class变灰
def __init__(self):
self.r = rospy.Rate(10)
self.selecting_sub_image = "compressed" # you can choose image type "compressed", "raw"
if self.selecting_sub_image == "compressed":
self._sub = rospy.Subscriber('/raspicam_node/image/compressed', CompressedImage, self.callback, queue_size=1)
else:
self._sub = rospy.Subscriber('/usb_cam/image_raw', Image, self.callback, queue_size=1)
self.bridge = CvBridge()
init 函数创建一个订阅者,当它获取数据时 运行s 'callback'。
def main(self):
rospy.spin()
然后是 运行spin() 函数。
v, ang = vel_select(lvalue, rvalue, left_angle_num, right_angle_num, left_down, red_dots)
self.sendv(v, ang)
在回调函数中,它获取线速度和 angular 速度值,并且 运行s 一个 sendv 函数将其发送给订阅者。
def sendv(self, lin_v, ang_v):
twist = Twist()
speed = rospy.get_param("~speed", 0.5)
turn = rospy.get_param("~turn", 1.0)
twist.linear.x = lin_v * speed
twist.angular.z = ang_v * turn
twist.linear.y, twist.linear.z, twist.angular.x, twist.angular.y = 0, 0, 0, 0
pub.publish(twist)
and...sendv 函数将其发送到 turtlebot。
它必须连续移动,因为如果我们不发布数据,它仍然必须以上次发布的速度移动。此外,回调函数 运行s 每 0.1 秒发送一次,因此它会不断发送数据。
但它不会连续移动。它停了几秒钟,走很短的时间,然后再次停下来,走很短的时间,依此类推。选择速度的代码工作正常,但将它发送到 turtlebot 的代码工作不正常。有人可以帮忙吗?
Also, callback function runs every 0.1 seconds.
我认为这是不正确的。我看到您制作了一个 self.r
对象,但从未在代码中的任何地方使用它来实现 10hz 的更新率。如果您想每 0.1 秒 运行 一次主循环,则必须在调用 rospy.spin() 之前在以下循环中调用您的命令(请参阅 rospy-rates):
self.r = rospy.Rate(10)
while not rospy.is_shutdown():
<user commands>
self.r.sleep()
但是,这对您也没有帮助,因为您的代码在订阅者回调中发布到 /cmd_vel,只有在从订阅者接收到一些数据时才会被调用。所以基本上,您的 /cmd_vel 不是以 10hz 的速率发布,而是以您从订阅主题 ('/raspicam_node/image/compressed') 接收数据的速率发布。由于这些是图像主题,它们可能需要花费大量时间进行更新,因此您对机器人的速度命令会延迟。
if __name__ == '__main__':
rospy.init_node('gray')
settings = termios.tcgetattr(sys.stdin)
pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
x = 0
th = 0
node = Gray()
node.main()
我们把publisher(cmd_vel)放在main里,运行主函数class变灰
def __init__(self):
self.r = rospy.Rate(10)
self.selecting_sub_image = "compressed" # you can choose image type "compressed", "raw"
if self.selecting_sub_image == "compressed":
self._sub = rospy.Subscriber('/raspicam_node/image/compressed', CompressedImage, self.callback, queue_size=1)
else:
self._sub = rospy.Subscriber('/usb_cam/image_raw', Image, self.callback, queue_size=1)
self.bridge = CvBridge()
init 函数创建一个订阅者,当它获取数据时 运行s 'callback'。
def main(self):
rospy.spin()
然后是 运行spin() 函数。
v, ang = vel_select(lvalue, rvalue, left_angle_num, right_angle_num, left_down, red_dots)
self.sendv(v, ang)
在回调函数中,它获取线速度和 angular 速度值,并且 运行s 一个 sendv 函数将其发送给订阅者。
def sendv(self, lin_v, ang_v):
twist = Twist()
speed = rospy.get_param("~speed", 0.5)
turn = rospy.get_param("~turn", 1.0)
twist.linear.x = lin_v * speed
twist.angular.z = ang_v * turn
twist.linear.y, twist.linear.z, twist.angular.x, twist.angular.y = 0, 0, 0, 0
pub.publish(twist)
and...sendv 函数将其发送到 turtlebot。 它必须连续移动,因为如果我们不发布数据,它仍然必须以上次发布的速度移动。此外,回调函数 运行s 每 0.1 秒发送一次,因此它会不断发送数据。
但它不会连续移动。它停了几秒钟,走很短的时间,然后再次停下来,走很短的时间,依此类推。选择速度的代码工作正常,但将它发送到 turtlebot 的代码工作不正常。有人可以帮忙吗?
Also, callback function runs every 0.1 seconds.
我认为这是不正确的。我看到您制作了一个 self.r
对象,但从未在代码中的任何地方使用它来实现 10hz 的更新率。如果您想每 0.1 秒 运行 一次主循环,则必须在调用 rospy.spin() 之前在以下循环中调用您的命令(请参阅 rospy-rates):
self.r = rospy.Rate(10)
while not rospy.is_shutdown():
<user commands>
self.r.sleep()
但是,这对您也没有帮助,因为您的代码在订阅者回调中发布到 /cmd_vel,只有在从订阅者接收到一些数据时才会被调用。所以基本上,您的 /cmd_vel 不是以 10hz 的速率发布,而是以您从订阅主题 ('/raspicam_node/image/compressed') 接收数据的速率发布。由于这些是图像主题,它们可能需要花费大量时间进行更新,因此您对机器人的速度命令会延迟。