【问题标题】:Why is the turtlebot not moving continously?为什么乌龟机器人不连续移动?
【发布时间】:2019-11-26 16:44:48
【问题描述】:
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()

我们在main中创建publisher(cmd_vel),运行gray类的main函数。

 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 函数创建一个订阅者,它在获取数据时运行“回调”。

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)

在回调函数内部,获取线速度和角速度值,并运行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。 它必须不断地移动,因为如果我们不发布数据,它仍然必须以上次发布时的速度移动。另外,回调函数每 0.1 秒运行一次,所以它一直在发送数据。

但它不会连续移动。它停了几秒钟,然后走了很短的时间,然后又停了,又走了很短的时间,依此类推。选择速度的代码可以正常工作,但是发送给turtlebot的代码不能正常工作。有人可以帮忙吗?

【问题讨论】:

    标签: callback delay ros publisher subscriber


    【解决方案1】:

    此外,回调函数每 0.1 秒运行一次。

    我认为这是不正确的。我看到您创建了一个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')接收数据的速率发布。由于这些是图像主题,它们可能需要很长时间才能更新,因此会延迟您对机器人的速度命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2011-03-16
      • 2013-10-30
      • 1970-01-01
      • 2012-03-03
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多