ROS??TF坐標變換基本概念及使用案例
前言
TF(TransForm),就是坐標轉(zhuǎn)換,包括了位置和姿態(tài)兩個方面的變換,坐標變換是機器人學中的概念。
在機器人學中,無論一個機器人多么復雜,我們都可以將它的組成抽象成兩部分-連桿和關(guān)節(jié),最典型的機器人是串聯(lián)型機械臂,它的每條臂就是一個比較規(guī)整的關(guān)節(jié),中間連接的電機就是它的關(guān)節(jié),關(guān)節(jié)分為轉(zhuǎn)動關(guān)節(jié)和移動關(guān)節(jié),比如下圖中比較經(jīng)典的PUMA機械臂,可以抽象成很規(guī)整的連桿和關(guān)節(jié)的組成。
在將機器人抽象成關(guān)節(jié)之后,我們就可以使用DH法或改進DH法,為各個關(guān)節(jié)和連桿建立坐標系,而坐標變換就是用來描述我們建立的各個坐標系之間的關(guān)系,以方便人們表達機器人各個關(guān)節(jié)之間的位置關(guān)系。
一、ROS中的TF
雖然我們可以將機器人進行抽象和簡化,拋去它所有復雜的結(jié)構(gòu),將它抽象成一個個的坐標系,但是一個機器人可能有幾十上百個關(guān)節(jié),如下圖所示,如果我們要自己去計算任意兩個坐標系之間的變換關(guān)系,也是非常非常繁雜的。
于是ROS為我們提供了一個用來方便TF計算的工具-TF樹,TF樹用來維護ROS系統(tǒng)中的機器人以及周圍環(huán)境的所有TF變換關(guān)系,只要你的TF樹是連通的,你就可以提取任意兩個坐標系之間的坐標變換關(guān)系,掌控任何坐標系的位置,ROS中的TF樹考慮到存儲容量問題,只維護最近5秒的TF變換數(shù)據(jù)。
1.監(jiān)聽TF變換
監(jiān)聽TF變換就是獲取TF樹中的坐標變換關(guān)系,這是通過TF類中的TransformListener類實現(xiàn)的,下面以古月居的代碼為例進行說明。
通過這一頓操作,就可以將兩只海龜?shù)淖鴺俗儞Q讀取出來,存到我們創(chuàng)建的transform類中,方便我們進行其他操作。
2.廣播TF變換
廣播TF變換是用來更新TF樹的,有時我們控制了機器人進行了位置移動,那么ROS怎么知道它新的位置呢?這就需要通過TF廣播器,將最新的機器人位置發(fā)布到TF樹中,仍然以古月居的代碼進行說明。
我們傳入一個參數(shù)(烏龜節(jié)點名字),就可以發(fā)布這只烏龜相對于世界的坐標變換,當我們知道了兩只烏龜相對于世界的坐標變換,那么也可以根據(jù)公式推出他們之間的坐標變換,因為它們是連通的,兩只烏龜之間的坐標變換,只要烏龜1左乘烏龜2相對于世界變換矩陣的逆即可。
launch文件的編寫
然后就可以運行l(wèi)aunch文件,查看效果
roslaunch turtle_tf turtle_tf_demo.launch
二、TF常用組件
無論是使用烏龜,還是我們在仿真環(huán)境中創(chuàng)建了一個自己的機器人,ROS為我們提供了各種各樣的工具方便我們查看其中的TF變換,而不需要我們像上面的例子一樣,自己去編寫TF坐標變換的監(jiān)聽和廣播器,下面我以mbot小車為例,展現(xiàn)一下較為復雜的TF坐標變換關(guān)系和常用工具使用。
先打開一個gazebo仿真環(huán)境
1.tf_monitor
作用:將當前的坐標系轉(zhuǎn)換關(guān)系打印到終端控制臺
rosrun tf tf_monitor
這樣就可以在終端輸出任意兩個坐標系之間的坐標變換,當然也可以查看特定兩個坐標系之間的坐標變換,只需要給它傳入?yún)?shù)
rosrun tf tf_monitor base_link odom
2.tf_echo <source_frame> <target_frame>
作用:把特定的坐標系之間的平移旋轉(zhuǎn)關(guān)系,打印到終端控制臺
rosrun tf tf_echo base_link odom
3.view_frames
作用:輸出當前的tf關(guān)系以pdf的形式輸出到當前目錄下
rosrun tf view_frames
這個工具是非常方便且常用的
4.roswtf
作用:幫助你找到tf中的錯誤
roswtf
5.Rviz
當然你也可以通過最牛逼的可視化工具Rviz顯示所有的TF坐標變換,打開一個Rviz,選擇TF即可
6.robot_state_publisher
robot_state_publisher是機器人的狀態(tài)發(fā)布器,使用參數(shù) robots_description 指定的URDF和來自主題關(guān)節(jié)狀態(tài)的關(guān)節(jié)位置來計算機器人的正向運動學并通過tf發(fā)布結(jié)果。
它訂閱關(guān)節(jié)狀態(tài)發(fā)布器(joint_state_publisher)節(jié)點發(fā)布的關(guān)節(jié)狀態(tài)主題( sensor_msgs/JointState )將機器人各個關(guān)節(jié)的tf變換發(fā)布到tf樹上,這就不需要我們自己去編寫關(guān)節(jié)狀態(tài)更新的節(jié)點,而只需要在launch文件中,一并啟動這個ROS為我們提供的節(jié)點即可。
<!-- 運行robot_state_publisher節(jié)點,發(fā)布tf --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" > <param name="publish_frequency" type="double" value="50.0" /> </node>
它的參數(shù)如下:
參數(shù) | 意義 |
robot_description | urdf 機器人描述 |
tf_prefix | 為命名空間感知的轉(zhuǎn)換發(fā)布設置tf前綴 |
publish_frequency | 狀態(tài)發(fā)布器的發(fā)布頻率(默認:50) |
ignore_timestamp | 如果為真,則忽略 publish_frequency 和joint_states 的時間戳,并為每個接收到的joint_states 發(fā)布一個tf(默認:false) |
use_tf_static | 設置是否使用 /tf_static 鎖存的靜態(tài)變換廣播器(默認:true) |
三、SLAM中的TF
SLAM中的TF最重要的有兩部分:(1)機器人底盤坐標系(base_frame)與里程計坐標系(odom_frame)之間的變換關(guān)系 和 (2)里程計坐標系(odom_frame)與地圖坐標系(map_frame)之間的變換關(guān)系
(1)的變換關(guān)系主要是由機器人自帶的里程計(如:編碼器、IMU、laser)提供,采用的方法叫里程計位姿估計(Odometry),這一部分的主要作用是讓我們知道了機器人從初始位置(odom_frame)到現(xiàn)在位置(base_frame)的關(guān)系,但是這一部分是相對的,我們不知道環(huán)境信息時,沒法絕對的確定機器人位置,而且單純的使用里程計定位,會產(chǎn)生累計漂移誤差,這就需要使用某些方法確定機器人和環(huán)境之間的位置關(guān)系。
機器人和環(huán)境之間的坐標變換關(guān)系可以由很多方式給出,比如AMCL(自適應蒙特卡洛定位)專門用來機器人定位的算法、或者SLAM的方法(如激光雷達的算法gmapping),但是TF數(shù)的結(jié)構(gòu)決定了一個坐標系只能有一個父坐標系(一個人只能認一個爹),base到odom的坐標變換中,base已經(jīng)當做父坐標系了,因此這些定位方法往往給出里程計坐標系(odom_frame)與地圖坐標系(map_frame)之間的變換關(guān)系,即(2),這樣相當于間接給出了base與map之間的關(guān)系,也可以確定機器人的位置,如下圖所示
這樣也補償了里程計的漂移誤差
總結(jié)
本文介紹了TF坐標變換的基本概念以及TF在ROS中的表示形式(TF樹),通過古月居的烏龜跟隨的例子,分析了TF樹的廣播器和監(jiān)聽器最基本的書寫形式,從中展示了如何提取和應用TF變換的信息,并介紹了5種最常用的TF樹及TF信息的提取工具,最后簡要說明了SLAM中最為重要的兩種TF坐標變換。
到此這篇關(guān)于ROS TF坐標變換的文章就介紹到這了,更多相關(guān)ros tf坐標變換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode輸入npm?install報錯:node-sass@8.0.0?install:'node?
這篇文章主要給大家介紹了關(guān)于vscode輸入npm?install報錯:node-sass@8.0.0?install:'node?scripts/install.js'的解決方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-02-02matlab中乘法“*”和點乘“.*”;除法“/”和點除“./”的聯(lián)系和區(qū)別
這篇文章主要介紹了matlab中乘法“*”和點乘“.*”;除法“/”和點除“./”的聯(lián)系和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12微信小程序(微信應用號)開發(fā)工具0.9版安裝詳細教程
這篇文章主要介紹了微信小程序(微信應用號)開發(fā)工具0.9版安裝詳細教程的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09