ROS(Robot Operating System)에 대해 연재합니다.
Contents
(New Update Version. Original 2019-04-04)
이번 포스팅에서는 ROS tf, transformation의 개념을 이해하고, 이를 이용하여 robot의 pose를 broadcating, listening 하는 것에 대해 알아보겠습니다.
- tf
- transform data types
- tf broadcaster, tf listener, tf frame
- Time travel with tf
prev : ROS Step by Step
tf
각 coordinate frame 간의 관계, 임의의 time에서 두 coodinate frame간 점, 벡터 등 변환
A robotic system typically has many 3D coordinate frames that change over time, such as a world frame, base frame, gripper frame, head frame, etc. tf keeps track of all these frames over time, and allows you to ask questions like:
- 5초 전에 head frame이 world frame에 대해 어느 위치에 있는지
- gripper object의 Pose가 base와 어떤 관련이 있는지
Base data types (Quaternion, Vector, Point, Pose, Transform)
ROS geometry_msg 타입 중에서 transform data types
Type | tf | Raw Message Definition |
---|---|---|
Quaternion | tf::Quaternion | This represents an orientation in free space in quaternion form.float64 xfloat64 yfloat64 zfloat64 w |
Vector | tf::Vector3 | This represents a vector in free space. # It is only meant to represent a direction. Therefore, it does not# make sense to apply a translation to it (e.g., when applying a # generic rigid transformation to a Vector3, tf2 will only apply the# rotation). If you want your data to be translatable too, use the# geometry_msgs/Point message instead.float64 xfloat64 yfloat64 z |
Point | tf::Point | This contains the position of a point in free spacefloat64 xfloat64 yfloat64 z |
Pose | tf::Pose | A representation of pose in free space, composed of position and orientation. Point positionQuaternion orientation |
Transform | tf::Transform | This represents the transform between two coordinate frames in free space.Vector3 translaionQuaternion rotation |
Type | Description |
---|---|
Vector (벡터) | 방향과 크기를 가짐위치는 없음벡터와 벡터간 연산: 덧셈, 뺄셈, 외적 (결과는 벡터), 내적 (결과는 스칼라)벡터와 스칼라 연산 : 곱셈 (결과는 벡터) |
Position (위치) | 위치만 가짐위치와 위치간 연산: 뺄셈 (결과는 벡터)벡터와 위치 연산: 덧셈 (결과는 위치) |
Quaternion | 4개의 값으로 이루어진 확장된 복소수 체계를 이용해 3차원 회전을 표현행렬에 비해 연산 속도가 빠르고, 차지하는 메모리의 양도 적으며, 최단호(shortest arc) 보간으로 오류 발생률이 적다. |
Euler angle / 짐벌락 현상 개선
Quaternion
- http://blog.naver.com/PostView.nhn?blogId=ybill&logNo=120099101877
- https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
- https://namu.wiki/w/%EC%82%AC%EC%9B%90%EC%88%98
아래의 자료는 SLAM KR 스터디 Youtube와 발표자료를 참고하였습니다.
https://www.youtube.com/watch?v=TujSQ09jpWA&feature=youtu.be
(출처 문제 시 삭제하겠습니다.)
translation과 rotation을 포함한 Tranform matrix
$ sudo rosdep init
$ rosdep update
tf : tf broadcaster and tf listener
roslaunch learning_tf start_demo.launch
tf 라이브러리를 사용하여 3개의 좌표 프레임 : world frame, turtle1 frame, turtle2 frame을 만듭니다.
- tf broadcaster : to publish the turtle coordinate frames
- tf listener : to compute the difference in the turtle frames and move one turtle to follow the other.
rosrun tf view_frames
Transform Listener initing
Listening to /tf for 5.000000 seconds
Done Listening
dot - Graphviz version 2.16 (Fri Feb 8 12:52:03 UTC 2008)
Detected dot version 2.16
frames.pdf generated
evince frames.pdf
tf에 의해 broadcast 되는 3개의 프레임 : world, turtle1, turtle2
rosrun rqt_tf_tree rqt_tf_tree
rosrun tf tf_echo turtle1 turtel2
the transform of the turtle2 frame with respect to turtle1 frame
터틀1 프레임에 대한 터틀2 프레임의 transform : Translation and Rotation
At time 1416409795.450
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.914, 0.405]
in RPY [0.000, -0.000, 2.308]
At time 1416409796.441
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.914, 0.405]
in RPY [0.000, -0.000, 2.308]
tf broadcaster / tf listener / Adding a frame
How to get a transform at a specific time.
turtle1을 움직이고 난 후 5초 후에 turtle2가 움직인다.