Booil Jung

ROS2 Humble의 Tf2

로보틱스 시스템의 본질은 물리적 세계와의 상호작용에 있다. 로봇이 주변 환경을 인식하고, 목표를 설정하며, 정밀한 작업을 수행하기 위해서는 ‘공간’에 대한 일관되고 정확한 이해가 전제되어야 한다. 로봇에 부착된 수많은 센서로부터 들어오는 데이터, 모터를 움직이는 액추에이터 명령, 그리고 복잡한 경로를 계획하는 알고리즘에 이르기까지, 모든 정보는 결국 “어디에 있는가?”라는 근본적인 질문으로 귀결된다. 이 질문에 답하지 못하는 로봇은 그저 움직이는 기계 덩어리에 불과하다.

tf2는 바로 이 근본적인 질문에 답하기 위한 ROS 2의 표준 라이브러리이자 핵심 인프라다.1

tf2를 단순히 좌표를 변환하는 유틸리티로 생각해서는 안 된다. tf2는 분산된 노드들이 각자의 시점에서 독립적으로 생성하는 시변(time-varying) 좌표계들의 관계를 실시간으로, 그리고 안정적으로 관리하는 정교한 시스템이다.3 로봇의 몸체(base_link), 바퀴, 로봇 팔의 각 관절, 카메라, 라이다 등 수많은 구성 요소들은 각자 고유의 좌표 프레임(coordinate frame)을 가지며, 이들의 상대적인 위치와 방향(pose)은 끊임없이 변한다. tf2는 이 복잡한 관계망을 하나의 일관된 ‘트리(tree)’ 구조로 유지하고, 어떤 프레임에서든 다른 프레임으로 데이터를 변환할 수 있는 강력한 기능을 제공한다.

이 보고서는 ROS 2 Humble Hawksbill 버전을 기준으로, tf2의 가장 기본적인 개념부터 시작하여 내부 동작 메커니즘, 실전 프로그래밍, 고급 디버깅 전략, 그리고 시스템 성능 최적화에 이르기까지 모든 것을 심층적으로 파헤치는 것을 목표로 한다. 표면적인 사용법을 넘어 tf2가 왜 그렇게 설계되었는지, 그리고 그 설계가 실제 로보틱스 애플리케이션에 어떤 의미를 갖는지에 대한 깊이 있는 분석을 제공할 것이다.

tf2를 효과적으로 사용하기 위해서는 먼저 그 기반을 이루는 몇 가지 핵심 개념을 명확하게 이해해야 한다. 이 개념들은 tf2 시스템 전체의 동작 방식을 규정하는 규칙과도 같다.

로봇 시스템의 모든 물리적, 논리적 구성 요소는 자신만의 3차원 좌표 프레임(frame)을 가질 수 있다. 예를 들어, 로봇의 몸체 중심은 base_link 프레임, 왼쪽 바퀴의 중심은 left_wheel_link 프레임, 카메라 렌즈의 광학 중심은 camera_optical_frame을 가질 수 있다. tf2는 이러한 무수히 많은 프레임들 간의 상대적인 기하학적 관계, 즉 변환(transform) 정보를 관리한다.2

이러한 변환 관계들의 집합은 ‘TF 트리’라고 불리는 자료구조를 형성한다.3 TF 트리는 몇 가지 중요한 규칙을 따른다.

ROS 생태계에서는 일반적으로 통용되는 몇 가지 표준 프레임 이름이 있다. 이를 따르는 것은 다른 ROS 패키지와의 호환성을 위해 매우 중요하다.2

tf2는 프레임 간의 변환을 두 가지 종류로 구분하여 처리하는데, 이는 시스템 성능에 지대한 영향을 미치는 중요한 설계 특징이다.

tf2는 이 두 가지 변환을 서로 다른 ROS 토픽을 통해 처리한다.

tf2 시스템은 정보를 생성하는 ‘브로드캐스터’와 정보를 소비하는 ‘리스너’라는 두 가지 주요 역할로 구성된다.

tf2는 분산 시스템으로 설계되었기 때문에, 시스템 내의 모든 노드가 독립적으로 리스너가 되어 TF 정보를 얻을 수 있다.4 또는, 리소스가 제한적인 노드를 위해 중앙 집중식 TF 서버(buffer_server)를 두고, 다른 노드들이 액션(action) 통신을 통해 원격으로 변환 정보를 쿼리하는 것도 가능하다.11

개발 및 디버깅 과정에서 tf2 시스템의 상태를 빠르고 직관적으로 파악하기 위한 몇 가지 필수적인 명령줄 인터페이스(CLI) 도구가 제공된다.

표 1: 주요 tf2 CLI 도구와 기능

명령어 패키지 설명
tf2_echo tf2_ros 지정된 두 프레임 간의 최신 변환 정보를 터미널에 지속적으로 출력한다. 특정 변환이 제대로 발행되고 있는지 확인하는 가장 기본적인 방법이다.15
view_frames tf2_tools 현재 ROS 네트워크에서 발행되고 있는 모든 TF 정보를 수집하여 전체 TF 트리의 구조를 PDF 파일로 생성해준다. 트리가 끊어졌는지(bifurcated) 등을 시각적으로 확인하는 데 필수적이다.15
tf2_monitor tf2_ros 모든 TF 체인에 대해 발행 주기(rate), 지연 시간(delay) 등 상세한 통계 정보를 실시간으로 모니터링한다. 시간 관련 문제를 디버깅할 때 매우 유용하다.15
static_transform_publisher tf2_ros 터미널에서 직접 정적 변환을 발행할 수 있게 해준다. 간단한 테스트나 임시 프레임을 설정할 때 편리하다.5

tf2의 개념을 이해했다면, 이제 실제 코드에서 어떻게 활용되는지 살펴볼 차례다. C++과 Python에서 정적/동적 변환을 발행하고 조회하는 핵심 패턴을 분석한다.

정적 변환은 주로 로봇의 고정된 부품 간의 관계를 정의하는 데 사용된다.

실제 복잡한 로봇 애플리케이션에서는 개별 노드나 CLI로 정적 변환을 발행하는 경우는 드물다. 대부분의 정적 변환, 즉 로봇의 물리적 구조에 의해 결정되는 변환들은 URDF(Unified Robot Description Format) 파일에 ‘fixed’ 타입의 관절로 정의된다. 그리고 robot_state_publisher라는 특수한 노드가 이 URDF 파일을 읽고, 정의된 모든 고정 관절 정보를 /tf_static 토픽으로 자동으로 발행해준다.20 이 방식은 로봇의 기하학적 모델과 TF 발행을 하나의 파일(URDF)로 일원화하여 관리하므로, 유지보수성이 뛰어나고 오류 발생 가능성을 줄인다. 따라서 개발자가 StaticTransformBroadcaster를 직접 코딩하는 경우는, URDF에 정의되지 않은 가상의 프레임(예: 외부 카메라 보정 후 결정된 마커의 위치)을 발행하는 등 비교적 제한적인 상황이다.

로봇의 움직임과 같이 시간에 따라 변하는 관계는 동적 변환으로 발행해야 한다.

여기서 매우 중요한 점은 TransformStamped 메시지의 header.stamp 필드다. 이 타임스탬프는 단순히 메시지를 발행하는 현재 시간을 기록하는 것이 아니다. 이 값은 “이 변환 정보가 유효한 시점”을 명시하는, tf2의 시간 기반 시스템에서 가장 핵심적인 정보다.2 만약 브로드캐스터가 이 타임스탬프를 부정확하게 설정하면(예: 항상 0으로 설정하거나, 실제 데이터가 측정된 시점과 큰 차이가 나는 시간을 설정하면), 리스너는 올바른 시간 보간을 수행할 수 없게 된다. 이는 결국

ExtrapolationException을 발생시키거나, 심지어 예외 없이 부정확한 변환 값을 반환하여 시스템 전체에 치명적인 오류를 유발할 수 있다. 따라서 header.stamp는 해당 변환 정보가 측정되거나 계산된 ‘실제 시간’을 최대한 정확하게 반영해야 한다. 시뮬레이션 환경에서는 use_sim_time 파라미터를 true로 설정하고, /clock 토픽에서 제공하는 시뮬레이션 시간을 사용해야 시간 동기화 문제를 피할 수 있다.25

발행된 변환 정보는 리스너 노드에서 조회하여 활용한다.

조회된 TransformStamped 메시지는 그 자체로도 유용하지만, 보통은 다른 종류의 데이터(예: 센서가 측정한 3D 포인트, 로봇 팔의 목표 자세 등)를 다른 좌표계로 변환하는 데 사용된다. tf2_geometry_msgs와 같은 헬퍼 패키지는 geometry_msgs에 정의된 다양한 타입(예: PointStamped, PoseStamped, Vector3Stamped)을 쉽게 변환할 수 있는 함수들을 제공하여 이 과정을 단순화해준다.27

tf2를 진정으로 마스터하기 위해서는 API 사용법을 넘어 그 내부에서 데이터가 어떻게 저장, 관리, 계산되는지 이해해야 한다. 이는 특히 복잡한 디버깅 상황에서 문제의 근본 원인을 파악하는 데 결정적인 역할을 한다.

tf2의 아키텍처에서 가장 주목할 만한 점은 핵심 로직과 ROS 의존성 부분의 분리다.

리스너가 특정 시점 T에 대한 변환을 요청했을 때, 버퍼에 정확히 T 시점의 데이터가 존재할 확률은 거의 없다. tf2의 강력함은 바로 이럴 때 발휘된다. tf2는 버퍼에 저장된 이산적인(discrete) 시간의 데이터들을 사용하여 요청된 시점의 변환을 ‘보간(interpolate)’하여 추정한다.7

이 보간 메커니즘은 tf2가 서로 다른 주기와 지연을 갖는 비동기적인 데이터 소스들을 통합하여 일관된 시공간적 정보를 제공할 수 있게 하는 핵심 기술이다. 하지만 이 강력한 기능에는 암묵적인 가정이 내포되어 있다. 바로 ‘로봇의 움직임은 두 데이터 포인트 사이에서 부드럽고 연속적일 것’이라는 가정이다. 만약 로봇의 움직임에 비해 TF 발행 주기가 너무 낮다면(예: 빠르게 회전하는 로봇의 TF를 1 Hz로 발행), 보간으로 추정된 중간 시점의 자세는 실제 로봇의 자세와 큰 오차를 보일 수 있다.32 따라서 개발자는 시스템의 최대 동역학(최대 속도, 최대 각속도)을 고려하여 충분히 높은 주기로 TF를 발행해야 보간된 데이터의 정확성을 보장할 수 있다.

tf2를 사용하다 보면 가장 흔하게 마주치는 예외가 바로 ExtrapolationException이다. 이 예외는 tf2의 버그가 아니라, 분산 비동기 시스템의 본질적인 특성을 드러내는 중요한 신호다.

복잡한 로봇 시스템에서 tf2 관련 문제는 필연적으로 발생한다. tf2가 제공하는 강력한 디버깅 및 시각화 도구를 활용하면 문제의 원인을 체계적으로 추적할 수 있다.

터미널에서 직접 실행할 수 있는 CLI 도구들은 tf2 상태를 빠르게 진단하는 데 매우 효과적이다.

RViz2는 tf2 정보를 3D 공간에서 직관적으로 시각화하여 디버깅하는 데 없어서는 안 될 도구다.

tf2 관련 오류는 복잡해 보이지만, 근본 원인은 대개 몇 가지로 좁혀진다. 따라서 체계적인 접근법을 따르면 효율적으로 문제를 해결할 수 있다. tf2 디버깅은 크게 ‘연결성(Connectivity)’과 ‘시간(Time)’이라는 두 가지 축을 중심으로 이루어진다.

  1. 연결성 문제 진단 (Is the path valid?): “요청한 프레임 간의 경로가 TF 트리에 물리적으로 존재하는가?”
    • 증상: tf2::LookupException, tf2::ConnectivityException.
    • 진단 도구: ros2 run tf2_tools view_frames를 실행하여 전체 트리를 확인한다. 요청한 프레임들이 보이는가? 트리가 끊어진 부분은 없는가? 프레임 이름에 오타는 없는가?
    • 추가 진단: ros2 run tf2_ros tf2_echo <parent_frame> <child_frame>을 사용하여 문제가 의심되는 특정 링크의 변환이 실제로 발행되고 있는지 확인한다.
  2. 시간 문제 진단 (Is the data available at the requested time?): “경로는 존재하지만, 요청한 특정 시간에 유효한 데이터가 없는가?”
    • 증상: tf2::ExtrapolationException.
    • 진단 도구: ros2 run tf2_ros tf2_monitor <frame1> <frame2>를 실행하여 문제가 되는 변환 체인의 발행 주기(rate)와 지연(delay)을 확인한다. 발행 주기가 너무 낮거나 지연이 크지 않은가?
    • 코드 확인: 브로드캐스터 노드에서 header.stamp를 올바르게 설정하고 있는지 확인한다. 리스너 노드에서 lookupTransform을 호출할 때 어떤 시간을 요청하는지 확인한다.
    • 해결 시도: 리스너의 lookupTransform에 적절한 timeout을 추가하거나, tf2::TimePointZero를 사용하여 가장 최신 변환을 요청하도록 수정해본다.15

이 두 가지 축을 기준으로 체계적으로 접근하면, 대부분의 tf2 오류를 논리적으로 분석하고 근본 원인을 찾아낼 수 있다.

tf2는 ROS1 시절의 tf를 계승하고 발전시킨 라이브러리다. ROS1 경험이 있는 개발자라면 tftf2의 차이점을 이해하는 것이 중요하며, 복잡한 시스템에서는 성능 최적화 기법을 아는 것이 필수적이다.

ROS Hydro 배포판 이후로 tf는 공식적으로 tf2에 의해 대체되었다. tf2tf의 모든 기능을 포함하면서 여러 중요한 개선 사항을 도입했다.11

표 2: ROS1 tf vs ROS2 tf2 핵심 비교

기능 ROS1 tf ROS2 tf2 근거 / 영향
정적 변환 모든 변환을 /tf 토픽으로 발행 /tf (동적)와 /tf_static (정적) 토픽으로 분리 11 불필요한 데이터 전송을 제거하여 네트워크 및 CPU 부하를 크게 감소시키는 핵심적인 성능 최적화.11
코어 의존성 ROS 시스템과 강하게 결합됨 ROS에 독립적인 tf2::BufferCore 라이브러리 분리 11 코어 로직의 재사용성과 테스트 용이성이 비약적으로 향상됨.11
API 고정된 데이터 타입만 지원하는 비-템플릿 API tf2::convert를 사용하는 템플릿 기반 API 11 Eigen, KDL 등 다양한 외부 수학 라이브러리의 데이터 타입을 플러그인 형태로 쉽게 통합하고 변환할 수 있음.
Python 지원 C++ 래퍼(wrapper)를 통해 지원, 일부 불안정성 존재 순수 Python으로 통신 부분을 재작성하여 1급 시민(First-class)으로 지원 11 Python으로 작성된 tf2 노드의 안정성과 성능이 크게 향상됨.
원격 쿼리 모든 노드가 자체적으로 리스너와 버퍼를 가져야 함 액션(Action) 기반의 원격 쿼리(buffer_server) 지원 11 리소스가 제한적인 임베디드 노드는 TF 버퍼를 직접 유지할 필요 없이 중앙 서버에 변환을 요청할 수 있음.
tf_prefix 지원했으나, 사용법이 혼란스럽고 비권장됨 공식적으로 지원 중단 11 다중 로봇 시나리오에서 프레임 이름 충돌 문제를 ROS2의 네임스페이스를 통해 더 명확하게 해결하도록 유도.

수십, 수백 개의 프레임이 존재하는 복잡한 로봇 시스템에서는 tf2의 성능이 전체 시스템의 성능에 영향을 미칠 수 있다. 다음은 tf2 관련 성능을 최적화하기 위한 몇 가지 전략이다.

tf2의 코어 로직은 이미 매우 효율적으로 작성되어 있으므로 8, 성능 병목은 tf2 자체보다는 tf2로 들어오거나 tf2에서 나가는 데이터의 전송 및 처리 과정에서 발생하는 경우가 많다. 따라서 시스템 전체의 관점에서 데이터 흐름을 최적화하는 것이 중요하다.

견고하고 유지보수하기 쉬운 tf2 코드를 작성하기 위해 다음의 모범 사례를 따르는 것이 좋다.


이 보고서를 통해 살펴본 바와 같이, tf2는 단순히 좌표를 변환하는 도구를 넘어, 로봇이 ‘자신’과 ‘세상’을 시공간적으로 이해하기 위한 핵심 데이터베이스이자 인프라다. 그 내부에는 분산 시스템, 시간 동기화, 데이터 보간 등 정교하고 복잡한 개념들이 녹아있다.

따라서 ROS2에서 tf2를 마스터한다는 것은 C++이나 Python API의 사용법을 익히는 것을 넘어, 분산 비동기 환경에서 발생하는 시간, 데이터 동기화, 그리고 네트워크 지연의 문제를 이해하고 이에 대처하는 능력을 갖추는 것을 의미한다. ExtrapolationException을 버그로 여기는 대신, 시스템의 상태를 알려주는 유용한 신호로 받아들이고, timeouttry-catch로 이를 우아하게 처리하는 것이 바로 전문가의 접근 방식이다.

이 보고서에서 다룬 핵심 개념, 내부 동작 원리, 체계적인 디버깅 전략, 그리고 성능 최적화 기법들을 바탕으로, 개발자들은 더욱 복잡하고 견고하며 신뢰성 있는 로봇 시스템을 구축하는 데 자신감을 가질 수 있을 것이다. tf2의 원리를 깊이 이해하는 것은 결국 더 나은 로봇을 만드는 길로 이어진다.

  1. ROS 2 Documentation: Humble documentation, accessed July 26, 2025, https://docs.ros.org/en/humble/index.html
  2. Tf2 - ROS 2 Documentation: Iron documentation, accessed July 26, 2025, https://docs.ros.org/en/iron/Concepts/Intermediate/About-Tf2.html
  3. Tf2 - ROS 2 Documentation: Rolling documentation, accessed July 26, 2025, https://docs.ros.org/en/rolling/Concepts/Intermediate/About-Tf2.html
  4. Tf2 - ROS 2 Documentation: Humble documentation, accessed July 26, 2025, https://docs.ros.org/en/humble/Concepts/Intermediate/About-Tf2.html
  5. Transformation Husarion, accessed July 26, 2025, https://husarion.com/tutorials/ros2-tutorials/7-transformation/
  6. About tf2 - ROS 2 Documentation: Foxy documentation, accessed July 26, 2025, https://docs.ros.org/en/foxy/Concepts/About-Tf2.html
  7. tf2/CommonQuestions - ROS Wiki, accessed July 26, 2025, http://wiki.ros.org/tf2/CommonQuestions
  8. tf2/Design - ROS Wiki, accessed July 26, 2025, http://wiki.ros.org/tf2/Design
  9. tf2 - Steven Gong, accessed July 26, 2025, https://stevengong.co/notes/tf2
  10. TF2 - The second generation of the transform library - ROS 2 workshop documentation, accessed July 26, 2025, https://ros2-industrial-workshop.readthedocs.io/en/latest/_source/navigation/ROS2-TF2.html
  11. tf2/Migration - ROS Wiki, accessed July 26, 2025, http://wiki.ros.org/tf2/Migration
  12. What is the time complexity tf2 core library - Robotics Stack Exchange, accessed July 26, 2025, https://robotics.stackexchange.com/questions/79226/what-is-the-time-complexity-tf2-core-library
  13. Writing a listener (Python) - ROS 2 Documentation, accessed July 26, 2025, https://docs.ros.org/en/foxy/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Listener-Py.html
  14. Writing a listener (C++) - ROS 2 Documentation: Humble …, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Listener-Cpp.html
  15. Debugging - ROS 2 Documentation: Galactic documentation, accessed July 26, 2025, https://docs.ros.org/en/galactic/Tutorials/Intermediate/Tf2/Debugging-Tf2-Problems.html
  16. Introducing tf2 - ROS 2 documentation documentation, accessed July 26, 2025, https://ros.ncnynl.com/en/humble/Tutorials/Intermediate/Tf2/Introduction-To-Tf2.html
  17. Writing a static broadcaster (C++) - ROS 2 Documentation: Humble …, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Static-Broadcaster-Cpp.html
  18. The Transform System (tf2) Articulated Robotics, accessed July 26, 2025, https://articulatedrobotics.xyz/tutorials/ready-for-ros/tf/
  19. Writing a static broadcaster (Python) - ROS 2 Documentation, accessed July 26, 2025, https://docs.ros.org/en/rolling/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Static-Broadcaster-Py.html
  20. tf2 - ROS 2 Documentation: Humble documentation, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Tf2-Main.html
  21. Writing a broadcaster (C++) - tf2 - ROS documentation, accessed July 26, 2025, https://docs.ros.org/en/galactic/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Cpp.html
  22. Writing a tf2 broadcaster (C++) - ROS/Tutorials, accessed July 26, 2025, http://wiki.ros.org/tf2/Tutorials/Writing%20a%20tf2%20broadcaster%20%28C%2B%2B%29
  23. Writing a broadcaster (Python) - ROS 2 Documentation: Rolling documentation, accessed July 26, 2025, https://docs.ros.org/en/rolling/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Py.html
  24. Writing a broadcaster (Python) - ROS 2 Documentation: Humble …, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Py.html
  25. Clock and Time - ROS2 Design, accessed July 26, 2025, https://design.ros2.org/articles/clock_and_time.html
  26. Writing a listener (Python) - ROS 2 Documentation: Humble …, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Writing-A-Tf2-Listener-Py.html
  27. ros2_cookbook/rclpy/tf2.md at main - GitHub, accessed July 26, 2025, https://github.com/mikeferguson/ros2_cookbook/blob/main/rclpy/tf2.md
  28. tf2: tf2::BufferCore Class Reference - ROS documentation, accessed July 26, 2025, http://docs.ros.org/jade/api/tf2/html/classtf2_1_1BufferCore.html
  29. tf2::BufferCoreInterface Class Reference - ROS Documentation, accessed July 26, 2025, https://docs.ros2.org/foxy/api/tf2/classtf2_1_1BufferCoreInterface.html
  30. Changes between ROS 1 and ROS 2 - ROS2 Design, accessed July 26, 2025, http://design.ros2.org/articles/changes.html
  31. tf2: tf2::TimeCache Class Reference - the official ROS docs, accessed July 26, 2025, http://docs.ros.org/jade/api/tf2/html/classtf2_1_1TimeCache.html
  32. tf interpolation - ros - Robotics Stack Exchange, accessed July 26, 2025, https://robotics.stackexchange.com/questions/80896/tf-interpolation
  33. ros - How does tf do interpolation? - Robotics Stack Exchange, accessed July 26, 2025, https://robotics.stackexchange.com/questions/32309/how-does-tf-do-interpolation
  34. tf2::ExtrapolationException Class Reference - ROS Documentation, accessed July 26, 2025, https://docs.ros2.org/foxy/api/tf2/classtf2_1_1ExtrapolationException.html
  35. Unexpected output of _chainAsVector() / Issue #749 / ros2/geometry2 - GitHub, accessed July 26, 2025, https://github.com/ros2/geometry2/issues/749
  36. tf2::lookupTransform with time 0 throws Extrapolation / Issue #120 …, accessed July 26, 2025, https://github.com/ros/geometry/issues/120
  37. tf2_ros::Buffer Class Reference - ROS Documentation, accessed July 26, 2025, https://docs.ros2.org/foxy/api/tf2_ros/classtf2__ros_1_1Buffer.html
  38. Learning about tf2 and time (Python) - ROS 2 Documentation, accessed July 26, 2025, https://ftp.udx.icscoe.jp/ros/ros_docs_mirror/en/humble/Tutorials/Tf2/Learning-About-Tf2-And-Time-Py.html
  39. Learning about tf2 and time (Python) - ROS 2 Documentation: Xin …, accessed July 26, 2025, https://daobook.github.io/ros2-docs/xin/Tutorials/Tf2/Learning-About-Tf2-And-Time-Py.html
  40. ROS2 - Visualize TFs for a Robot with RViz and tf2_tools - YouTube, accessed July 26, 2025, https://www.youtube.com/watch?v=NuhSdA1G4pM
  41. tf2_tools view_frames: who is “default_authority”? - Robotics Stack Exchange, accessed July 26, 2025, https://robotics.stackexchange.com/questions/114637/tf2-tools-view-frames-who-is-default-authority
  42. rviz/DisplayTypes/TF - ROS Wiki, accessed July 26, 2025, http://wiki.ros.org/rviz/DisplayTypes/TF
  43. ROS 2 - Data display with RViz2 - Stereolabs, accessed July 26, 2025, https://www.stereolabs.com/docs/ros2/rviz2
  44. Rviz doesn’t show the correct tf2 tree - ROS Answers archive, accessed July 26, 2025, https://answers.ros.org/question/418327/
  45. rviz2 not showing transform properly, but tf2_echo does : r/ROS - Reddit, accessed July 26, 2025, https://www.reddit.com/r/ROS/comments/16ttj48/rviz2_not_showing_transform_properly_but_tf2_echo/
  46. What is the difference between tf and tf2? - Robotics Stack Exchange, accessed July 26, 2025, https://robotics.stackexchange.com/questions/34349/what-is-the-difference-between-tf-and-tf2
  47. TF2 Performance Guide 2: Is your toaster set to high? - YouTube, accessed July 26, 2025, https://m.youtube.com/watch?v=XfXeOpJ8dLU
  48. Tutorials - ROS 2 Documentation: Humble documentation, accessed July 26, 2025, https://docs.ros.org/en/humble/Tutorials.html
  49. (PDF) ROS2 Real-time Performance Optimization and Evaluation - ResearchGate, accessed July 26, 2025, https://www.researchgate.net/publication/376215526_ROS2_Real-time_Performance_Optimization_and_Evaluation
  50. Improve Perception Performance for ROS 2 Applications with NVIDIA Isaac Transport for ROS NVIDIA Technical Blog, accessed July 26, 2025, https://developer.nvidia.com/blog/improve-perception-performance-for-ros-2-applications-with-nvidia-isaac-transport-for-ros/
  51. ROS 2 developer guide - ROS 2 Documentation: Rolling documentation, accessed July 26, 2025, https://docs.ros.org/en/rolling/The-ROS2-Project/Contributing/Developer-Guide.html