iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
自我挑戰組

ROS 筆記:要怎麼叫無人機自己飛系列 第 23

【ROS 筆記:要怎麼叫無人機自己飛】Day 23:使用 AprilTag 做為場景中的定位標記

  • 分享至 

  • xImage
  •  

什麼是 Apriltag?

Apriltag 是由密西根大學的 April Robotics Lab 所開發的一種視覺標記系統(Visual Fiducial Marker),可以用來做為機器導航時所需的定位標記。

在機器人領域中,經常使用視覺標記系統協助機器人確定自身位置,或用於辨識特定的物體或位置。然而,傳統的標記系統(如 QR code)在精準度、解碼速度或辨識可靠性上都明顯不足,因此Apriltag 便因應而生。

圖片來源:密西根大學的 April Robotics Lab

Apriltag 圖樣系列

AprilTags 的設計概念上與 QR code 雷同也是一種二維條碼。然而,它們被設計成只儲存更少的資訊,因此能夠在更遠的距離就被辨識出來。

現在已經開發出許多不同的 Apriltag 標籤系列,各自針對不同的應用需求設計,常見的有 Tag36h11Tag25h9TagStandard41h12TagCircle21h7 這幾種。

圖片來源:密西根大學的 April Robotics Lab
  • 標籤系列(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:這些標籤具有圓形設計,適合某些需要圓形標記的情境。

Gazebo 裡的 Apriltag

除了設計出一系列的視覺圖樣之外,研究團隊也推出 AprilTag 開源函式庫,裡面包含了偵測標籤、計算相對位置和方位等功能,函式庫本身輕巧且容易移植,甚至在手機的處理器上都可以即時運作。

取得 Apriltag 的圖形

官方已經將所有的標籤都放上 GitHub 儲存庫 apriltag-imgs,裡面包含一個轉換程式 tag_to_svg.py

安照官方指示取得需要的標籤 SVG 向量圖檔,接著用線上的轉換工具轉換成 PNG 圖檔,就可以拿去放到 Gazebo 中了。

製作 Apriltag 模型

在之後的模擬中,我會使用 Tag36h11 這個系列的標籤來製作定位標記模型。根據 Day 16 介紹過的製作模型的方法,我示範建立一個 apriltag_36h11_0_board 的模型(使用圖檔 tag36h11_0000.png),它會是一個貼上 Apriltag 標籤的薄版。

前往 models 目錄,新增模型資料夾 apriltag_36h11_0_board ,接著在裡面建立 model.configmodel.sdfmaterials/scripts/36h11_0.materialmaterials/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 的模型了。

在模擬環境布置 Apriltag

按照 Day 17 的做法將模型放到世界檔裡,之後就能讓無人機用來定位了。可以自己放置在喜歡的位置,我總之先做了六個 Tag36h11 系列的模型放在球場上。


下一篇會繼續介紹怎麼將 AprilTag 的偵測工具應用在影像上,然後進一步利用這些視覺標記上的資訊來引導無人機。


上一篇
【ROS 筆記:要怎麼叫無人機自己飛】Day 22:取得 Gazebo 裡的無人機鏡頭畫面
下一篇
【ROS 筆記:要怎麼叫無人機自己飛】Day 24:在 Gazebo 裡面用 AprilTag 為無人機導航(一)
系列文
ROS 筆記:要怎麼叫無人機自己飛25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言