일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- nav2 development guides
- ros2 development guides
- error
- nav2 설치
- CodeUp
- foxy nav2
- ros2 transformations 개념
- Foxy tutorial
- CODEUP 6073
- Nav2 document
- nav2 getting started
- docker foxy
- ros2 튜토리얼 환경설정
- ros2 foxy tutorial
- setting up transformations
- ros2 configuring environment
- ros2 remapping
- Python
- humble 환경설정
- ros2 튜토리얼
- ros2 환경설정
- nav2 튜토리얼
- humble development guides
- nav2 dev contatiner
- 코드업
- nav2 first-time robot setup guide
- first-time robot setup guide
- ros2 foxy docker
- ROS FOXY 튜토리얼
- nav2 tutorial
- Today
- Total
BAN2ARU
[Humble/Nav2] 튜토리얼 4. First-Time Robot Setup Guide - 1) Setting Up Transformations 본문
[Humble/Nav2] 튜토리얼 4. First-Time Robot Setup Guide - 1) Setting Up Transformations
밴나루 2025. 2. 6. 18:51해당 글은 공식페이지를 참조하여 작성함.
이전 글 목록
2024.10.03 - [Study/Nav2] - [Humble/Nav2] 튜토리얼 4. First-Time Robot Setup Guide
2024.10.03 - [Study/Nav2] - [Humble/Nav2] 튜토리얼 3. Navigation Concepts - 4) State Estimation
2024.10.03 - [Study/Nav2] - [Humble/Nav2] 튜토리얼 3. Navigation Concepts - 3) Navigation Servers
2024.10.03 - [Study/Nav2] - [Humble/Nav2] 튜토리얼 3. Navigation Concepts - 2) Behavior Trees
2024.10.03 - [Study/Nav2] - [Humble/Nav2] 튜토리얼 3. Navigation Concepts - 1) ROS2
이번 섹션에서는 Nav2 시스템에서 사용하는 transform(좌표 변환)을 설정하고 구성하는 방법에 대해 설명할 것이다. Transform은 로봇의 각 좌표계 프레임 간의 위치와 자세를 정의하고, 센서 데이터나 odometry 정보를 일관된 기준 좌표계로 변환하여 사용할 수 있도록 하는 기능이다.
해당 tutorial을 통해 ROS 상에서의 transform에 대해 간단히 설명하고, TF static pulisher의 간단한 demo를 실행하여 실제로 어떻게 동작하는 지 살펴볼 것이다. 마지막으로 Nav2가 올바르게 작동하기 위해서 반드시 publish 되어야하는 transfrom에 대해서도 설명할 것이다.
Transforms Introduction
대부분의 ROS 패키지들은 로봇의 transform tree를 TF ROS packger를 사용하여 publish한다. Transform tree는 로봇의 여러 좌표계 프레임 간의 관계를 나타내는 구조로, 좌표계 프레임들은 서로 상대적인 위치와 회전, 그리고 움직임을 가질 수 있다. 이해를 돕기 위해, 간단한 로봇을 예를 들어보자. 예제 로봇은 mobile base와 그 위에 장착된 single laser sensor를 가지고 있다.
이 로봇은 2개의 좌표계 프레임으로 구성되어 있다. 하나는 mobile base의 중심점에 위치한 기준 좌표계이며, 나머지 하나는 laser sensor가 장착된 위치에 해당되는 좌표계 프레임이다. 우리는 mobile base 기준의 좌표계를 base_link , laser sensor 기준의 좌표계를 base_laser 로 정의한다.
현재 상황에서 laser 센서의 중심점으로부터 거리 측정값의 형태로 data를 가지고 있다고 하자. 즉 base_laser 좌표계에서 표현된 데이터를 가지고 있다는 의미이다.
이 데이터를 사용하여 mobile base가 주변의 장애물을 성공적으로 피할려면, base_laser 좌표계에서 얻은 laser scan 데이터를 base_link 좌표계로 변환해야한다. 즉 base_laser와 base_link 좌표계 간의 관계를 정의해야한다.
위의 그림처럼 laser sensor가 로봇의 중심인 base_link에서 앞으로 10cm, 위로 20cm 위치에 장착되어 있다고 가정하자. 이 정보를 통해 base_link에서 base_laser로 변환할 때의 Translation Offset을 정의할 수 있다. base_link에서 base_laser로 데이터를 변환하려면, 다음과 같은 이동(translation; x축 0.1m, y축 0.0m, z축 0.2m)을 적용해야한다. 역으로 base_laser에서 base_link로 변환시에는 반대 방향으로의 이동(translation; x축 -0.1m, y축 0m, z축 -0.2m)을 적용해야 한다.
좌표계간의 변환 관계를 직접 관리하려면 각 좌표계가 어떻게 배치되어 있고 어떠한 translation을 적용해야하는지 일일이 기억하고 필요할 때마다 계산해주어야 한다. 이러한 작업은 좌표계가 두 개일때는 비교적 간단하지만, 로봇의 센서 수가 늘어나고 좌표계 프레임이 많아질수록 매우 복잡해지고 오류가 발생할 가능성도 높아진다. 만약 TF2 라이브러리를 통해 각 좌표계 간의 transformation을 한 번만 정의해주면, 이 후 TF2가 모든 좌표계 간의 변환을 자동으로 관리해준다. 이러한 TF2 라이브러리는 static 좌표계 뿐만 아니라 시간에 따라 움직이는 non-static 좌표계도 자동으로 추적하고 변환해준다.
base_link와 base_laser 좌표 프레임 간의 관계를 TF2를 사용하여 정의하고 저장하기 위해서는, 이들을 transform tree에 추가해주어야 한다. Transform tree는 로봇의 각 좌표계 frame을 node로, 좌표계간의 transform을 edge로 표현한다. 각 좌표계 프레임은 부모-자식 관계로 연결되어 있어, 트리의 한 노드에서 다른 노드로 변환할 때 단일 경로만을 통해 접근할 수 있도록 보장된다. 즉 두 좌표계 프레임을 연결하는 경로가 하나만 존재하도록 보장하며, tree 내 모든 edge는 부모 노드에서 자식 노드로 향하는 방향을 가진다.
간단한 예제를 통해 TF 트리 설정하는 방법에 대해 알아보자. 우리는 두 개의 node를 생성할 것인데, 그 중 하나는 base_link 좌표계이고 나머지 하나는 base_laser 좌표계이다. 이 두 노드를 연결하는 edge를 생성하기 위하여, 부모-자식 관계를 먼저 정의해야한다. 여기서 중요한 점은, 모든 변환은 부모에서 자식으로 방향성을 가지기 때문에, 각 좌표 프레임이 어떤 기준으로 연결될 지 명확히 결정해야 한다.
base_link 좌표계를 부모 프레임으로 선택하자. 왜냐하면 base_link를 부모 프레임으로 설정하면, 다른 센서나 장비를 추가할 때 base_link를 기준으로 연결할 수 있기 때문이다. 이렇게 된다면 base_link와 base_laser 사이의 연결된 edge는 (x: 0.1m, y: 0.0m, z: 0.2m)의 변환을 가지게 된다.
Transform tree가 설정되고나면, base_link와 base_laser 사이의 변환 관계를 TF2 라이브러리를 통해 자동으로 관리할 수 있다. 레이저 스캔 데이터는 base_laser 좌표계 기준으로 수집되며, 장애물이 감지가 되면 이를 base_link 기준으로 변환하여 안전하게 경로를 계획하고 장애물을 회피할 수 있다.
Static Transform Publisher Demo
TF2에서 제공하는 static_transform_publisher 도구를 사용하여 간단한 좌표 변환을 직접 publish해보자. base_link에서 base_laser로의 변환을 (x: 0.1m, y: 0.0m, z: 0.2m)의 translation의 transformation을 publish하고자 한다.
command 명령창을 열고 다음과 같은 명령어를 실행시켜주자.
ros2 run tf2_ros static_transform_publisher --x 0.1 --y 0.0 --z 0.2 --roll 0.0 --pitch 0.0 --yaw 0.0 --frame-id base_link --child-frame-id base_laser
base_link에서 base_laser로의 변환이 TF2에서 제대로 publish 되었는지 tf2_echo를 통해 확인해보자. 새로운 터미널 창을 열고 다음 명령어를 실행해보자.
ros2 run tf2_ros tf2_echo base_link base_laser
짧은 예제를 통해 TF2 library를 사용하여 base_link에서 base_laser로의 변환을 성공적으로 publish할 수 있었다. 하지만 demo에서 보여준 방식은 단순히 TF2의 작동을 확인하기 위한 것일 뿐 실제 로봇 프로젝트에서 변환을 publish하는데 사용하는 것을 권장하지 않는다. 실제 로봇 시스템에서는 static_transform_publisher 대신 URDF 파일을 작성하여 로봇에 대한 변환 정보와 더 많은 세부 정보를 robot_state_publisher를 통해 publish하는 것이 좋다. 이는 이 후 Setting Up The URDF 튜토리얼에서 다룰 예정이다.
Transforms in Navigation2
ROS와 관련된 REP 문서 중 두 가지 중요한 표준은 아래와 같다. REP(ROS Enhancement Proposal)은 ROS 커뮤니티에서 정의한 표준 문서로 특정 기능, 규칙, 명명법 등을 제안하고 설명한다. Nav2 또한 이러한 표준을 따르고 있다.
- REP 105 - Coordinate Frames for Mobile Platforms
- REP 103 - Standard Units of Measure and Coordinate Conventions
REP 105는 ROS에서 사용되는 좌표계 프레임의 이름과 의미를 정의한 표준 문서이다. 이 튜토리얼에서 주로 다루는 좌표 프레임은 base_link, odom 그리고 map 세 가지이다. base_link는 로봇 본체에 고정된 좌표 frame으로, 보통 로봇의 주요 chassis(뼈대 구조)나 회전 중심점에 위치한다. odom은 로봇의 시작 위치를 기준으로 고정된 좌표 프레임으로, 로봇의 이동을 추적할 때, locally-consistent 거리와 위치를 나타내기 위해 사용된다. map은 world 기준 좌표 프레임으로, globally-consistent 거리를 나타내기 위해 사용된다.
REP 103은 ROS 시스템에서 사용하는 표준 단위와 좌표계 규칙을 정의하여, 다양한 ROS 패키지 간의 통합 문제를 최소화하는 것을 목표로 한다. 오른손 법칙에 따라 좌표계의 축 방향은 x축은 앞쪽, y축은 왼쪽, z축은 위쪽을 향한다. 모든 측정 단위는 국제 단위계(SI units)을 사용하며, 이는 길이는 미터(m), 시간은 초(s), 각도는 라디안(rad), 속도는 미터/초(m/s), 가속도는 미터/초² (m/s²)을 의미한다.
Navigation2 패키지가 정상적으로 작동하기 위해서는 필수적으로 요구되는 transformation이 있다.
- map → odom : 전역 위치 추정을 위해 필요함
- odom → base_link : 로봇의 본체가 어떻게 움직이는지를 나타냄
- base_link → base_laser (센서 frame) : 센서 데이터를 올바르게 해석하기 위해 필요함
첫 번째 transform인 map → odom은 보통 AMCL과 같은 위치 추정 및 지도 생성 관련 ROS 패키지에서 제공된다. 이러한 transform은 사용 중에 실시간으로 업데이트되므로, 로봇의 TF tree에 static 값으로 설정하지 않는다. 이를 설정하는 방법은 다소 복잡할 수 있으므로, 사용 중인 flatform의 지도 생성 또는 위치 추정 패키지의 문서를 참조하는 것을 강력히 권장한다. 모든 ROS 호환되는 SLAM 및 위치 추정 패키지는 시작 시 이 transform을 자동으로 제공한다.
odom → base_link는 wheel encoder와 같은 센서를 사용하는 odometry 시스템에 publish 된다. 이러한 transform은 일반적으로 robot_localization 패키지를 사용하여 odometry 센서(IMU, wheel encoder, VIO 등)의 센서 fusion을 통해 계산된다.
로봇의 특정 좌표 프레임 간의 변환 관계가 고정되어 변하지 않는 정적 transform들(예: base_link → base_laser, base_link → wheels, wheels → IMU 등) 이 후의 가이드에서 다룰 예정이다. 이러한 transformation tree는 센서 또는 다른 프레임의 정보를 로봇의 나머지 부분과 적절히 연결하기 위하여 Nav2가 사용된다. 두 좌표 프레임 간의 변환은 일반적으로 Robot State Publisher와 URDF(Universal Robot Description File)을 통해 Nav2에 제공된다. 로봇 플랫폼에 더 많은 센서 좌표 프레임이 있는 경우, base_link에서 각 센서 좌표 프레임으로의 transform tree를 publish해야 한다.
Conclusion
이번 튜토리얼에서는 transforms 개념과 Nav2에서의 사용법에 대해 알아보았다.
TF2의 static_transform_publisher를 사용하여 transform을 publish하는 방법을 알아보았다. Nav2의 transform을 설정할 수 있지만 권장되는 방법은 아니다. 이는 로봇이 복잡해질수록 관리하기 어렵기 때문이다. Robot State Publisher를 사용하는 것을 권장하며, 이는 URDF를 통해 로봇의 구조와 변환을 정의하고 Robot State Publisher가 이를 자동으로 Nav2에 publish하는 방법으로 더 편리하고 확장성이 좋다.
'Study > Nav2' 카테고리의 다른 글
[Humble/Nav2] 튜토리얼 4. First-Time Robot Setup Guide (0) | 2024.10.03 |
---|---|
[Humble/Nav2] 튜토리얼 3. Navigation Concepts - 5) Environmental Representation (4) | 2024.10.03 |
[Humble/Nav2] 튜토리얼 3. Navigation Concepts - 4) State Estimation (2) | 2024.10.03 |
[Humble/Nav2] 튜토리얼 3. Navigation Concepts - 3) Navigation Servers (0) | 2024.10.03 |
[Humble/Nav2] 튜토리얼 3. Navigation Concepts - 2) Behavior Trees (4) | 2024.10.03 |