Duckietown 專案 – Duckiebot DB21M 基礎操作(四) – Camera Calibration 相機校正

DB21M-4
DB21M-4

在開始本篇文章之前,推薦各位可以先閱讀以下Duckietown 系列的文章 :

一、前言

在上一篇文章「Duckietown 專案 – Duckiebot DB21M 基礎操作(三) – PID controller 的使用」中,我們了解到 PID 控制器的運作方法。而為了將外部環境資訊導入至 PID 控制器中,我們需要透過感測器來感知外部環境。在 Duckiebot DB21M (以下簡稱小鴨車) 上,主要用來檢測外部環境的資訊的感測器為 – 相機。

在小鴨車上所使用的相機是 IMX219-160 Camera ,具有 160度廣角的視野,因此可讓小鴨車看到相對較廣的環境。

但也因為廣角的原因,會讓相機在成像時,產生圖像失真的特性,這會讓小鴨車在擷取外部環境資訊時,擷取到錯誤的資訊,例如實際上小鴨車離左邊的黃線僅有 2 公分,但影像在經過魚眼鏡頭時,卻因為失真效果,讓小鴨車擷取到的影像資訊為「離左邊黃線有 2.5 公分」,如果將錯誤的外部環境資訊輸入至 PID 控制器時,將會導致 PID控制器下達錯誤的指令給予小鴨車,讓小鴨車逐漸失去控制。關於鏡頭成像的原理與失真的校正方法推導,以及後續文章提及的各種參數,可至 duckietown 的 mooc 中的課程單元 – 「Robot Vision」查詢。

為了降低失真帶來的影響,我們便需要使用「相機校正」的操作。接下來,我們將在小鴨車上進行「相機校正」。

二、相機校正概念 – 相機本身校正與定向校正 

為了讓相機擷取到的資訊與實際上的資訊相差無幾,我們會需要使用到相機成像的數學模型 – 針孔成像模型(Pinhole camera model),這個模型描述了如何透過相機參考系( reference frame )的座標點轉換與找出投影在成像圖片上的投影點,來敘述真實世界的座標點與成像圖片的座標點關係。為了使用針孔成像模型,我們必須要找到一些參數,像是焦距、相機的傾斜程度以及相機相對於真實世界的姿態(pose)等等。

因此我們會需要兩種校正方法來找出相關參數:

  1. 相機本身校正(intrinsic calibration,或稱內部校正)
  2. 定向校正(extrinsic calibration,或稱外部校正)。

相機本身校正:是為了找出關於相機本身的參數,為了達成這個目的,我們需要一個輔助用的校正文件 – 棋盤格。在 Duckietown 中,校正用的棋盤格是以 A3大小、7×5 交叉點的棋盤格,並且每個黑、白格的邊長長度為 31 mm 所形成的。在相機校正中要特別注意的是,校正用的棋盤格並不是看棋盤格的數量,而是交叉點的數量(如下圖中的紅圈所示)。當然,棋盤格的交叉點數量與黑、白格長度並不是固定的,是可以根據系統設定去做修正。

棋盤格

定向校正:是為了找出相機成像時與真實世界的相對關係,例如在小鴨車中,相機擷取到的影像上方,在真實世界中就是離小鴨車相對較遠的位置。

透過相機本身校正與定向校正,我們便可以將針孔成像模型所需的各項參數,依據實際使用的相機而量身訂製,讓我們在使用各種不同相機時,相機所擷取到的資訊皆會與實際狀況相差無幾。在有了相機校正的基本概念後,接下來我們將開始實際操作囉!

三、操作環境需求

1. Duckietown 的操作環境設定

在開始之前可先參照「Duckietown – Duckiebot DB21M 小鴨車專案 Jetson-Nano 版平台組裝與操作環境設定介紹」文章中「六、測試小鴨車」的步驟啟動小鴨車;在搭配「Duckietown 專案 – Duckiebot DB21M 基礎操作(一)」的內容,進行操作環境的設定。

2. 程式碼來源

利用 duckietown-shell 的程式碼,便可以快速啟用相機校正的程式。

3. 準備 dcukiebot

確認小鴨車能夠正常運作,並且在操作主機中輸入下列指令,便可搜尋到自己的小鴨車。以本篇文章為例,可以搜尋到 hostname 為 edu 的機器。

$ dts fleet discover

確認小鴨車可以被搜尋到後,請在 Terminal 視窗中按下【ctrl】+【c】按鍵,取消執行中的程式。接著輸入下列指令更新小鴨車的 Docker 映像檔。

$ dts duckiebot update hostname

請注意,指令中的 hostname 指的是小鴨車上的實體機器名稱。以本篇文章為例,hostname 為 edu。

4. 準備棋盤格與地圖

相機本身校正所需要的棋盤格下載位置可在 duckietowngithub 中找到。使用印表機列印出後,可將其黏貼到一個固定表面,或放置在平穩的地面,因校正時棋盤格紙張本身不能有任何扭曲的現象發生,避免找尋到的相機校正參數與實際狀況有異。

定向校正除了棋盤格之外,為了讓定向校正更準確,還需要準備欲行進的線道路線圖中的一小部分。以本篇文章為例,準備的是一小部分的直線道路,相關的線道設計規則,可以參照 「Duckietown Appearance Specifications」。

地圖範例
棋盤格

四、小鴨車執行相機校正

1. 相機本身校正

在操作主機中,輸入下列指令,開啟小鴨車的相機本身校正。

請注意, hostname 指的是小鴨車的實體機器名稱,本篇文章使用的是 edu。

$ dts duckiebot calibrate_intrinsics hostname

程式執行成功後,便會跳出一個校正視窗,其中的影像便是由小鴨車的鏡頭所擷取到的影像,如下圖所示:

相機校正視窗

接下來我們可以移動棋盤格,直到校正參數下方的進度條都變成綠色為止。若是棋盤格沒有固定在一個穩定的表面,建議可以將棋盤格放置在平穩的桌面上,改為移動小鴨車。

當所有線條都呈現綠色後,便可以按下按鈕「CALIBRATE」,讓程式開始找出相關的參數。當校正完成後,請按下按鈕「COMMIT」(如下圖紅圈處)。

完成後校正視窗後便會自動關閉,若沒有自動關閉,請在校正視窗中,按下鍵盤的【Q】鍵,便可以關閉校正視窗。

2. 定向校正

完成相機本身校正後,接下來我們將進行定向校正。請輸入下列指令,開始執行定向校正。

$ dts duckiebot calibrate_extrinsics edu

第一次的校正,會需要先將小鴨車放置在棋盤格後方的輔助線上,讓兩個輪子對準在與 Y 軸垂直、較短的兩個線條上,如下圖所示。

接著回到操作主機的 Terminal 視窗中,按下鍵盤的【Enter】按鍵。校正完畢後,接著會出現提示,需要把小鴨車放到先前準備好的小部分地圖上,並且小鴨車需要在兩條線道之間,黃線在左邊、白線在右邊,如下圖所示。

小鴨車擺放完成後,再回到操作主機的 Terminal 視窗中,按下鍵盤的【Enter】按鍵,等待校正完畢。

校正好的參數檔案,皆會存放在小鴨車系統上的【/data/config/calibrations】路徑,如下圖所示。

小鴨車相機校正參數存放路徑

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