5.1 坐標(biāo)變換簡介
場景
機器人系統(tǒng)上,有多個傳感器,如激光雷達、攝像頭等,有的傳感器是可以感知機器人周邊的物體方位(以坐標(biāo)的方式表示物體與傳感器的橫向距離、縱向距離、垂直高度等信息)的,以協(xié)助機器人定位障礙物,那么可以直接將物體相對該傳感器的方位信息,等價于物體相對于機器人系統(tǒng)或機器人其它組件的方位信息嗎?顯然是不行的,這中間需要一個轉(zhuǎn)換過程。更具體描述如下:
場景1:現(xiàn)有一移動式機器人底盤,在底盤上安裝了一雷達,雷達相對于底盤的偏移量已知,現(xiàn)雷達檢測到一障礙物信息,獲取到坐標(biāo)分別為(x,y,z),該坐標(biāo)是以雷達為參考系的,如何將這個坐標(biāo)轉(zhuǎn)換成以小車為參考系的坐標(biāo)呢?


場景2:現(xiàn)有一帶機械臂的機器人(比如:PR2)需要夾取目標(biāo)物,當(dāng)前機器人頭部攝像頭可以探測到目標(biāo)物的坐標(biāo)(x,y,z),不過該坐標(biāo)是以攝像頭為參考系的,而實際操作目標(biāo)物的是機械臂的夾具,當(dāng)前我們需要將該坐標(biāo)轉(zhuǎn)換成相對于機械臂夾具的坐標(biāo),這個過程如何實現(xiàn)?

當(dāng)然,根據(jù)我們高中學(xué)習(xí)的知識,在明確了不同坐標(biāo)系之間的的相對關(guān)系,就可以實現(xiàn)任何坐標(biāo)點在不同坐標(biāo)系之間的轉(zhuǎn)換,但是該計算實現(xiàn)是較為常用的,且算法也有點復(fù)雜,因此在 ROS 中直接封裝了相關(guān)的模塊: 坐標(biāo)變換(tf)。
概念
tf(TransForm Frame)是指坐標(biāo)變換,它允許用戶隨時間跟蹤多個坐標(biāo)系。 它在時間緩沖的樹結(jié)構(gòu)中維護坐標(biāo)幀之間的關(guān)系,并讓用戶在任何所需的時間點在任意兩個坐標(biāo)幀之間變換點、向量等。在ROS中已經(jīng)提供了同名的庫實現(xiàn),并且隨著ROS的迭代,該庫升級為了tf2,也即第二代坐標(biāo)變換庫。本階段課程主要內(nèi)容也是以tf2為主。
完整的坐標(biāo)變換實現(xiàn)由坐標(biāo)變換廣播方和坐標(biāo)變換監(jiān)聽方兩部分組成。每個坐標(biāo)變換廣播方一般會發(fā)布一組坐標(biāo)系相對關(guān)系,而坐標(biāo)變換監(jiān)聽方則會將多組坐標(biāo)系相對關(guān)系融合為一棵坐標(biāo)樹(該坐標(biāo)樹有且僅有一個根坐標(biāo)系),并可以實現(xiàn)任意坐標(biāo)系之間或坐標(biāo)點與坐標(biāo)系的變換。
另外需要說明的是,ROS中的坐標(biāo)變換是基于右手坐標(biāo)系的。右手坐標(biāo)系的具體規(guī)則如下圖所示:將右手處于坐標(biāo)系原點,大拇指、食指與中指互成直角,食指指向的是x軸正方向,中指指向的是y軸正方向,大拇指指向的是z軸正方向。

作用
在ROS中用于實現(xiàn)不同坐標(biāo)系之間的點或向量的轉(zhuǎn)換。
5.1.1 案例安裝以及運行
關(guān)于坐標(biāo)變換的實現(xiàn)有一個經(jīng)典的“烏龜跟隨”案例,在學(xué)習(xí)坐標(biāo)變換的具體知識點之前,建議先安裝并運行此案例。
1.安裝
首先安裝“烏龜跟隨”案例的功能包以及依賴項。
安裝方式1(二進制方式安裝):

安裝方式2(克隆源碼并構(gòu)建):

此外,還需要安裝一個名為?transforms3d
?的 Python 包,它為?tf_transformations
包提供四元數(shù)和歐拉角變換功能,安裝命令如下:

2.執(zhí)行
啟動兩個終端,終端1輸入如下命令:

該命令會啟動 turtlesim_node 節(jié)點,turtlesim_node 節(jié)點中自帶一只小烏龜 turtle1,除此之外還會新生成一只烏龜 turtle2,turtle2 會運行至 turtle1 的位置。
終端2輸入如下命令:

該終端下可以通過鍵盤控制 turtle1 運動,并且 turtle2 會跟隨 turtle1 運動(參考引言部分的案例1)。

B站有完整的ros系列教程視頻,可以觀看完整內(nèi)容ros課程ROS2理論與實踐
更多內(nèi)容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質(zhì)內(nèi)容——詳情可關(guān)注猛獅集訓(xùn)營公眾號和猛獅集訓(xùn)營官方網(wǎng)站。