Apriltag 是由密西根大學的 April Robotics Lab 所開發的一種視覺標記系統(Visual Fiducial Marker),可以用來做為機器導航時所需的定位標記。
在機器人領域中,經常使用視覺標記系統協助機器人確定自身位置,或用於辨識特定的物體或位置。然而,傳統的標記系統(如 QR code)在精準度、解碼速度或辨識可靠性上都明顯不足,因此Apriltag 便因應而生。
AprilTags 的設計概念上與 QR code 雷同也是一種二維條碼。然而,它們被設計成只儲存更少的資訊,因此能夠在更遠的距離就被辨識出來。
現在已經開發出許多不同的 Apriltag 標籤系列,各自針對不同的應用需求設計,常見的有 Tag36h11
、 Tag25h9
、 TagStandard41h12
、TagCircle21h7
這幾種。
標籤系列(Tag Family):
每個系列的名稱通常由標籤尺寸和海明距離組成。
前面的數字表示標籤尺寸(Size of tag code),即標籤的二維碼內部格子數量,決定了編碼的容量與資訊密度。尺寸越大,標籤包含的資訊越多,但檢測難度也越高。
後面的數字(如 h11、h9、h5)代表海明距離(Hamming Distance),表示標籤之間最小的位元(bit)錯誤距離。數值越大,標籤之間區別的可靠性越高,但可用的標籤數量會減少。
常用系列:
Tag36h11 / Tag25h9 / Tag16h5:這些是最常用的系列,具有較高的錯誤檢測能力,因此能提供較強的穩健性。在一定程度上可以容忍遮擋或噪音的干擾。適合大部分的應用場景,例如機器人定位和追蹤。尺寸上 Tag36h11 > Tag25h9 > Tag16h5,錯誤檢測能力 Tag36h11 > Tag25h9 > Tag16h5,解碼速度 Tag36h11 < Tag25h9 < Tag16h5。
TagStandard41h12 / TagStandard52h13:這兩個系列的標籤具有非常強的錯誤檢測能力,因此適合用在複雜環境中,但是解碼速度就會比其他系列慢。
TagCircle21h7 / TagCircle49h12:這些標籤具有圓形設計,適合某些需要圓形標記的情境。
除了設計出一系列的視覺圖樣之外,研究團隊也推出 AprilTag 開源函式庫,裡面包含了偵測標籤、計算相對位置和方位等功能,函式庫本身輕巧且容易移植,甚至在手機的處理器上都可以即時運作。
官方已經將所有的標籤都放上 GitHub 儲存庫 apriltag-imgs
,裡面包含一個轉換程式 tag_to_svg.py
。
安照官方指示取得需要的標籤 SVG 向量圖檔,接著用線上的轉換工具轉換成 PNG 圖檔,就可以拿去放到 Gazebo 中了。
在之後的模擬中,我會使用 Tag36h11
這個系列的標籤來製作定位標記模型。根據 Day 16 介紹過的製作模型的方法,我示範建立一個 apriltag_36h11_0_board
的模型(使用圖檔 tag36h11_0000.png
),它會是一個貼上 Apriltag 標籤的薄版。
前往 models
目錄,新增模型資料夾 apriltag_36h11_0_board
,接著在裡面建立 model.config
、model.sdf
、materials/scripts/36h11_0.material
和 materials/textures
資料夾。
模型 SDF:
在 model.sdf
加入內容如下:
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="apriltag_36h11_0_board">
<static>false</static>
<pose>0 0 0 0 0 0</pose>
<link name="base_link">
<inertial>
<mass>0.03</mass>
<inertia>
<ixx>0.005</ixx>
<iyy>0.005</iyy>
<izz>0.005</izz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>1 1 0.01</size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu>100</mu>
<mu2>50</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="visual">
<cast_shadows>true</cast_shadows>
<geometry>
<box>
<size>1 1 0.01</size>
</box>
</geometry>
<material>
<script> <!-- 使用 Apriltag 圖檔 -->
<uri>model://apriltag_36h11_0_board/materials/scripts</uri>
<uri>model://apriltag_36h11_0_board/materials/textures</uri>
<name>Apriltag/Tag36h11_0</name>
</script>
</material>
</visual>
</link>
</model>
</sdf>
模型貼圖設置:
在 materials/scripts
目錄下建立 36h11_0.material
材質描述檔,這類型的檔案是使用 Ogre3D 材質腳本語言寫的,Gazebo 使用這種檔案來呈現模型的材質和外觀。
36h11_0.material
內容如下:
material Apriltag/Tag36h11_0
{
technique
{
pass
{
ambient 0.5 0.5 0.5 1.0
diffuse 1.0 1.0 1.0 1.0
apecular 0.0 0.0 0.0 1.0 0.5
texture_unit
{
texture ../textures/tag36h11_0000.png
filtering trilinear
}
}
}
}
接著將剛才轉換好的 AprilTag 圖檔 tag36h11_0000.png
放入 materials/textures
,這樣我們就有一個 AprilTag 的模型了。
按照 Day 17 的做法將模型放到世界檔裡,之後就能讓無人機用來定位了。可以自己放置在喜歡的位置,我總之先做了六個 Tag36h11
系列的模型放在球場上。
下一篇會繼續介紹怎麼將 AprilTag 的偵測工具應用在影像上,然後進一步利用這些視覺標記上的資訊來引導無人機。