2016-12-01 55 views
0

我有一些C++代码,其中我请turtlebot驱动坐标使用:Turtlebot并不总是以直线

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

从一个点的机器人移动到另一个。然而,它很少直接做这件事。看起来好像turtlebot在旋转之前开始移动。点之间没有任何障碍。它能够到达每个点,但它往往会在它们之间的小弧线上移动。

如何迫使机器人在一条直线上移动任何想法当有它的方式没有任何障碍,?

编辑:我使用turtlebot_bringup minimal.launchturtlebot_navigation gmapping_demo.launch

+0

它是否始终以弧形移动或仅在被告知要转弯后才动起来?我认为最有可能的解释(虽然我没有使用turtlebot自己)是车轮转速稍微不同移动(或许是由于车轮的直径公差),并且它不具有一个内置的陀螺仪,自动正确的效果。也许有一个校准过程可以应用? – Dave

+0

我同意戴夫说的。与几乎所有的机器人项目我曾上,让机器人长驱直入是做的最最难的事。您应该在示波器上检查电机的输出,看看它们的信号是什么样子并进行比较。 – KyleKW

+0

谢谢,但它确实有一个陀螺仪,以及它在大约1/3的时间完美的直线移动。如果我用控制器移动turtlebot,它也可以以完美的直线移动。 –

回答

0

它实际上是戴夫所说的,车轮以不同的速度运动,而两轮机器人将沿着一个运动较慢的车轮周围的弧线运动。但是,这是因为车轮直径的变化的,而是因为没有两个马达是相同的(由于制造),因此相同型号的甚至马达会有轻微的变化。给定相同的电流和电压,电机将驱动以稍微不同的速度;这使得机器人沿着弧线。

该解决方案实现了一个反馈控制,您可以通过一个简单的控制方案(如PID控制)获得旋转反馈并执行错误。 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