ROS tf-增長座標系

博客參考: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
相關文章
相關標籤/搜索