ROS學習筆記 tf的學習與使用(一)

2021-08-08 10:51:28 字數 2748 閱讀 1427

ros機械人的開發過程中,經常需要用到tf座標變換。簡單來講,tf定義了兩個不同座標系之間的旋轉變換關係。

1. 乙個簡單的demo

$ roslaunch turtle_tf turtle_tf_demo.launch
這時候螢幕中會出現兩個turtle, 可以通過控制前面的turtle來引導後面的turtle

從上面我們可以清楚地看到三個座標系之間的關係。

我們還可以使用tf_echo來看兩個座標系之間是如何變換的

也可以通過rviz來檢視座標系的變換及移動情況。

2.寫乙個簡單的tf broadcaster程式

$ catkin_create_pkg learning_tf tf roscpp rospy turtlesim
$ catkin_make

$ source ./devel/setup.bash

$ roscd learning_tf
src/turtle_tf_broadcaster.cpp

16br

.sendtransform(tf

::stampedtransform

(transform

, ros

::time

::now

(),

"world",

turtle_name

));

這裡的後兩個引數即為父座標系和子座標系。

修改cmakelists.txt,在最後加上

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)

target_link_libraries(turtle_tf_broadcaster $)

$ catkin_make
新增

start_demo.launch

args="/turtle1" name="turtle1_tf_broadcaster" />

args="/turtle2" name="turtle2_tf_broadcaster" />

$ roslaunch learning_tf start_demo.launch
$ rosrun tf tf_echo /world /turtle1
$ rosrun turtlesim turtle_teleop_key
這時候移動turtle可以看到座標系的變化

3.寫乙個簡單的tf listener

$ roscd learning_tf
src/turtle_tf_listener.cpp

25

try

這個**段將座標係由turtle1變換成turtle2。

35

geometry_msgs::twist

vel_msg;

36vel_msg.angular.z = 4.0 * atan2(transform.getorigin().y(),

37transform.getorigin().x());

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

根據與turtle1的距離和角度差來計算turtle2的線速度和角速度。

編寫cmakelists.txt

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)

target_link_libraries(turtle_tf_listener $)

$ catkin_make
編寫launch 檔案,在原launch的後面新增

name="listener" />
啟動

$ roslaunch learning_tf start_demo.launch
同樣,通過啟動鍵盤控制前面的turtle1可以控制後面的turtle2

在這裡需要注意的是,有可能回出現如下錯誤

[error] [1505742896.803000722]: "turtle2" passed to lookuptransform argument target_frame does not exist. 

事實上,這並不是程式的錯誤,只是因為通訊的時延導致turtle2開始的時候無法找到turtle1,因此無法進行計算。

ROS學習之TF變換

tf能夠根據時間緩衝並維護多個參考係之間的座標變換,可以在任意時間,將點 向量 等資料的座標,完成座標變換。tf的使用方法 兩個概念了解一下 監聽tf變換 接收並快取系統中發布的所有參考係變換,並從中查詢所需要的參考係變換。廣播tf變換 向系統中廣播參考係之間的座標變換關係。系統中更能可能會存在多個...

ROS學習之tf基本用法

主要細節參見wiki,這裡我寫一下它的broadcaster和listener做個記錄 tf broadcaster.cpp include includeint main int argc,char ar 在broadcaster中我們主要描述的是兩個座標frame之間的位置關係,這裡是base ...

ROS學習之座標變換tf

即使前方荊棘滿地,也要跨上戰馬,一路前行!keep learning,keep programing ros中的座標變換主要形式為廣播和監聽,可以發布座標系a 座標系b與世界座標系的關係,可以監聽得到座標系a與座標系b之間的轉換關係,本文主要參考古月老師的教程,發布turtle1 turtle3與w...