TF坐標(biāo)在ROS中是一個非常重要的概念,因為機(jī)器人在做日常操作任務(wù)的時候,對于其所在位置和朝向是需要時刻知道的,而機(jī)器人是由很多節(jié)點組成的協(xié)同任務(wù),對于每個部件,我們需要知道它的位姿(位置和朝向),這使得坐標(biāo)系就成為了一個很重要的問題。
TF的功能就是能夠換算出該點在其他坐標(biāo)系下的坐標(biāo)。比如,以機(jī)器人為例,定義兩個坐標(biāo)系,一個坐標(biāo)系以機(jī)器人移動平臺的中心為原點,稱為base_link參考系,另一個坐標(biāo)系以激光雷達(dá)的中心為原點,稱為base_laser參考系,當(dāng)然這個命名是需要唯一。利用TF坐標(biāo)轉(zhuǎn)換,將base_laser參考系與base_link參考系重合,這樣就可以準(zhǔn)確得知機(jī)器人自身位置,便于繼續(xù)進(jìn)行下一步的操作。
1、術(shù)語概述
那么在介紹坐標(biāo)系的時候,會經(jīng)??吹轿恢?、朝向,位姿等術(shù)語,先介紹下在三維世界中的幾個術(shù)語:
位置:是一個三維的向量(x,y,z),用于表示相對于原點沿著各個軸的方向分別移動了多遠(yuǎn)。
朝向:也是一個三維向量(roll,pitch,yaw),用于表示分別繞各個軸轉(zhuǎn)動了多少。
位姿:將位置和朝向放在一起,一對(位置,朝向)表示一個位姿。這種具有六維(三維位移,三維旋轉(zhuǎn))的位姿成為6D位姿。
給定兩者之間的位姿,我們可以變換兩個坐標(biāo)系下的數(shù)據(jù),這個變換通常是一些矩陣乘法。有的位姿是動態(tài)的,有的位置是固定的,比如說,固定在機(jī)器人身上的激光雷達(dá),就是相對固定的;而機(jī)械手的位姿就是不斷變化的,因為需要移動,旋轉(zhuǎn)等和做一些抓取動作。
為了管理這些坐標(biāo)系和變換,就設(shè)計了這個tf(Transform的縮寫)包來實現(xiàn),使用的是分布式的方式,用ROS話題來共享變換的數(shù)據(jù)。任何節(jié)點可以發(fā)布某些變換的當(dāng)前信息,并且任何節(jié)點都可以訂閱變換的數(shù)據(jù),從不同的發(fā)布源得到機(jī)器人各部件之間的所有變換關(guān)系。
2、tf坐標(biāo)系
對于一個強(qiáng)大系統(tǒng)來說,tf會比較的復(fù)雜,出錯的可能性較大,所以就出現(xiàn)很多關(guān)于tf相關(guān)的檢查和調(diào)試工具,幫助你理解正在發(fā)生的實情,我們接下來看下有哪些可視化的工具可供使用。
2.1、view_frames
我們先啟動海龜示例,對于前面安裝過的可以忽略,也可以使用 sudo apt install ros-melodic-turtle-tf 進(jìn)行安裝,對于ros的安裝,推薦大家可以看下前面介紹的一篇文章:Ubuntu18.04版本安裝ROS及出現(xiàn)錯誤的處理方法
啟動海龜
roslaunch turtle_tf turtle_tf_demo.launch
啟動鍵盤操作
rosrun turtlesim turtle_teleop_key
然后再開一個終端運行命令:rosrun tf view_frames
the rosdep view is empty: call 'sudo rosdep init' and 'rosdep update'
Listening to /tf for 5.0 seconds
Done Listening
dot - graphviz version 2.40.1 (20161225.0304)Detected dot version 2.40
frames.pdf generated
這里生成了一個坐標(biāo)系的pdf文件frames.pdf,在后面看到的frame也都表示為坐標(biāo)系的意思。
2.2、rqt_tf_tree
對于上面這個view_frames命令,運行后保存的是當(dāng)前坐標(biāo)系,不過這樣的保存是離線的,不能實時反映變化的坐標(biāo)關(guān)系。
我們換一個命令:rqt_tf_tree,可以顯示tf坐標(biāo)系的樹結(jié)構(gòu)
rosrun rqt_tf_tree rqt_tf_tree
運行上面命令將會彈出可視化界面,如下圖:
可以看到,顯示了錄制時間,兩個海龜對應(yīng)的廣播(發(fā)布)節(jié)點,平均速率、緩沖大小,最近和最舊的轉(zhuǎn)換時間,還可以高亮顯示,鼠標(biāo)放在節(jié)點上面,相關(guān)節(jié)點將顯示不同顏色。
我們可以操作海龜,然后點擊左上角的刷新,就會看到速率等都發(fā)生了變化,這樣看起來就比較直觀。如下圖:
TF建立的樹狀結(jié)構(gòu)的坐標(biāo)系,在整個坐標(biāo)系是沒有閉環(huán)的,也就是說每個坐標(biāo)系,只能有一個父坐標(biāo)系,但可以有多個子坐標(biāo)系。
2.3、tf_echo
命令格式:rosrun tf tf_echo <source_frame> <target_frame>?
顯示的信息是從source_frame到target_frame的旋轉(zhuǎn)平移變換。
查看兩只海龜參考系之間的關(guān)系
rosrun tf tf_echo turtle1 turtle2
At time 1652155224.053
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.893, 0.450]
? ? ? ? ? ? in RPY (radian) [0.000, -0.000, 2.208]
? ? ? ? ? ? in RPY (degree) [0.000, -0.000, 126.509]
At time 1652155225.061
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.893, 0.450]
? ? ? ? ? ? in RPY (radian) [0.000, -0.000, 2.208]
? ? ? ? ? ? in RPY (degree) [0.000, -0.000, 126.509]
At time 1652155226.053
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.893, 0.450]
? ? ? ? ? ? in RPY (radian) [0.000, -0.000, 2.208]
? ? ? ? ? ? in RPY (degree) [0.000, -0.000, 126.509]
2.4、static_transform_publisher
兩個坐標(biāo)系之間的靜態(tài)坐標(biāo)變換,這兩個坐標(biāo)系不發(fā)生相對位置變化。比如說,無人車上的激光雷達(dá)與IMU慣性測量模塊,這兩者基本是固定的,所以可以使用static_transform_publisher來發(fā)布這兩者的坐標(biāo)變換。
命令格式如下:
第一種命令格式:
static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
第二種命令格式:
static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
上面的兩種格式,需要設(shè)置坐標(biāo)的偏移和旋轉(zhuǎn)參數(shù)
偏移參數(shù):都使用相對于x y z三軸的坐標(biāo)位移。
旋轉(zhuǎn)參數(shù):其中第一種命令格式使用以弧度為單位的 yaw pitch roll 三個角度(yaw是圍繞x軸旋轉(zhuǎn)的偏航角,pitch是圍繞y軸旋轉(zhuǎn)的俯仰角,roll是圍繞z軸旋轉(zhuǎn)的翻滾角)
第二種命令格式使用四元數(shù)表達(dá)旋轉(zhuǎn)角度。
period_in_ms發(fā)布頻率以毫秒為單位,一般100ms也就是0.1秒比較合適。
在launch中使用方法示例如下:
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1 100" />
</launch>
2.5、roswtf
roswtf是一個插件,分析你當(dāng)前的tf配置并試圖找出常見問題。
比如輸入命令,本人當(dāng)前狀態(tài)顯示如下信息,有錯誤等情況都會高亮顯示:
the rosdep view is empty: call 'sudo rosdep init' and 'rosdep update'
No package or stack in the current directory
================================================================================
Static checks summary:Found 1 error(s).
ERROR ROS Dep database not updated: Please update rosdep database with 'rosdep update'.
================================================================================
Beginning tests of your ROS graph. These may take a while...
analyzing graph...
... done analyzing graph
running graph rules...
connection to [/tf_echo_1652154589994246734] timed out
... done running graph rulesOnline checks summary:
Found 1 warning(s).
Warnings are things that may be just fine, but are sometimes at faultWARNING The following node subscriptions are unconnected:
?* /tf_echo_1652154589994246734:
? ?* /tf_static
?* /turtle_pointer:
? ?* /tf_static
Found 2 error(s).ERROR Could not contact the following nodes:
?* /tf_echo_1652154589994246734ERROR Errors connecting to the following services:
?* service [/tf_echo_1652154589994246734/set_logger_level] appears to be malfunctioning: Unable to communicate with service [/tf_echo_1652154589994246734/set_logger_level], address [rosrpc://jetson-desktop:54551]
?* service [/tf_echo_1652154589994246734/get_loggers] appears to be malfunctioning: Unable to communicate with service [/tf_echo_1652154589994246734/get_loggers], address [rosrpc://jetson-desktop:54551]
3、tab鍵
tab鍵,能夠?qū)⒋a補(bǔ)全或顯示有關(guān)輸入命令的未完成命令,雙擊tab鍵可以提高效率和確保輸入的命令是無誤的。
比如輸入:rosrun rqt_? ?然后雙擊tab鍵,將自動出現(xiàn)關(guān)于rqt開頭的各種節(jié)點:
rqt_action ? ? ? ? ? rqt_logger_level ? ? rqt_robot_monitor
rqt_bag ? ? ? ? ? ? ?rqt_moveit ? ? ? ? ? rqt_robot_steering
rqt_bag_plugins ? ? ?rqt_msg ? ? ? ? ? ? ?rqt_runtime_monitor
rqt_console ? ? ? ? ?rqt_nav_view ? ? ? ? rqt_rviz
rqt_dep ? ? ? ? ? ? ?rqt_plot ? ? ? ? ? ? rqt_service_caller
rqt_graph ? ? ? ? ? ?rqt_pose_view ? ? ? ?rqt_shell
rqt_gui ? ? ? ? ? ? ?rqt_publisher ? ? ? ?rqt_srv
rqt_gui_cpp ? ? ? ? ?rqt_py_common ? ? ? ?rqt_tf_tree
rqt_gui_py ? ? ? ? ? rqt_py_console ? ? ? rqt_top
rqt_image_view ? ? ? rqt_reconfigure ? ? ?rqt_topic
rqt_launch ? ? ? ? ? rqt_robot_dashboard ?rqt_web
如果內(nèi)容顯示特別多,還會提示,比如我只輸入:rosrun然后雙擊tab鍵
Display all 229 possibilities? (y or n)
可以選擇是否繼續(xù)顯示。
如果輸入的命令接下來是確定性匹配,這個時候雙擊tab鍵將自動補(bǔ)全剩余的。
比如輸入:rosrun rqt_gu
雙擊tab鍵將會自動補(bǔ)全成rosrun rqt_gui,我們再次雙擊tab鍵,將列出rqt_gui開頭的所有匹配節(jié)點:
rqt_gui ? ? ?rqt_gui_cpp ?rqt_gui_py
4、可視化工具
4.1、rqt_graph
rqt_graph可以將計算圖可視化,輸入命令:rosrun rqt_graph rqt_graph
如果沒有啟動節(jié)點管理器而直接運行這條命令則會報錯:
Could not find ROS master,Either start a 'roscore' or abort loading the plugin.
所以我們在此之前,先啟動節(jié)點管理器,也是以海龜為示例,然后運行上面那條命令,如下圖:?
可以直觀的看到兩個海龜節(jié)點,里面有pose位姿,鍵盤操作等話題,然后位姿通過各自的廣播來發(fā)布信息,中間有一個就是我們這節(jié)重點講解的tf坐標(biāo)系的話題topic:/tf(具備訂閱和發(fā)布功能)來變換坐標(biāo),最后通過節(jié)點/turtle_pointer到/rosout輸出。
對于圖中有哪些節(jié)點,我們也可以通過命令來獲?。?span style="color:#be191c;">rosnode list
/rosout
/sim
/teleop
/teleop_turtle
/turtle1_tf_broadcaster
/turtle2_tf_broadcaster
/turtle_pointer
對于節(jié)點可以看做是網(wǎng)站中的各自端口對應(yīng)的應(yīng)用,所以我們也可以像ping網(wǎng)絡(luò)一樣的來查看:
rosnode ping /rosout
rosnode: node is [/rosout]
pinging /rosout with a timeout of 3.0s
xmlrpc reply from http://jetson-desktop:46881/?? ?time=1.574039ms
xmlrpc reply from http://jetson-desktop:46881/?? ?time=1.164913ms
...
rosnode ping /sim
rosnode: node is [/sim]
pinging /sim with a timeout of 3.0s
xmlrpc reply from http://jetson-desktop:36081/?? ?time=1.548052ms
xmlrpc reply from http://jetson-desktop:36081/?? ?time=1.078129ms
...
4.2、rqt_topic?
rqt_topic查看話題的一個插件,能夠知道各節(jié)點話題的具體實時變化情況,輸入命令:
rosrun rqt_topic rqt_topic
如下圖:
可以看到,每個話題的詳細(xì)信息,有Type消息類別、Bandwidth帶寬、Hz頻率、Value值。
我們點開/tf坐標(biāo)系查看下里面有哪些屬性,如下圖:
可以看到,指明了父坐標(biāo)和子坐標(biāo),當(dāng)然主要還是坐標(biāo)的轉(zhuǎn)換,其中時間戳有兩個,一個納秒和一個秒為單位的時間。?
?4.3、rqt_publisher
rqt_publisher用來發(fā)布具有固定或計算字段值的任意消息。輸入命令:
rosrun rqt_publisher rqt_publisher
將會彈出如下圖的界面:
topic話題和type消息數(shù)據(jù)類型,都可以點擊下拉框進(jìn)行選擇,頻率的輸入,然后點擊+號添加進(jìn)來。如下圖:?
然后就可以修改里面的expression字段對應(yīng)的值,手動進(jìn)行輸入調(diào)試。
4.4、rviz
rviz是ROS自帶的一個圖形化工具,可以方便的對ros的程序進(jìn)行圖形化操作。輸入命令:rviz
如下圖:
主要分5個功能區(qū),如圖中所標(biāo)識的。其中工具欄中的Set initial pose、Set target pose、Publish location point:一般在建圖導(dǎo)航時使用。
添加顯示操作如圖:
點擊左下角的Add按鈕,將會彈出一個界面,然后可以選擇“By display type”通過顯示類型來添加,不過需要自己修改對應(yīng)話題,坐標(biāo)系才可以顯示出來;或者就是選擇“By topic”通過話題的方式,直接添加就可以正常顯示。最后點擊右下角的OK按鈕即可文章來源:http://www.zghlxwxcb.cn/news/detail-664229.html
最后溫馨提示,在使用ROS核心工具和其他Linux命令的時候,常記得敲tab鍵,可以節(jié)省大量時間。文章來源地址http://www.zghlxwxcb.cn/news/detail-664229.html
到了這里,關(guān)于機(jī)器人TF坐標(biāo)系變換與一些可視化工具的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!