Duckietown 專案 – Duckiebot DB21M 基礎操作(二) – differential drive configuration的使用

若您已讀完本篇想要了解更多本次 Duckietown 系列的操作,請參考 :

一、前言

上一篇文章 「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 的線上課程查閱喔!

本次的小鴨車校正便到這邊結束囉!下一篇文章我們將會持續介紹小鴨車更多的操作功能!請各位多多關注與分享我們的文章喔!