为什么机器人不连续运动?

问题描述 投票:0回答:1
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()

我们将发布者(cmd_vel)作为main,并运行灰色类的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)

和... sendv函数将其发送到turtlebot。它必须不断移动,因为如果我们不发布数据,它仍然必须以上次发布时的速度移动。此外,回调函数每0.1秒运行一次,因此它会不断发送数据。

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

callback delay ros publisher subscriber
1个回答
0
投票

此外,回调函数每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”)接收数据的速度。由于这些是图像主题,因此它们可能需要花费大量时间进行更新,因此会延迟您对机器人的速度命令。

© www.soinside.com 2019 - 2024. All rights reserved.