5.3 坐標變換廣播
??5.3 坐標變換廣播
坐標系相對關(guān)系主要有兩種:靜態(tài)坐標系相對關(guān)系與動態(tài)坐標系相對關(guān)系。
所謂靜態(tài)坐標系相對關(guān)系是指兩個坐標系之間的相對位置是固定不變的,比如:車輛上的雷達、攝像頭等組件一般是固定式的,那么雷達坐標系相對于車輛底盤坐標系或攝像頭坐標系相對于車輛底盤坐標系就是一種靜態(tài)關(guān)系。
所謂動態(tài)坐標系相對關(guān)系是指兩個坐標系之間的相對位置關(guān)系是動態(tài)改變的,比如:車輛上機械臂的關(guān)節(jié)或夾爪、多車編隊中不同車輛等都是可以運動的,那么機械臂的關(guān)節(jié)或夾爪坐標系相對車輛底盤坐標系或不同車輛坐標系的相對關(guān)系就是一種動態(tài)關(guān)系。
本節(jié)會主要介紹如何實現(xiàn)靜態(tài)坐標變換廣播與動態(tài)坐標變換廣播。另外,本節(jié)還會演示如何發(fā)布坐標點消息。5.3.1 坐標系廣播案例以及分析
1.案例需求
案例1:現(xiàn)有一無人車,在無人車底盤上裝有固定式的雷達與攝像頭,已知車輛底盤、雷達與攝像頭各對應一坐標系,各坐標系的原點取其幾何中心?,F(xiàn)又已知雷達坐標系相對于底盤坐標系的三維平移量分別為:x方向0.4米,y方向0米,z方向0.2米,無旋轉(zhuǎn)。攝像頭坐標系相對于底盤坐標系的三維平移量分別為:x方向-0.5米,y方向0米,z方向0.4米,無旋轉(zhuǎn)。請廣播雷達與底盤的坐標系相對關(guān)系,攝像頭與底盤的坐標系相對關(guān)系,并在 rviz2 中查看廣播的結(jié)果。

案例2:啟動 turtlesim_node,設(shè)該節(jié)點中窗體有一個世界坐標系(左下角為坐標系原點),烏龜是另一個坐標系,烏龜可以通過鍵盤控制運動,請動態(tài)發(fā)布烏龜坐標系與世界坐標系的相對關(guān)系。

2.案例分析
在上述案例中,案例1需要使用到靜態(tài)坐標變換,案例2則需要使用動態(tài)坐標變換,不論無論何種實現(xiàn)關(guān)注的要素都有兩個:
如何廣播坐標系相對關(guān)系;
如何使用 rviz2 顯示坐標系相對關(guān)系。
3.流程簡介
以編碼的實現(xiàn)實現(xiàn)靜態(tài)或動態(tài)坐標變換的流程類似,主要步驟如下:
編寫廣播實現(xiàn);
編輯配置文件;
編譯;
執(zhí)行;
在 rviz2 中查看坐標系關(guān)系。
案例我們會采用 C++ 和 Python 分別實現(xiàn),二者都遵循上述實現(xiàn)流程。
另外:需要說明的是,靜態(tài)廣播器除了可以以編碼的方式實現(xiàn)外,在 tf2 中還內(nèi)置了相關(guān)工具,可以無需編碼,直接執(zhí)行節(jié)點并傳入表示坐標系相對關(guān)系的參數(shù),即可實現(xiàn)靜態(tài)坐標系關(guān)系的發(fā)布。而動態(tài)廣播器沒有提供類似的工具。
4.準備工作
終端下進入工作空間的src目錄,調(diào)用如下兩條命令分別創(chuàng)建C++功能包和Python功能包。

5.3.2 靜態(tài)廣播器(命令)
1.靜態(tài)廣播器工具
在 tf2_ros功能包中提供了一個名為static_transform_publisher的可執(zhí)行文件,通過該文件可以直接廣播靜態(tài)坐標系關(guān)系,其使用語法如下。
格式1:
使用以米為單位的 x/y/z 偏移量和以弧度為單位的roll/pitch/yaw(可直譯為滾動/俯仰/偏航,分別指的是圍繞 x/y/z 軸的旋轉(zhuǎn))向 tf2 發(fā)布靜態(tài)坐標變換。
ros2 run tf2_ros static_transform_publisher --x x --y y --z z --yaw yaw --pitch pitch --roll roll --frame-id frame_id --child-frame-id child_frame_id
格式2:
使用以米為單位的 x/y/z 偏移量和 qx/qy/qz/qw 四元數(shù)向 tf2 發(fā)布靜態(tài)坐標變換。
ros2 run tf2_ros static_transform_publisher --x x --y y --z z --qx qx --qy qy --qz qz --qw qw --frame-id frame_id --child-frame-id child_frame_id
注意:在上述兩種格式中除了用于表示父級坐標系的--frame-id和用于表示子級坐標系的--child-frame-id之外,其他參數(shù)都是可選的,如果未指定特定選項,那么將直接使用默認值。
2.靜態(tài)廣播器工具使用
打開兩個終端,終端1輸入如下命令發(fā)布雷達(laser)相對于底盤(base_link)的靜態(tài)坐標變換:
ros2 run tf2_ros static_transform_publisher --x 0.4 --y 0 --z 0.2 --yaw 0 --roll 0 --pitch 0 --frame-id base_link --child-frame-id laser
終端2輸入如下命令發(fā)布攝像頭(camera)相對于底盤(base_link)的靜態(tài)坐標變換:
ros2 run tf2_ros static_transform_publisher --x -0.5 --y 0 --z 0.4 --yaw 0 --roll 0 --pitch 0 --frame-id base_link --child-frame-id camera
3.rviz2 查看坐標系關(guān)系
新建終端,通過命令rviz2打開 rviz2 并配置相關(guān)插件查看坐標變換消息:
將 Global Options 中的 Fixed Frame 設(shè)置為 base_link;
點擊 add 按鈕添加 TF 插件;
勾選 TF 插件中的 show names。
右側(cè) Grid 中將以圖形化的方式顯示坐標變換關(guān)系。

5.3.3 靜態(tài)廣播器(C++)
1.廣播實現(xiàn)
功能包 cpp03_tf_broadcaster 的 src 目錄下,新建 C++ 文件 demo01_static_tf_broadcaster.cpp,并編輯文件,輸入如下內(nèi)容:

2.編輯配置文件
1.package.xml
在創(chuàng)建功能包時,所依賴的功能包已經(jīng)自動配置了,配置內(nèi)容如下:

2.CMakeLists.txt
CMakeLists.txt 中發(fā)布和訂閱程序核心配置如下:

3.編譯
終端中進入當前工作空間,編譯功能包:
colcon build --packages-select cpp03_tf_broadcaster
4.執(zhí)行
當前工作空間下,啟動兩個終端,終端1輸入如下命令發(fā)布雷達(laser)相對于底盤(base_link)的靜態(tài)坐標變換:
. install/setup.bash ros2 run cpp03_tf_broadcaster demo01_static_tf_broadcaster 0.4 0 0.2 0 0 0 base_link laser
終端2輸入如下命令發(fā)布攝像頭(camera)相對于底盤(base_link)的靜態(tài)坐標變換:
. install/setup.bash ros2 run cpp03_tf_broadcaster demo01_static_tf_broadcaster -0.5 0 0.4 0 0 0 base_link camera
5.rviz2 查看坐標系關(guān)系
參考 5.3.2 靜態(tài)廣播器(命令)內(nèi)容啟動并配置 rviz2,最終執(zhí)行結(jié)果與案例1類似。5.3.4 靜態(tài)廣播器(Python)
1.廣播實現(xiàn)
功能包 py03_tf_broadcaster 的 py03_tf_broadcaster 目錄下,新建 Python 文件 demo01_static_tf_broadcaster_py.py,并編輯文件,輸入如下內(nèi)容:



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