ROS tf2 (C )學習筆記以及和tf對比

2021-10-25 05:58:52 字數 4171 閱讀 4840

參考:

一、如何使用tf2發布靜態廣播

靜態廣播在tf中沒有被單獨劃分出來,可以使用下面方法發布靜態tf:

"tf" type=

"static_transform_publisher" name=

"base_link_to_laser4"

args=

"0.0 -0.3 0.7 -1.57 0.0 0.0 /base_link /ydlidar_right_frame 40"

/>

同樣在tf2中也存在:

"tf2_ros" type=

"static_transform_publisher" name=

"link1_broadcaster"

args=

"1 0 0 0 0 0 1 link1_parent link1"

/>

以下展示了如何使用statictransformbroadcaster去發布靜態tf。

建立乙個learning_tf2功能包,這個功能包依賴tf2, tf2_ros, roscpp, rospy, turtlesim

$ catkin_create_pkg learning_tf2 tf2 tf2_ros roscpp rospy turtlesim
如何廣播變化

static tf2_ros::statictransformbroadcaster static_broadcaster;

geometry_msgs::transformstamped static_transformstamped;

static_transformstamped.header.stamp = ros::time::

now();

static_transformstamped.header.frame_id =

"world"

;static_transformstamped.child_frame_id = static_turtle_name;

/*... //設定引數

*///發布變化

static_broadcaster.

sendtransform

(static_transformstamped)

;

執行乙個靜態tf變化

$ rosrun learning_tf2 static_turtle_tf2_broadcaster mystaticturtle 0 0 1 0 0 0
二、如何使用tf2發布廣播

在tf2中,靜態廣播相當於固定了旋轉和平移,通過傳參設定,其他流程都一樣。

1.確定時間戳 2.父節點 3.孩子節點 4.平移 5.轉角 6.發布

// 靜態tf

static tf2_ros::statictransformbroadcaster static_broadcaster;

// 動態tf

static tf2_ros::transformbroadcaster br;

對比tf和tf2:

void

posecallback

(const turtlesim::poseconstptr& msg)

三、監聽tf變換

1.tf2

tf2_ros::buffer tfbuffer;

tf2_ros::transformlistener tflistener

(tfbuffer)

;geometry_msgs::transformstamped transformstamped;

transformstamped = tfbuffer.

lookuptransform

("turtle2"

,"turtle1"

, ros::

time(0

));

2.tf

tf::transformlistener listener;

tf::stampedtransform transform;

listener.

lookuptransform

("/turtle2"

,"/turtle1"

, ros::

time(0

), transform)

;

不過在tf的lookuptransform中,同樣呼叫了tf2::ros用於得到變換

geometry_msgs::transformstamped output = 

tf2_buffer_ptr_-

>

lookuptransform

(strip_leading_slash

(target_frame)

, target_time,

strip_leading_slash

(source_frame)

, source_time,

strip_leading_slash

(fixed_frame)

);

四、了解tf2和時間,在使用lookuptransform函式時,在tf2樹上可用

tf樹隨時間變化,並且tf2會為每個轉換儲存時間快照(預設情況下最長為10秒),到目前為止,我們一直使用lookuptransform()函式來訪問該tf2樹中的最新可用轉換,而無需知道該轉換的記錄時間。那麼如何在特定時間進行轉換?

transformstamped = tfbuffer.

lookuptransform

("turtle2"

,"turtle1"

, ros::

time(0

));

您還可以看到我們指定的時間等於0。對於tf2,時間0表示緩衝區中的「最新可用」轉換。 現在,更改此行以獲取當前時間now()的轉換:

transformstamped = tfbuffer.

lookuptransform

("turtle2"

,"turtle1"

, ros::time::

now())

;

此時會發生錯誤:

[error] 1253918454.307455000: extrapolation too far in the future: target_time is 1253918454.307, but the closest tf2  data is at 1253918454.300 which is 0.007 seconds away.extrapolation too far in the future: target_time is 1253918454.307, but the closest tf2 data is at 1253918454.301 which is 0.006 seconds away. see  for

more info. when trying to transform between /turtle1 and /turtle2. see

....

每個偵聽器都有乙個緩衝區,在其中儲存來自不同tf2廣播器的所有座標轉換。 當廣播發出轉換時,該轉換進入緩衝區要花費一些時間(通常為幾毫秒)。 因此,當在「現在」的時間請求幀轉換時,您應該等待幾毫秒,以便該資訊到達。

tf2提供了乙個不錯的工具,可以等到轉換可用為止。 通過將duration引數新增到lookuptransform()來使用它

transformstamped = tfbuffer.

lookuptransform

("turtle2"

,"turtle1"

, ros::time::

now(),

ros::

duration

(3.0))

;

《C和指標》學習筆記2

在c中,在幾乎所有使用陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列裡第乙個元素的位址。它的型別取決於陣列元素的型別。只有在兩種情況下,陣列名並不用指標常量來表示,就是當陣列名作為sizeof操作符或者單目操作符 的操作時。sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。取乙個陣...

C 學習筆記 2

ref 和out 都是是傳遞引用,out是返回值,兩者有一定的相同之處,不過也有不同點。使用ref 前必須對變數賦值,out不用。out的函式會清空變數,即使變數已經賦值也不行,退出函式時所有 out引用的變數都要賦值,ref引用的可以修改,也可以不修改。下面是使用 out和 ref進行陣列修改的例...

C 學習筆記(2)

定義 namespace a namespace a 系統會自動合併這兩個 使用時在前面加上using namespace a 或者a var來呼叫命名空間a中的變數和函式。wchar t雙位元組型變數,佔據2位元組,而char只佔據1位元組 wchar t wc l 中國 setlocale lc...