ROS2 tf tutorial - Introduction to tf2

최준혁·2021년 7월 8일
0

ROS2_Basic

목록 보기
1/4

Introduction to tf2

먼저 tf란 무엇인지에 대해 간단히 알아보고 왜 tf2로 가야하는지 알아보자.

tf란?

ros에서 tf란 프레임을 추적할 수 있게 해주는 ros의 라이브러리입니다. 쉽게 예를 들어 보자면, 우리 로봇에게는 카메라와 baselink가 있다고 가정하죠. 둘의 관계를 어떻게 표현할까요? 일단 base_link를 기준으로 카메라의 위치가 (0, 0, 4)라고 한다면 베이스 링크의 중심부에서 4M정도 떨어져 있다고 말한다는 거죠. 여기서 이러하듯 tf라이브러리는 링크간의 좌표관계를 나타낼 수도 있고, 두 프레임간의 변환행렬을 얻을 수도 있습니다.
즉 프레임간의 관계를 알아낼 수 있는 라이브러리다!_ 라고 생각하면 될 것 같다.
navigation stack 에서는 world -> map -> odom -> base_footprint -> base_link -> ... 순으로 연결이 된다.


tf with urdf

tf는 urdf 파일로 부터 만들 수 있다. 즉 힘들게 tf broadcaster 를 이용하여 만들 필요가 없다는 뜻이다. 아래의 예시를 보자.

<?xml version="1.0" ?>
<robot name="hanwhabot_3465" xmlns:xacro="http://ros.org/wiki/xacro">
  <link name="base_footprint"/>

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0.0 0.0 0.010" rpy="0 0 0"/>
  </joint>

  <link name="base_link">
    <visual>
      <origin xyz="-0.032 0 0.0" rpy="0 0 0"/>
      <geometry>
        <!-- plz input right value -->
        <box size="0.680 0.465 0.30"/>
      </geometry>
      <material name="light_black"/>
    </visual>
  </link>

  <joint name="wheel_left_joint" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_left_link"/>
    <origin xyz="0.0 0.08 0.023" rpy="-1.57 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

 ~

</robot>

위와 같이 urdf 파일을 작성하고, tf를 불러올 수 있다. 이는 robot_state_publisher와 xacro.py파일을 이용하여 해결할 수 있다. 기본적인 형태는 다음과 같다.

<launch>

	<arg name="model" />

	<!-- Parsing xacro and setting robot_description parameter -->
	<param name="robot_description" command="$(find xacro)/xacro.py $(find hanwhabot_description)/urdf/hanwhabot_v1.urdf.xacro" />


	<!-- Starting robot state publish which will publish tf -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher">
          <param name="publish_frequency" type="double" value="50.0"/>
        </node>
</launch>

위와 같이 작성하면, 편하게 불러올 수 있다.


tf2란?

tf2는 위의 tf라이브러리의 두 번째 버전입니다. 다음과 같이 ros에선 묘사하고 있습니다.

tf2 is the second generation of the transform library, which lets the user keep track of multiple coordinate frames over time. tf2 maintains the relationship between coordinate frames in a tree structure buffered in time, and lets the user transform points, vectors, etc between any two coordinate frames at any desired point in time.

요약해보면, 예전의 tf에서 추가된 것이 시간개념인듯 합니다. 즉 5초전에는 두 프레임간의 상대적인 관계가 어떻게 되지? 라는 식의 말이 가능한거죠.

tf2 overview

1. Design


먼저 tf2라이브러리 관계입니다. cpp이 요구하는 라이브러리와 파이썬이 요구하는 라이브러리가 다르다는 것을 알 수 있습니다.

2. Supported Datatypes

템플릿 형태로 제공하며, 다른 데이터 형태간 전환을 할 수 있습니다. 데이터 타입을 지원하는 5가지 라이브러리입니다.

  • tf2_bullet: 3D Game Multiphysics library의 데이터 타입
  • tf2_eigen: 아이젠 벡터 다룸.
  • tf2_geometry_msgs: 이미 알고 있는 geometry_msgs를 다룸.
  • tf2_kdl: kdl( Kinetic and Dynamic Library ) -> 다양한 것이 가능
  • tf2_sensor_msgs: 센서 메시지 다룸.

3. Coordinate Frame Conventions

좌표축 간의 협력을 뜻함. 즉 그들간의 관계를 알 수 있다는 것.

  • Units, orientation conventions, chirality, rotation representations, and covariance representations
  • Standard names for mobile base coordinate frames
  • Standard coordinate frames for Humanoid Robots

4. Tools

tf2 & tf2_tools
tf2_tools: 현재 transform tree를 pdf graph로 보여줌.

$ rosrun tf2_tools view_frames.py
$ evince frames.pdf

5. Geometry

tf2는 기본적인 geometry 데이터 타입을 제공합니다.
Vector3, Matrix3X3, Quarternion, Transform

profile
3D Vision, VSLAM, Robotics, Deep_Learning

0개의 댓글