2016-12-01 7 views
0

У меня есть некоторые C++ код, в котором я дать turtlebot координату с помощью:Turtlebot не всегда ездить по прямой

goal.target_pose.pose.position.x = mypoint.point.x 
goal.target_pose.pose.position.y = mypoint.point.y 

Робот перемещается из одной точки в другую. Однако редко он делает это по прямой линии. Кажется, что черепаха начинает двигаться, прежде чем он начнет вращаться. Между точками нет никаких препятствий. Он способен добираться до каждой точки, но он имеет тенденцию двигаться в малой дуге между ними.

Любые идеи о том, как заставить робота двигаться по прямой линии, когда на пути нет препятствий?

Редактировать: Я использую turtlebot_bringup minimal.launch и turtlebot_navigation gmapping_demo.launch.

+0

Всегда ли он перемещается в дугах или только после того, как ему сказали повернуться? Я думаю, что наиболее вероятное объяснение (хотя я и не использовал сам черепаха) состоит в том, что колеса движутся с несколько разными скоростями (возможно, из-за допусков в диаметре колеса), и у него нет встроенного гироскопа для автоматического правильно для эффекта. Может быть, есть способ калибровки, который вы можете применить? – Dave

+0

Я согласен с тем, что сказал Дэйв. С почти любым проектом робота, над которым я работал, заставить робота ехать прямо - это самая сложная вещь. Вы должны проверить выходы ваших двигателей на осциллографе, чтобы увидеть, как выглядит их сигнал и сравнить. – KyleKW

+0

Спасибо, но у него есть гироскоп, и он движется в идеальной прямой линии примерно на 1/3 времени. Если я перемещаю черепаху с помощью контроллера, он может двигаться и в совершенно прямой линии. –

ответ

0

На самом деле Дэйв предположил, что колеса движутся с разной скоростью, а двухколесный робот будет следовать за дугой вокруг колеса, которое движется медленнее. Но это связано не с изменением диаметра колеса, а потому, что ни один из двух двигателей не идентичен (из-за изготовления), и поэтому даже двигатели той же модели будут иметь небольшие отклонения. Учитывая тот же ток и напряжение, двигатели будут двигаться с немного другой скоростью; что заставляет робота следовать дуге.

Решение заключается в реализации управления с обратной связью, где вы получаете обратную связь вращения и реализуете ошибку в простой схеме управления, такой как ПИД-регулирование. Псевдокод для PID выглядит следующим образом:

Kp = ..         //constant 
    Loop forever 
     read sensors  
     error = TargetValue - offset  
     integral = integral + error  // calculate the integral 
     derivative = error - lastError  // calculate the derivative 
     Turn = Kp*error + Ki*integral + Kd*derivative 
     lastError = error     // save the current error so it can be the lastError next time around 
    end loop forever