Угол поворота превышает указанное значение - PullRequest
1 голос
/ 01 июня 2019

Я смоделировал робота в Webots. У робота есть одно активное колесико. Колесо имеет два двигателя, один для рулевого управления и один для линейной скорости. Я использую Webots ROS control, который предоставляет все в форме сервисов ROS.

Для линейного (вращение колеса) я использую его в управлении скоростью , в то время как управление рулевым управлением осуществляется в управлении положением . Управление скоростью работает, как ожидалось, но для управления положением руля не работает нормально. Всякий раз, когда роботу подаются команды рулевого управления, колесо поворачивается на 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()

Это - начальное положение колеса, и желаемое положение колеса можно увидеть здесь . Но двигатель не останавливается в нужном положении и достигает жесткого предела шарнира

...