iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Software Development

ROS進階學習筆記系列 第 23

Day 23 - ROS TF Frame

今天要講的是關於tf中的frame,其實frame這個東西不管哪個topic都用得到,只要有加上header都會有一個屬性是frame,並且可以在rviz上切換不同的frame進行圖層的切換,那麼frame到底怎麼解釋呢?
frame可以解釋為一個座標系統,像之前的小烏龜範例,/turtle1和/turtle2分屬兩個座標系統,而可以透過tf將兩個座標系投影在world frame上,也就是將本來在/turtle1和/turtle2的區域座標轉換成世界座標,讓兩者可以相互參照。
https://ithelp.ithome.com.tw/upload/images/20201007/20112348jvLYJvSL0I.png
tf可以用來定義不同的區域座標,以及不同區域座標之間的連結,以上圖為例,tf可以建立/turtle1和/world之間的連結,也可以建立/turtle1和/carrot1的,tf使用的是樹狀結構,這表示一個frame只會有一個parent,但可以有很多個children。
範例code:

#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;
};

其中最重要的部份:

    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"));

建立一個新的frame名稱carrot1,對應到turtle1距離2公尺的偏移量。

Reference

https://answers.ros.org/question/210572/what-is-a-frame/
http://wiki.ros.org/tf/Tutorials/Adding%20a%20frame%20%28C%2B%2B%29


上一篇
Day 22 - ROS TF broadcaster & listener
下一篇
Day24 - ROS TF Time
系列文
ROS進階學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言