2

我在 Webots 中模拟了一个机器人。机器人有一个主动脚轮。脚轮有两台电机,一台用于转向,一台用于线速度。我正在使用 Webots ROS 控件,它以 ROS 服务的形式提供所有内容。

对于线性(车轮旋转),我在速度控制中使用它,而转向控制在位置控制中完成。速度控制按预期工作,但转向位置控制工作不正常。每当向机器人发出转向指令时,轮子都会转动 360 度。但不会在指定的值处停止并超过。命令采用 rostopics 的形式,在其回调中调用 webbots rosservices。

作为调试,我在终端中调用了服务并转到指定的值,并且对同一电机的多次服务调用不会超调。但是在下面的脚本中调用相同的服务(通过速度和转向主题)会产生问题。

代码


def velocityBridgeCallback(msg, args):
    base_name = '/AGV01'
    if args == 'velocity':
        device = base_name + '/wheel_main_rotation_motor'
        rospy.wait_for_service(device + '/set_position')
        set_position = rospy.ServiceProxy(device+'/set_position',set_float)
        set_position(float('inf'))
        rospy.wait_for_service(device + '/set_velocity')
        set_velocity = rospy.ServiceProxy(device+'/set_velocity',set_float)
        set_velocity(msg.data)
    elif args == 'steer':
        device_steer = base_name+'/wheel_main_steer_motor'
        rospy.wait_for_service(device_steer+'/set_position')
        set_position = rospy.ServiceProxy(device_steer+'/set_position',set_float)
        set_position(msg.data)
if __name__ == '__main__':
    rospy.init_node('AGV_velocity_bridge', anonymous = False, log_level = rospy.INFO)
    rospy.Subscriber('/velocity_filter/command', Float64, velocityBridgeCallback, ('velocity'))
    rospy.Subscriber('/steer_filter/command', Float64, velocityBridgeCallback, ('steer'))
    rospy.spin()

这是轮子的初始位置,可以在此处看到轮子的所需位置。但是电机并没有停在所需的位置,而是一直到关节的硬极限

4

0 回答 0