2016-12-01 59 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