ros.tf3宣告:本教程來自於ros.wiki,本人在整理過程中可能出現一些錯誤和問題,有問題可以去檢視官網版本也可以諮詢本人編寫乙個
tf接收器(
c++)
在之前的教程中,我們建立了乙個tf廣播公司向
tf發布乙隻烏龜的姿勢。
在本教程中,我們將建立乙個
tf接收器來開始使用tf。
1.1如何建立乙個
tf接收器
我們先建立原始檔。
$ roscd learning_tf
1.2啟動您的編輯器並將以下**貼上到名為src/ turtle_tf_listener.cpp
的新檔案中。
#include
#include
#include
#include
int main(int argc,char** argv)
catch(tf::transformexception &ex)
geometry_msgs::twist vel_msg;
vel_msg.angular.z = 4.0 *atan2(transform.getorigin().y(),transform.getorigin().x());
vel_msg.linear.x = 0.5 *sqrt(pow(transform.getorigin().x(),2)+pow(transform.getorigin().y(),2));
turtle_vel.publish(vel_msg);
rate.sleep();
}
return 0;
}
如果在執行時出現錯誤「lookup
would require extrapolation into the past」,則可以嘗試使用此替代**來呼叫偵聽器:
try catch(tf::transformexception ex)
1.3**解析
(1)#include
tf在這裡,我們建立乙個軟體包提供了乙個
transformlistener
的實現來幫助簡化接收轉換的任務。
要使用transformlistener
,我們需要包含
tf/ transform_listener.h
標頭檔案。(2
)tf::transformlistener listener;
transformlistener
物件。一旦建立了***,它就開始接收通過線路進行的
tf轉換,並緩衝它們長達
10秒。
transformlistener
物件的範圍應該保持不變,否則它的快取將無法填充,幾乎每個查詢都會失敗。一種常見的方法是使
transformlistener
物件成為類的成員變數。
(3)在這裡,真正的工作完成了,我們向偵聽器查詢特定的轉換。我們來看看這四個引數:try
我們希望從
frame/ turtle1
到frame/ turtle2
的轉換。
我們想要改變的時間。提供
ros ::time(0
)只會為我們提供最新的可用轉換。
我們儲存結果變換的物件。(4)
geometry_msgs::twist vel_msg;
vel_msg.angular.z = 4.0 *vel_msg.linear.x= 0.5 *sqrt(pow(transform.getorigin().x(),2)+pow(transform.getorigin().y(),2));atan2(transform.getorigin().y(),transform.getorigin().x());
在這裡,變換用於計算
turtle2
的新的線性和角速度,基於它與
turtle1
的距離和角度。新速度發布在主題「
turtle2/ cmd_vel」
中,sim
將使用它來更新
turtle2
的移動。
2.1執行偵聽器
現在我們建立了**,讓我們先編譯它。開啟
cmakelists.txt
檔案,並在底部新增以下行:
add_executable(turtle_tf_listenersrc/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener $)進入您的工作空間編譯
$ catkin_make
如果一切順利,你的
devel/ lib /learning_tf
資料夾中應該有乙個名為
turtle_tf_listener
的二進位制檔案。
如果是這樣,我們已經準備好新增這個演示的啟動檔案。在您的文字編輯器中,開啟名為
start_demo.launch
的啟動檔案,然後在
塊內合併下面的節點塊:
...首先,確保你停止了前一篇教程中的啟動檔案(使用
ctrl-c
)。現在您已準備好開始您的完整海龜演示:
$ roslaunch learning_tf start_demo.launch
要想看看事情是否有效,只需使用箭頭鍵在第一只烏龜周圍駕駛(確保您的終端視窗處於活動狀態,而不是您的模擬器視窗),並且您會在第一只烏龜之後看到第一只烏龜!當turtlesim
啟動時,您可能會看到:
[error]
1253915565.300572000: frame id /turtle2 does not exist! when trying
to transform between /turtle1 and /turtle2.
[error]1253915565.401172000: frame id /turtle2 does not exist! when trying
to transform between /turtle1 and /turtle2.
發生這種情況是因為我們的聽眾在收到關於龜
2的訊息之前正在計算變換,因為它需要一點時間才能在
turtlesim
中產卵並開始廣播乙個
tf幀。
現在您已準備好轉到下乙個教程,您將在其中學習如何新增框架(
c++)
ROS學習之tf 2 編寫乙個TF廣播器(C )
ros.tf2.編寫乙個 tf廣播器 c 宣告 本教程來自於ros.wiki,本人在整理過程中可能出現一些錯誤和問題,有問題可以去檢視官網版本也可以諮詢本人 1.1在接下來的兩篇教程中,我們將編寫 來重現 tf入門教程中的演示。之後,以下教程將重點介紹使用更高階的 tf功能擴充套件演示。在我們開始之...
編寫乙個tf廣播
1 include 2 include 專用標頭檔案 3 include 4 5 std string turtle name 6 7 8 9 void posecallback const turtlesim poseconstptr msg 18 這是真正的工作完成的地方。用transformb...
ROS學習之TF變換
tf能夠根據時間緩衝並維護多個參考係之間的座標變換,可以在任意時間,將點 向量 等資料的座標,完成座標變換。tf的使用方法 兩個概念了解一下 監聽tf變換 接收並快取系統中發布的所有參考係變換,並從中查詢所需要的參考係變換。廣播tf變換 向系統中廣播參考係之間的座標變換關係。系統中更能可能會存在多個...