1. 程式人生 > >【turtlebot】陀螺儀的安裝以及標定(iRobot Create 底盤+ADXRS610陀螺儀)

【turtlebot】陀螺儀的安裝以及標定(iRobot Create 底盤+ADXRS610陀螺儀)

一、前言

首先說一下我的執行環境
作業系統:UbuntuKylin-14.04
ROS版本:indigo
機器人平臺:iRobot Create
陀螺儀:ADXRS610(±300°/sec)
注意Turtlebot2採用kobuki底盤,自帶標定好的陀螺儀,所以不需要標定。但是我的iRobot Create移動機器人平臺本身是不帶陀螺儀的,我購買了dfrobot社群的ADXRS610陀螺儀,陀螺儀的模擬輸出引腳RATEOUT接在iRobot Create的cargo bay聯結器(就是底盤中間的DB-25並口)PIN4引腳Analog input上,連上電腦可以直接讀取到陀螺儀模擬訊號經過底盤AD晶片轉換過得數字訊號,預設值是500。

二、陀螺儀的安裝

(1)ADXRS613

有些版本的Turtlebot是自帶ADXRS613陀螺儀晶片的,在Sparkfun上也有這塊晶片的breakout board:Gyro Breakout Board - ADXRS613 - 150°/s
Gyro Breakout Board - ADXRS613 - 150°/s
這塊板子已經停產,我找了下sparkfun的中國代理商奧鬆機器人商城裡也買不到這塊板子。不過sparkfun的主頁上有這塊板子的原理圖,可以自己淘寶買ADI公司的ADXRS613晶片自己焊一塊陀螺儀的接線板,值得注意的是這塊晶片是BGA封裝的,它沒有引腳,底部是錫球,如下圖:
ADXRS613正面
ADXRS613底部
這種封裝的晶片手工焊成功率挺低的,我第一次就是買了晶片照著原理圖設計了PCB,然後把板子做出來焊上元件,結果RATEOUT引腳輸出是個定值,旋轉晶片輸出電壓不隨之變化,妥妥地焊壞了。

(2)ADXRS610

不得不說國外良心網站真多,我在dfrobot上找到了類似上面那塊板子的陀螺儀:Gyro Breakout Board - ADXRS610
Gyro Breakout Board - ADXRS610
可以在dfrobot的中國代理商 DFRobot開源硬體及機器人商城購買:http://www.dfrobot.com.cn/goods.php?id=333
這塊板子接線和上面板子差不多,就是測量範圍(gyro_measurement_range)有差別:
ADXRS610:±300°/秒
ADXRS613:±150°/秒
不過ADXRS610便宜好多,效能上稍微差點,不過夠用了,最重要的是不用自己焊BGA封裝的晶片!!!
【安裝】


首先把排針焊在這塊板子上,利用杜邦線把5V、GND、REATEOUT三個引腳引出來,接到一個DB-25的免焊轉接頭公頭上,轉接頭如下圖所示:
DB-25的免焊轉接頭公頭(右)母頭(左)
可以將杜邦線的另一頭接到DB-25轉接頭的接線端子上,再把轉接頭插到Turtlebot底部的DB-25並口上。
連好線之後用萬用表測一下線路是否連通。接好之後如下圖:
安裝示意圖1
安裝示意圖2
安裝示意圖3
【注意】
1、接線:
5V——PIN8
GND——PIN16
REATEOUT——PIN4
2、把板子固定在機器人中央,如下圖我是用雙面膠粘在亞克力板中間的。
3、公頭上的引腳順序和母頭上的引腳順序是左右相反的。
【測試】插上DB-25轉接頭,開啟Turtlebot的電源開關,先讓陀螺儀預熱一會兒,用萬用表測陀螺儀靜止時RATEOUT電壓是否停在2.5V周圍,再旋轉陀螺儀,測RATEOUT電壓是否隨旋轉角速度而變化。如果以上輸出都沒問題,那麼陀螺儀硬體連線已經完成可以執行標定程式了。

三、執行標定程式

(1)首先確保已經安裝Turtlebot相關的包

(2)開始標定

1.以最小模式執行Turtlebot

首先把turtlebot的kinect擺正,把它擺在一面至少兩米長的牆前面,讓它面向牆,離牆大約30釐米,啟動turtlebot相關節點

$ roslaunch turtlebot_bringup minimal.launch

2.設定陀螺儀量程

這取決於陀螺儀晶片的型號,比如
ADXRS610的量程是±300°/秒,那麼gyro_measurement_range就設為300
ADXRS613的量程是±150°/秒,那麼gyro_measurement_range就設為150
ADXRS652的量程是±250°/秒,那麼gyro_measurement_range就設為250
我的陀螺儀模組採用的晶片是ADXRS610。
問題就來了,怎麼設定這個值呢?有三種方式:
一是直接在終端設定這個值,如下

$ rosparam set /turtlebot_node/gyro_measurement_range 300

這種方式只是臨時修改執行過程中的引數,下次啟動Turtlebot它仍然會從檔案裡讀取預設的值;
二是在rqt裡設定這個值,如下

$ rosrun rqt_reconfigure rqt_reconfigure 

開啟rqt介面,在面板上直接設定gyro_measurement_range的值為300,但是和上面一樣,這種方法只能臨時設定gyro_measurement_range的值;
三是在啟動檔案裡面設定相應的啟動引數,將gyro_measurement_range設定為300,具體步驟是找到/home/siat/turtlebot/src/turtlebot/turtlebot_bringup/launch\minimal.launch,然後開啟它,在原來的< arg >標籤下加上下列語句作為啟動引數

<!--Turtlebot calibration:陀螺儀(ADXRS610)標定引數-->
  <param name="turtlebot_node/gyro_measurement_range" value="300.000000"/>
  <param name="turtlebot_node/gyro_scale_correction" value="1"/>
  <param name="turtlebot_node/odom_angular_scale_correction" value="1"/>

現在只要改gyro_measurement_range為300,剩下兩個引數先設為1,它們將會在標定的時候生成。

3.啟動標定節點

一開始turtlebot是面向牆的

$ roslaunch turtlebot_calibration calibrate.launch

這時候標定就開始了,他會一開始逆時針轉兩圈,然後停下,輸出資訊是陀螺儀和里程計的誤差,再尋找牆將自己轉到正面對牆的位置;然後再轉一圈,停下,輸出陀螺儀和里程計的誤差,把尋找牆把自己調整到正面對牆的位置;接著轉兩圈測試,最終輸出陀螺儀和里程計的誤差以及推薦的turtlebot_node/gyro_scale_correction和turtlebot_node/odom_angular_scale_correction值,由於標定程式裡還以為啟動turtlebot的檔名是老版本的turtlebot.launch,所以這裡是不會直接將這兩個值寫到launch檔案中的,我們可以手動修改前面新增到minimal.launch檔案中的的程式碼將之設定為標定程式推薦的值。
注意
當然為了方便我可以直接修改/home/siat/turtlebot/src/turtlebot_apps/turtlebot_calibration/src/turtlebot_calibration\calibrate.py檔案中的下列語句:
(主要是修改路徑,請根據自己路徑修改)

273行的
f = open("/etc/ros/distro/turtlebot.launch", "r")
改為
f = open("/home/siat/turtlebot/src/turtlebot/turtlebot_bringup/launch/minimal.launch", "r")

第288行的
f = open("/etc/ros/distro/turtlebot.launch", "w")
改為
f = open("/home/siat/turtlebot/src/turtlebot/turtlebot_bringup/launch/minimal.launch", "w")

這樣標定程式就能找到你的minimal.launch檔案並自動寫入標定好的資料了,標定完之後你可以開啟minimal.launch檔案看看turtlebot_node/gyro_scale_correction和turtlebot_node/odom_angular_scale_correction是否已經更新為標定之後的資料

以下是標定過程中的經驗僅供參考:
1、在轉完整圈的過程中turtlebot應該是很順暢的轉完一個圈的,雖然可能有點慢,但卻是連續的,不會出現一頓一頓的情況,如果turtlebot在轉一個完整圈的過程中會停一下走一下,甚至停幾分鐘才繼續走,那就是節點執行有問題了,你應該重啟節點,檢查節點啟動的時候turtlebot是否已經正面對著牆,開啟turtlebot_dashboard檢查陀螺儀是否有輸出等等。
2、一般來說標定結果turtlebot_node/gyro_scale_correction和turtlebot_node/odom_angular_scale_correction的值會大於1,如果出現了0.5左右甚至更小的值,並且在標定過程中他們旋轉圈數不是兩圈和一圈,而是出現了三圈這樣的情況,那就說明標定陷入了局部最優解,雖然他們顯示的誤差可能是一個非常小的值,比如1.1%和3%這樣小的誤差,那是因為它多轉了整整一圈而正好面對牆。可手動修改minimal.launch檔案把這兩個值設為1.5,再重新執行標定程式。
3、標定是可以連續進行的,第一次標定完之後程式給出了turtlebot_node/gyro_scale_correction和turtlebot_node/odom_angular_scale_correction的推薦值,這時你用rosparam get這兩個引數會發現他們在當前執行的節點下已經被修改為標定推薦的值了,這時你可以再次執行標定程式,直到誤差穩定在一個較小的範圍內。最終我的標定結果是:

turtlebot_node/gyro_scale_correction1.304699 誤差0.1%
turtlebot_node/odom_angular_scale_correction1.032019 誤差6.8%

四、利用標定好的陀螺儀和里程計執行導航建圖包

插上串列埠,給許可權:

$ cd /dev/
$ sudo chmod 777 ttyUSB0

執行turtlebot節點:

$ roslaunch turtlebot_bringup minimal.launch

執行導航建圖節點:

$ roslaunch turtlebot_navigation gmapping_demo.launch

執行視覺化節點:

$ roslaunch turtlebot_rviz_launchers view_teleop_navigation.launch 

建圖完畢儲存地圖:

$ rosrun map_server map_saver -f ~/map/map1

我的建圖如下:
這裡寫圖片描述
儲存地圖之後是這樣的:
這裡寫圖片描述