若您已讀完本篇想要了解更多本次 Duckietown 系列的操作,請參考 :
- Duckietown – Duckiebot DB21M 小鴨車專案 Jetson-Nano 版平台組裝與操作環境設定介紹
- Duckietown 專案 – Duckiebot DB21M 基礎操作(一)
一、前言
上一篇文章 「Duckietown 專案 – Duckiebot DB21M 基礎操作(一)」中,我們成功的使用鍵盤遠端遙控小鴨車 DB21M(以下皆簡稱為小鴨車)。
不過在遙控小鴨車的過程中,可以發現到小鴨車在前進時,行進的路線越來越歪斜,原本應該要「直直」前進的小鴨車,最後居然變成向左彎或向右彎的小鴨車了!這樣的車子沒有辦法好好的遙控啊~
這時我們就可以使用 differential drive configuration,讓 duckiebot 可以穩穩地走在一條直線上喔!事不宜遲,我們就來看看要如何校正小鴨車的行進路線吧!
二、Differential drive configuration
為了讓車子的移動是可以被控制的,我們會需要使用「數學模型」。利用這些數學模型,我們可以量化一些必要性的參數數值,來幫助我們完成特定的任務。
小鴨車是一台「差動輪型機器人(differential drive robot)」 ,每個輪胎的運轉都是透過 DC 馬達控制的。DC 馬達接收到輸入的電壓,便會開始運轉並產生扭矩轉動馬達上的軸,從而讓輪胎旋轉。經由輪胎的轉動,機器人便會隨著時間不斷地改變自身的姿態(pose),這個姿態便是我們想要量化的資料。
所謂「差動輪型機器人 (differential drive robot) 」,即是指依據機身兩側獨立的驅動輪來移動的機器人。
因此透過數學模型,我們將可以解答下列兩個問題:
- 給定一連串的指令給輪胎後,機器人將會如何移動?
- 如果我們想要機器人按照特定的方法移動,我們需要傳送什麼指令?
此篇文章我們將不討論數學模型的推導過程,僅將小鴨車的運動學數學模型列出 :
- 右輪:(gain + trim)(v + 0.5 * omega * baseline)/(radius * k)
- 左輪:(gain – trim)(v + 0.5 * omega * baseline)/(radius * k)
在上述的數學模型中,提及的各項參數 :
- gain:期望的速度比例係數。預設值為 1.0
- trim:馬達左、右輪的修整系數,用來調整左右輪的速差,以便讓機器人在下達前進指令時,能夠直行往前。預設值為 0.0
- baseline : 左、右輪胎軸心間的距離,預設值為 0.1(m)
- radius:輪胎的半徑,預設值為 0.0318(m)
- k:馬達常數,在此假定左、右馬達的馬達常數相等,預設值為 27.0
- v:由外部給定的線性速度值
- omega:由外部給定的角速度值
接下來,我們便可以根據小鴨車的運動學數學模型,開始校正小鴨車囉!
三、操作環境需求
1. 完成 Duckietown 的環境設定
我們需要一個能夠進行遠端操作的主機系統,才能夠快速地使用 differential drive configuration,來校正小鴨車的行進路線。Duckietown 的操作環境設定,請參照「Duckietown – Duckiebot DB21M 小鴨車專案 Jetson-Nano 版平台組裝與操作環境設定介紹」此篇文章 。
2. 使用鍵盤,遠端遙控小鴨車
Duckietown的操作環境設定完成後,便可以依照「Duckietown 專案 – Duckiebot DB21M 基礎操作(一)」,遠端操作小鴨車。當確認能夠遠端遙控小鴨車後,我們便可以開始準備校正小鴨車囉!
四、校正與參數設定
1. 開啟 duckietown-shell 的 GUI 工具
duckietown-shell 使用 Docker 技術,將整個專案的操作環境以容器化的方式,執行各項指令,這讓我們在使用 duckietown 專案時,不須花費時間在操作環境的設定與除錯,能夠將注意力專注在自動駕駛車的學習上。
請在操作主機上,輸入指令開啟 duckietown-shell 的 GUI工具:$ dts start_gui_tools hostname
需要注意的是,hostname 指的是小鴨車的實體機器名稱,請不要直接輸入 hostname 字樣。本教學範例的 hostname 使用的是 edu,如下圖所示:
2. 搜尋 ROS 系統的參數
我們可以透過 ROS 系統,即時修改小鴨車的運動學數學模型中的參數。
在進入 start_gui_tools 的 Terminal 視窗中,輸入指令開始搜尋 ROS系統中的參數 : $ rosparam list
在一長串的參數中,我們主要修改的參數有兩個,分別為
- /hostname/kinematics_node/gain
- /hostname/kinematics_node/trim
請記得,hostname 指的是小鴨車的實體機器名稱,請不要直接找尋 hostname的字樣,本教學範例的 hostname 使用的是 edu。
3. 設定小鴨車運動學數學模型中的參數
接著我們將使用 rosparam 的指令,來擷取或設定 ROS 系統中的參數。
- 擷取 ROS 系統參數 : rosparam get 【parameter name】
- 設定 ROS 系統參數 : rosparam set 【parameter name】
本教學範例將以修改參數 【/hostname/kinematics_node/trim】為範例。
根據小鴨車的運動學數學模型,我們可以看出 :
- trim > 0 : 右輪速度加快,小鴨車在前進時將會偏左前進
- trim < 0 : 左輪速度加快,小鴨車在前進時將會偏右前進
現在在教學範例中的小鴨車,在前進時會偏左移動,表示目前的 trim 值,會讓小鴨車的右輪速度比左輪快。
為了改善小鴨車前進時偏向左邊移動的情形,我們需要向下修正 trim 值,因此輸入相對應的指令,向下修正 trim 值 :
$ rosparam set /hostname/kinematics_node/trim value
其中 hostname 是小鴨車的實體機器名稱,而 value 則是想要修正的數值。下圖將展示本篇文章中所使用的指令,讓左輪的速度加快、右輪的速度減慢。
接著我們便需要透過多次的移動小鴨車與設定小鴨車參數,讓小鴨車能夠在接收到前進的指令時,盡量的走在一條直線上。
4. 儲存設定好的參數
當小鴨車在調整參數後,能夠走在一條直線時,便可以將調整好的參數儲存起來。下列指令為儲存調整好的參數指令:
$ rosservice call /hostname/kinematics_node/save_calibration
將參數儲存完成後,便可以放心地關閉小鴨車的系統囉!
五、延伸閱讀
若想要更加了解小鴨車的 Differential drive configuration 是如何推導出來的,可以至 duckietown 的線上課程查閱喔!
本次的小鴨車校正便到這邊結束囉!下一篇文章我們將會持續介紹小鴨車更多的操作功能!請各位多多關注與分享我們的文章喔!