ROS學習之tf 3編寫乙個tf接收器(C )

2021-08-20 10:36:31 字數 3527 閱讀 8159

ros.tf3

編寫乙個

tf接收器(

c++)

宣告:本教程來自於ros.wiki,本人在整理過程中可能出現一些錯誤和問題,有問題可以去檢視官網版本也可以諮詢本人

在之前的教程中,我們建立了乙個

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 *      

atan2(transform.getorigin().y(),transform.getorigin().x());

vel_msg.linear.x= 0.5 *sqrt(pow(transform.getorigin().x(),2)+pow(transform.getorigin().y(),2));

在這裡,變換用於計算

turtle2

的新的線性和角速度,基於它與

turtle1

的距離和角度。新速度發布在主題「

turtle2/ cmd_vel」

中,sim

將使用它來更新

turtle2

的移動。

2.1執行偵聽器

現在我們建立了**,讓我們先編譯它。開啟

cmakelists.txt

檔案,並在底部新增以下行:

add_executable(turtle_tf_listener

src/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變換 向系統中廣播參考係之間的座標變換關係。系統中更能可能會存在多個...