我在Webots中模拟了一个机器人。该机器人有一个主动脚轮。脚轮有两个电机,一个用于转向,另一个用于线速度。我正在使用Webots ROS控件,该控件以ROS服务的形式提供所有内容。
对于线性(车轮旋转),我在velocity control中使用它,而转向控制在position control中进行。速度控制按预期工作,但转向位置控制无法正常工作。每当向机器人发出转向命令时,车轮都会旋转360度。但不止于指定的值并超过。这些命令采用rostopics的形式,在其回调中称为webots 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()
的硬极限。