參考:一、如何使用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...