카테고리 없음

ROS2 - tf(transform frame)

code911 2025. 2. 12. 22:47

이 텍스트는 ROS2의 tf2(Transform Frame 2) 튜토리얼에 대한 설명입니다. 주요 내용을 분석해드리겠습니다:

  1. tf2 튜토리얼은 C++와 Python 두 가지 프로그래밍 언어로 제공됩니다.
  2. 튜토리얼은 두 가지 트랙으로 나뉘어 있습니다:
    • C++ 트랙
    • Python 트랙
  3. 학습 방법에 대한 조언:
    • 한 번에 하나의 트랙을 완료하는 것이 권장됩니다
    • C++와 Python 모두를 배우고 싶다면, 각각의 트랙을 따로 완료하는 것이 좋습니다
    • 즉, C++ 트랙을 한 번 완료하고, 그 다음 Python 트랙을 완료하는 식으로 진행하면 됩니다

tf2는 ROS2에서 매우 중요한 컴포넌트입니다. 이는 로봇의 다양한 부분들 간의 3D 변환(transformation)을 관리하는 시스템으로, 로봇의 각 부분의 위치와 방향을 추적하고 계산하는데 사용됩니다.

더 구체적인 내용이나 특정 부분에 대해 궁금하신 점이 있으시다면 말씀해 주세요.

이 텍스트는 ROS2의 tf2에서 static broadcaster를 작성하는 튜토리얼에 대한 설명입니다. 자세히 분석해드리겠습니다:

  1. 튜토리얼의 목표:
    • tf2에 정적 좌표 프레임을 브로드캐스트하는 방법을 배우는 것입니다
  2. 배경 설명:
    • 정적 변환(static transforms)을 발행하는 것은 로봇 베이스와 센서 또는 움직이지 않는 부품들 간의 관계를 정의하는 데 유용합니다
    • 예시: 레이저 스캐너의 중심부에 있는 프레임에서 레이저 스캔 측정값을 처리하는 것이 더 쉽습니다
  3. 튜토리얼 구조:
    • 두 부분으로 구성된 독립적인 튜토리얼입니다
    • 첫 번째 파트: tf2에 정적 변환을 발행하는 코드를 작성
    • 두 번째 파트: tf2_ros의 static_transform_publisher 명령줄 도구 사용법 설명
  4. 향후 진행:
    • 다음 두 튜토리얼에서는 tf2 소개 튜토리얼의 데모를 재현하는 코드를 작성할 예정입니다
    • 이후 튜토리얼들은 더 고급 tf2 기능으로 데모를 확장하는 것에 초점을 맞춥니다

static broadcaster는 로봇 시스템에서 매우 중요한 역할을 합니다. 특히 센서 데이터를 처리할 때, 센서의 위치와 방향을 정확히 알아야 데이터를 올바르게 해석할 수 있기 때문입니다.

이 텍스트는 ROS2 tf2 학습을 위한 패키지 생성 과정을 설명합니다. 단계별로 분석해드리겠습니다:

  1. 패키지 생성 목적:
    • 패키지 이름: learning_tf2_cpp
    • 이 패키지는 현재 튜토리얼과 이후 튜토리얼들에서 사용될 예정입니다
  2. 패키지 의존성:
    • geometry_msgs: 기하학적 메시지 타입들을 포함
    • rclcpp: ROS2 C++ 클라이언트 라이브러리
    • tf2: 기본 transform 라이브러리
    • tf2_ros: ROS2 특화 tf2 기능들
    • turtlesim: 거북이 시뮬레이터
  3. 패키지 생성 단계:
    • 새 터미널을 엽니다
    • ROS2 설치를 소스로 설정합니다 (ros2 명령어 사용을 위해)
    • 워크스페이스의 src 폴더로 이동합니다
    • 제공된 명령어를 실행해 패키지를 생성합니다
  4. 패키지 생성 명령어 분석:
    bash
    Copy
    ros2 pkg create --build-type ament_cmake # CMake 기반 빌드 시스템 사용 --license Apache-2.0 # Apache 2.0 라이센스 적용 --dependencies geometry_msgs rclcpp tf2 tf2_ros turtlesim # 필요한 의존성 패키지들 -- learning_tf2_cpp # 생성할 패키지 이름

명령어 실행 후에는 패키지가 생성되었다는 확인 메시지와 함께 필요한 모든 파일과 폴더가 생성됩니다.

이 코드는 static transform broadcaster를 구현한 C++ 코드입니다. 주요 부분들을 분석해드리겠습니다:

  1. 필요한 헤더 파일들:
cpp
Copy
#include "geometry_msgs/msg/transform_stamped.hpp" // 변환 메시지 타입 #include "rclcpp/rclcpp.hpp" // ROS2 C++ 라이브러리 #include "tf2/LinearMath/Quaternion.h" // 쿼터니온 계산용 #include "tf2_ros/static_transform_broadcaster.h" // static transform 브로드캐스터
  1. StaticFramePublisher 클래스:
cpp
Copy
class StaticFramePublisher : public rclcpp::Node { public: explicit StaticFramePublisher(char * transformation[]) : Node("static_turtle_tf2_broadcaster") { // StaticTransformBroadcaster 초기화 tf_static_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(this); // 시작시 한 번 static transform 발행 this->make_transforms(transformation); }
  1. transform 생성 함수:
cpp
Copy
void make_transforms(char * transformation[]) { geometry_msgs::msg::TransformStamped t; // 기본 정보 설정 t.header.stamp = this->get_clock()->now(); t.header.frame_id = "world"; // 부모 프레임 t.child_frame_id = transformation[1]; // 자식 프레임 // 위치 설정 (x, y, z) t.transform.translation.x = atof(transformation[2]); t.transform.translation.y = atof(transformation[3]); t.transform.translation.z = atof(transformation[4]); // 방향 설정 (roll, pitch, yaw를 쿼터니온으로 변환) tf2::Quaternion q; q.setRPY( atof(transformation[5]), atof(transformation[6]), atof(transformation[7]));
  1. main 함수의 주요 기능:
  • 명령줄 인자 검증 (8개의 인자가 필요)
  • 'world' 프레임 이름 중복 검사
  • 노드 초기화 및 실행

사용 방법:

bash
Copy
ros2 run learning_tf2_cpp static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw
  • child_frame_name: 자식 프레임의 이름
  • x, y, z: 위치 좌표
  • roll, pitch, yaw: 방향 각도

이 코드는 주어진 위치와 방향 정보를 사용하여 정적 transform을 발행하는 노드를 생성합니다. 이는 로봇의 고정된 부분들(예: 센서나 고정 부품) 간의 변환 관계를 정의하는 데 사용됩니다.