博客參考:https://www.ncnynl.com/archives/201702/1312.htmlhtml
ROS與C++入門教程-tf-增長座標系
說明:node
- 介紹如何爲TF增長額外固定的座標系
爲什麼增長座標系vim
- 對於許多任務,更容易在本地座標內思考。
- 例如,更容易推斷在激光掃描器中心的座標系中的激光掃描。
- tf容許您爲系統中的每一個傳感器,連接等定義一個本地座標系。
- 而且,tf將處理所引入的全部額外座標系的變換。
那裏增長座標系url
- tf創建座標系的樹結構; 它不容許在座標系結構中存在閉環。
- 這意味着一個座標系只有一個父系,但它能夠有多個子系。
- 目前咱們的tf樹包含三個座標系:world,turtle1和turtle2。 兩隻烏龜是世界的子系。
- 若是咱們要向tf添加一個新座標系,三個現有座標系中的一個須要是父系,新座標系將成爲子系。
- 圖示:
如何添加座標系spa
- 在咱們的烏龜例子中,咱們將添加一個新的座標系carrot1到turtle1。
- 新建文件frame_tf_broadcaster.cpp:
$ roscd learning_tf $ touch src/frame_tf_broadcaster.cpp $ vim src/frame_tf_broadcaster.cpp
- 代碼以下:
#include <ros/ros.h> #include <tf/transform_broadcaster.h> int main(int argc, char** argv){ ros::init(argc, argv, "my_tf_broadcaster"); ros::NodeHandle node; tf::TransformBroadcaster br; tf::Transform transform; ros::Rate rate(10.0); while (node.ok()){ transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) ); transform.setRotation( tf::Quaternion(0, 0, 0, 1) ); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1")); rate.sleep(); } return 0; };
- 代碼相似廣播變換
代碼解釋:.net
- 代碼:
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) ); transform.setRotation( tf::Quaternion(0, 0, 0, 1) ); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1")
- 解釋:咱們建立transform,從父系turtle1到子系carrot1,carrot1離左邊的turtle12米遠
編譯運行code
- 打開CMakeLists.txt
$ rosed learning_tf CMakeLists.txt
- 在底部增長代碼:
add_executable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp) target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES})
- 編譯:
$ cd ~/catkin_ws $ catkin_make
-
編譯順利,在bin目錄會生成frame_tf_broadcaster文件orm
-
編輯start_demo.launchhtm
$ rosed learning_tf start_demo.launch
- 增長新代碼:
<launch> ... <node pkg="learning_tf" type="frame_tf_broadcaster" name="broadcaster_frame" /> </launch>
- 運行:
$ roslaunch learning_tf start_demo.launch
檢查結果:blog
- 接着上個教程的,若是你驅動turtle1,你注意到,即便咱們添加了一個新的座標系,行爲沒有改變。 這是由於添加額外的座標系不會影響其餘座標系,咱們的監聽器仍然使用先前定義的座標系。 因此,讓咱們改變監聽器的行爲。
- 編輯src/turtle_tf_listener.cpp,在26-27行用/carrot1替換/turtle1,如:
listener.lookupTransform("/turtle2", "/carrot1", ros::Time(0), transform);
- 編譯運行:
$ catkin_make $ roslaunch learning_tf start_demo.launch
- 應該能夠看到,turtle2跟隨carrot1變化,而不是turtle1
廣播移動的座標系
- 咱們在本教程中發佈的額外座標系是一個固定的座標系,不隨時間改變相對於父系。 可是,若是要發佈移動座標系,您能夠更改廣播器以隨時間更改。 讓咱們修改/carrot1座標系以相對於/turtle1隨時間改變。
- 修改編輯src/turtle_tf_listener.cpp
$ vim src/frame_tf_broadcaster.cpp
- 代碼以下:
transform.setOrigin( tf::Vector3(2.0*sin(ros::Time::now().toSec()), 2.0*cos(ros::Time::now().toSec()), 0.0) ); transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
- 編譯運行:
$ catkin_make $ roslaunch learning_tf start_demo.launch