# ROS2 매니지먼트 툴 (ros2cli, rviz2 등)

#### ros2cli

**ros2cli**는 ROS2의 명령줄 인터페이스(Command Line Interface) 도구로, 다양한 ROS2 작업을 쉽게 수행할 수 있는 명령어 집합을 제공한다. 이 도구는 ROS2 노드, 토픽, 서비스 등을 명령줄에서 직접 조작할 수 있도록 해 주며, 시스템 관리 및 디버깅을 위한 중요한 역할을 한다. ROS2CLI는 아래와 같은 주요 기능을 제공한다:

1. **노드 관리**

   * `ros2 node list`: 현재 실행 중인 모든 ROS2 노드들의 리스트를 확인할 수 있다.
   * `ros2 node info [node_name]`: 특정 노드에 대한 정보를 확인한다. 해당 노드가 구독하는 토픽, 서비스, 액션 등을 보여준다.

   이를 통해 사용자는 네트워크 상의 ROS2 노드를 쉽게 탐색하고, 시스템 상태를 진단할 수 있다.
2. **토픽 관리**\
   ROS2에서 토픽은 노드 간 통신의 기본 단위이다. 이를 효과적으로 관리하기 위해 ros2cli는 다양한 명령어를 제공한다:
   * `ros2 topic list`: 현재 사용 중인 모든 토픽들을 나열한다.
   * `ros2 topic info [topic_name]`: 특정 토픽에 대한 정보를 제공한다. 이에는 토픽의 타입, 퍼블리셔, 구독자 수 등이 포함된다.
   * `ros2 topic pub [topic_name] [msg_type] [args]`: 명령줄에서 직접 특정 토픽으로 메시지를 퍼블리싱할 수 있다.
   * `ros2 topic echo [topic_name]`: 특정 토픽에 퍼블리시된 메시지를 실시간으로 확인할 수 있다.
   * `ros2 topic bw [topic_name]`: 특정 토픽의 대역폭을 측정하여 시스템 성능을 진단할 수 있다.
3. **서비스 관리**\
   ROS2의 서비스는 동기적 호출을 통해 데이터를 교환하는 방법을 제공하며, 이를 관리하기 위한 명령어들도 ros2cli에서 제공된다:

   * `ros2 service list`: 현재 존재하는 모든 서비스의 리스트를 확인한다.
   * `ros2 service call [service_name] [srv_type] [args]`: 특정 서비스에 요청을 보내고 그 응답을 받을 수 있다.
   * `ros2 service type [service_name]`: 특정 서비스의 타입을 확인할 수 있다.

   이러한 명령어들을 통해 서비스 기반의 통신을 빠르게 테스트하고 시스템을 관리할 수 있다.
4. **액션 관리**\
   ROS2의 액션(Action)은 장시간 실행되는 작업에 대한 비동기적 처리 방법을 제공한다:
   * `ros2 action list`: 실행 중인 모든 액션 서버를 나열한다.
   * `ros2 action send_goal [action_name] [goal_type] [goal_args]`: 특정 액션에 목표(goal)를 보내고 그 결과를 기다린다.
   * `ros2 action cancel [goal_id]`: 특정 목표를 취소한다.
5. **파라미터 관리**\
   ROS2 노드는 다양한 설정을 위해 파라미터를 사용할 수 있으며, ros2cli는 이를 쉽게 관리할 수 있는 명령어들을 제공한다:
   * `ros2 param list`: 특정 노드에 설정된 모든 파라미터를 나열한다.
   * `ros2 param get [node_name] [param_name]`: 특정 노드에서 특정 파라미터의 값을 가져온다.
   * `ros2 param set [node_name] [param_name] [value]`: 특정 노드에서 특정 파라미터 값을 설정한다.
6. **로깅 및 디버깅**\
   ROS2의 로그는 시스템 진단에 중요한 역할을 하며, ros2cli는 이를 관리하기 위한 다양한 도구들을 제공한다:
   * `ros2 logging set_level [logger_name] [level]`: 특정 로그 레벨을 설정하여 디버깅 정보를 조정한다.

이처럼 **ros2cli**는 ROS2 시스템을 관리하고 진단하는 데 필수적인 도구이며, 이를 통해 개발자는 쉽게 노드, 토픽, 서비스, 액션, 파라미터 등을 조작할 수 있다.

#### rviz2

**rviz2**는 ROS2에서의 시각화 도구로, 로봇의 상태, 센서 데이터, 경로 계획 등을 시각적으로 표현해 주는 강력한 툴이다. 이는 주로 로봇 개발자들이 시스템을 쉽게 이해하고 디버깅할 수 있도록 도와주는 역할을 한다. rviz2는 다양한 기능을 제공하며, 그 중 일부는 다음과 같다:

1. **센서 데이터 시각화**\
   **rviz2**는 로봇의 각종 센서 데이터를 3D 공간에서 시각화할 수 있다. 예를 들어, **라이다(LIDAR)** 센서로부터 얻은 포인트 클라우드를 화면에 렌더링하여 로봇 주변의 환경을 실시간으로 확인할 수 있다. 이러한 시각화는 다음과 같은 데이터를 포함한다:
   * 포인트 클라우드(PointCloud2)
   * 이미지 데이터
   * 레이저 스캔(LaserScan)
2. **로봇 모델 시각화**\
   ROS2의 URDF(Unified Robot Description Format)를 통해 정의된 로봇의 모델을 3D 공간에서 실시간으로 확인할 수 있다. 로봇의 각 링크 및 조인트 상태를 시각적으로 표현하며, 이는 로봇의 운동학적 상태를 쉽게 이해하는 데 도움이 된다.
3. **경로 계획 및 실행 시각화**\
   **rviz2**는 경로 계획을 시각적으로 표현할 수 있다. 로봇의 목표 위치를 설정하고, 해당 위치로의 경로를 시각적으로 확인하면서 경로 계획 알고리즘의 성능을 평가할 수 있다. 예를 들어, 경로 탐색 시 노드 간의 연결성을 시각화하고, 장애물을 회피하는 경로를 실시간으로 모니터링할 수 있다.
4. **TF 트리 시각화**\
   ROS2에서 \*\*TF(transform)\*\*는 좌표계 간의 변환을 관리하는데 사용된다. 각 센서 및 링크는 서로 다른 좌표계를 가지며, 이들 간의 변환을 정확히 이해하는 것이 중요하다. rviz2는 TF 트리를 시각적으로 표현하여, 변환 관계를 명확히 파악할 수 있도록 해 준다. 이를 통해 각 좌표계의 위치 및 방향을 한눈에 확인할 수 있으며, 로봇의 기하학적 구조와 센서 데이터를 이해하는 데 중요한 역할을 한다.
5. **인터랙티브 마커**\
   rviz2에서는 **인터랙티브 마커(interactive marker)** 기능을 제공하여 사용자가 3D 공간에서 직접 로봇의 상태나 목표를 설정할 수 있다. 사용자는 마우스를 통해 로봇의 목표 위치를 설정하거나, 특정 노드를 클릭하여 동작을 트리거할 수 있다.
6. **플러그인 확장성**\
   **rviz2**는 다양한 플러그인을 지원하며, 이를 통해 새로운 기능을 추가하거나 기존 기능을 확장할 수 있다. 플러그인 구조를 통해 사용자는 자신이 필요로 하는 맞춤형 시각화 도구를 만들 수 있으며, ROS2 생태계에 존재하는 다른 패키지들과도 쉽게 통합할 수 있다. 예를 들어, 특수한 센서나 커스텀 데이터 타입을 사용하는 경우, 그에 맞는 플러그인을 개발하여 rviz2에 추가할 수 있다.

   rviz2에서 사용되는 몇 가지 주요 플러그인들은 다음과 같다:

   * **Camera 플러그인**: 로봇 카메라에서 입력되는 이미지 데이터를 실시간으로 확인할 수 있는 플러그인이다. 주로 로봇이 시각 정보를 사용하는 환경에서 유용하게 사용된다.
   * **Map 플러그인**: 2D 및 3D 지도 데이터를 시각화할 수 있는 플러그인이다. SLAM(동시적 위치 추정 및 지도 작성)이나 내비게이션에서 유용하게 사용된다.
   * **RobotModel 플러그인**: 로봇의 URDF 모델을 불러와 3D로 렌더링하고, 링크 및 조인트 상태를 시각화할 수 있다.
   * **Marker 플러그인**: 다양한 형태의 마커(arrow, cube, sphere, etc.)를 시각적으로 표현할 수 있는 플러그인이다. 주로 특정 위치나 방향을 표시할 때 사용된다.
7. **시각화 설정 및 사용자 정의**\
   rviz2는 사용자가 시각화 설정을 쉽게 변경할 수 있도록 다양한 사용자 정의 옵션을 제공한다. 예를 들어, 각 데이터 소스의 시각화 스타일(예: 포인트 클라우드의 크기, 색상)을 조정하거나, 새로운 보기(View)를 추가할 수 있다. 또한, 시각화 설정을 저장하고 나중에 다시 불러오는 기능을 제공하여, 프로젝트별로 다른 설정을 사용할 수 있다.

   시각화 설정의 주요 옵션은 다음과 같다:

   * **포인트 클라우드 색상 및 크기**: 센서에서 수집한 포인트 클라우드의 색상과 포인트 크기를 조정할 수 있다.
   * **레이저 스캔 스타일**: 라이다에서 수집한 레이저 스캔 데이터를 라인, 점 등 다양한 스타일로 표현할 수 있다.
   * **카메라 시점 조정**: 3D 뷰에서 카메라의 위치와 각도를 조정하여 다양한 시점에서 로봇과 데이터를 확인할 수 있다.

#### ros2 launch

**ros2 launch**는 여러 개의 ROS2 노드를 동시에 실행하는 데 사용되는 툴이다. 복잡한 로봇 시스템은 여러 개의 노드를 포함하는 경우가 많으며, 각 노드를 개별적으로 실행하는 것은 비효율적일 수 있다. 이때 **ros2 launch**를 사용하면, 여러 노드를 하나의 명령어로 간편하게 실행할 수 있다.

**launch 파일**은 XML 또는 Python으로 작성되며, 시스템의 전체적인 실행 흐름을 정의한다. 주로 사용되는 기능은 다음과 같다:

1. **노드 실행**\
   여러 개의 노드를 정의하고 동시에 실행할 수 있다. 각 노드의 실행 옵션(예: 이름, 네임스페이스, 파라미터)을 설정할 수 있다.

   ```xml
   <launch>
     <node pkg="my_package" exec="my_node" name="node1" output="screen"/>
     <node pkg="my_package" exec="my_node" name="node2" output="screen"/>
   </launch>
   ```
2. **파라미터 설정**\
   launch 파일을 통해 각 노드에 파라미터를 전달할 수 있다. 이는 각 노드가 실행될 때 필요한 설정 값을 정의하는 데 유용하다.

   ```xml
   <launch>
     <node pkg="my_package" exec="my_node" name="node1" output="screen">
       <param name="param1" value="100"/>
     </node>
   </launch>
   ```
3. **리매핑**\
   토픽이나 서비스의 이름을 launch 파일에서 리매핑하여, 실행 시 동적으로 통신 채널을 변경할 수 있다. 이는 노드 간 충돌을 피하거나 통신 구조를 유연하게 바꾸는 데 유용하다.

   ```xml
   <launch>
     <node pkg="my_package" exec="my_node" name="node1" output="screen">
       <remap from="/old_topic" to="/new_topic"/>
     </node>
   </launch>
   ```
4. **환경 변수 설정**\
   각 노드가 실행될 때 사용할 환경 변수를 설정할 수 있다. 이는 ROS2 외부의 시스템 환경 설정에 유용하다.

   ```xml
   <launch>
     <node pkg="my_package" exec="my_node" name="node1" output="screen">
       <env name="MY_ENV_VAR" value="true"/>
     </node>
   </launch>
   ```

**ros2 launch**는 이러한 기능들을 통해 대규모 시스템에서 노드를 효율적으로 관리하고 실행할 수 있게 해 준다. 이는 특히 자율 주행 로봇과 같이 복잡한 시스템에서 필수적인 툴로 사용된다.

#### rqt

**rqt**는 ROS2에서 제공하는 유연한 플러그인 기반의 GUI 관리 도구로, ROS2 환경을 시각적으로 관리, 디버깅, 분석할 수 있도록 다양한 기능을 제공한다. 플러그인 구조로 되어 있어 사용자가 필요한 기능만을 추가하거나 제거할 수 있으며, 다양한 상황에서 효율적인 시스템 관리 도구로 활용된다. 아래는 **rqt**의 주요 플러그인 및 그 동작에 대해 더 자세히 설명한다.

#### rqt의 주요 플러그인

**rqt\_graph**

**rqt\_graph**는 ROS2 네트워크 상에서 실행 중인 노드 간의 관계를 그래프로 시각화하는 플러그인이다. 각 노드가 퍼블리시하거나 구독하는 토픽을 연결선으로 나타내어, 시스템 통신 구조를 한눈에 파악할 수 있도록 돕는다. 이를 통해 시스템 내 통신 흐름을 쉽게 이해하고, 예상하지 못한 노드 간의 의존성이나 통신 오류를 빠르게 진단할 수 있다.

* **노드 간의 관계**: 각 노드는 네트워크 상의 독립적인 프로세스를 나타내며, 노드 간의 통신 경로가 화살표로 표현된다. 퍼블리셔 노드에서 구독자 노드로의 화살표는 데이터를 주고받는 과정을 의미한다.
* **리매핑 및 네임스페이스 표현**: **rqt\_graph**는 토픽 리매핑이나 네임스페이스의 적용 여부도 시각적으로 표현한다. 이를 통해 복잡한 시스템에서의 통신 구조를 쉽게 파악할 수 있으며, 특정 토픽의 리매핑이 예상대로 이루어졌는지 확인할 수 있다.
* **실시간 업데이트**: ROS2 시스템에서 노드의 추가나 삭제, 토픽 연결 상태의 변화가 발생할 경우, **rqt\_graph**는 이를 실시간으로 반영하여 업데이트된 네트워크 상태를 즉시 보여준다. 이를 통해 시스템 내 통신의 동적 변화를 효과적으로 모니터링할 수 있다.

**rqt\_console**

**rqt\_console**는 ROS2 노드의 로그 메시지를 모니터링하고 분석할 수 있는 도구다. 각 노드에서 출력되는 디버깅 정보, 경고, 에러 메시지를 실시간으로 확인하고, 문제 발생 시 그 원인을 추적할 수 있다. ROS2의 로깅 기능은 로봇 시스템에서 발생하는 다양한 정보를 기록하고, 이를 통해 시스템의 상태를 진단하는 데 중요한 역할을 한다.

* **로그 필터링**: **rqt\_console**는 로그 메시지를 특정 기준에 따라 필터링할 수 있다. 예를 들어, 특정 노드에서 발생하는 에러 메시지만을 표시하거나, 특정 로그 레벨(디버그, 정보, 경고, 에러 등) 이상의 메시지만을 확인할 수 있다. 이를 통해 불필요한 정보를 배제하고, 문제의 원인을 신속하게 찾아낼 수 있다.
* **시간 기반 필터링**: 로그 메시지를 발생 시간에 따라 필터링하여, 특정 시간대에 발생한 문제를 집중적으로 분석할 수 있다. 이 기능은 시간에 민감한 이벤트나, 특정 시점에서 발생한 오류를 찾을 때 유용하다.
* **로그 저장 및 분석**: **rqt\_console**는 로그 메시지를 파일로 저장할 수 있어, 후속 분석이나 시스템 성능 평가에 사용할 수 있다. 이러한 로그 파일은 다른 툴을 사용해 분석하거나, 문제 해결을 위한 기록으로 남길 수 있다.

**rqt\_plot**

**rqt\_plot**는 ROS2 시스템에서 퍼블리시되는 토픽 데이터를 실시간으로 그래프로 시각화하는 플러그인이다. 이 도구는 주로 센서 데이터나 상태 정보를 그래프 형태로 나타내어, 시간에 따른 데이터 변화를 직관적으로 파악할 수 있도록 돕는다. 이를 통해 센서 값이나 로봇의 특정 상태가 어떻게 변화하고 있는지 실시간으로 모니터링할 수 있다.

* **실시간 데이터 시각화**: 예를 들어, 온도 센서에서 발생하는 데이터를 실시간으로 확인하거나, 로봇의 속도 변화를 시간에 따라 그래프로 나타낼 수 있다. 이 기능은 시스템 튜닝 및 성능 분석에 매우 유용하다.
* **멀티플 데이터 시각화**: 여러 개의 토픽 데이터를 동시에 그래프에 그릴 수 있어, 서로 다른 데이터 간의 상관관계를 분석할 수 있다. 예를 들어, 모터의 전류와 속도를 동시에 시각화하여, 전류 변화에 따른 속도 반응을 분석할 수 있다.
* **확대 및 축소 기능**: 그래프의 특정 부분을 확대하여 자세한 데이터를 확인할 수 있으며, 그래프의 범위를 자유롭게 조정할 수 있다. 이는 데이터의 급격한 변화나 미세한 변화를 분석하는 데 도움을 준다.

**rqt\_reconfigure**

**rqt\_reconfigure**는 ROS2 시스템에서 실행 중인 노드의 파라미터를 실시간으로 조정할 수 있는 도구다. 이 플러그인은 시스템을 다시 시작하지 않고도 노드의 동작을 동적으로 수정할 수 있어, 실시간 튜닝에 매우 유용하다.

* **동적 파라미터 변경**: 사용자는 노드의 동작을 제어하는 파라미터를 GUI 상에서 실시간으로 변경할 수 있다. 예를 들어, 특정 제어기의 PID 게인을 실시간으로 조정하여 로봇의 제어 성능을 향상시키거나, 센서 필터링 파라미터를 변경하여 데이터를 최적화할 수 있다.
* **파라미터 적용 즉시 반영**: 파라미터 변경 사항은 즉시 해당 노드에 반영되며, 시스템의 동작이 실시간으로 변한다. 이를 통해 여러 번의 실험과 튜닝 과정을 거치며 최적의 파라미터를 찾을 수 있다.
* **노드별 파라미터 관리**: 각 노드별로 파라미터가 분리되어 있어, 특정 노드의 파라미터만을 관리하거나 변경할 수 있다. 이를 통해 복잡한 시스템에서도 효율적으로 파라미터를 관리할 수 있다.

**rqt\_bag**

**rqt\_bag**는 ROS2에서 발생하는 데이터(토픽, 메시지)를 기록하고 재생할 수 있는 도구로, 데이터 수집 및 재현에 중요한 역할을 한다. 로봇 시스템에서는 실시간으로 다양한 데이터가 발생하며, 이를 기록하여 분석하거나 나중에 재현하는 것은 시스템 성능을 최적화하거나 문제를 진단하는 데 매우 유용하다.

* **데이터 기록**: ROS2에서 퍼블리시되는 모든 토픽 데이터를 **bag 파일**로 기록할 수 있다. 이 파일에는 토픽 메시지와 그 시간 정보가 포함되어, 이후 재생 시 동일한 시간 순서로 데이터를 확인할 수 있다.
* **데이터 재생**: 기록된 bag 파일을 나중에 재생하여, 그 시점에 발생했던 데이터를 재현할 수 있다. 이 기능은 시뮬레이션이나 디버깅 과정에서 매우 유용하다. 예를 들어, 로봇이 특정 환경에서 센서 데이터를 어떻게 수집했는지를 재현하고 분석할 수 있다.
* **필터링 및 부분 재생**: 전체 데이터를 재생하는 대신 특정 시간대나 특정 토픽의 데이터를 선택적으로 재생할 수 있다. 이를 통해 대량의 데이터를 효율적으로 분석할 수 있다.

**rqt\_service\_caller**

**rqt\_service\_caller**는 ROS2에서 제공되는 서비스 인터페이스를 GUI 상에서 호출할 수 있는 플러그인이다. 이 도구는 사용자가 명령줄을 사용하지 않고도 서비스를 쉽게 호출할 수 있도록 돕는다.

* **서비스 목록 표시**: 현재 실행 중인 모든 ROS2 서비스를 나열하고, 각 서비스의 입력과 출력 타입을 보여준다.
* **서비스 호출**: GUI를 통해 간단한 입력값만으로 서비스를 호출할 수 있으며, 결과도 즉시 확인할 수 있다. 예를 들어, 로봇의 특정 동작을 트리거하거나, 센서 데이터를 요청할 때 유용하다.

#### rqt의 확장성 및 커스터마이징

**rqt**의 가장 큰 장점 중 하나는 플러그인 기반 아키텍처를 통해 확장성과 유연성을 제공한다는 점이다. **rqt**는 기본 제공 플러그인 외에도 사용자가 직접 플러그인을 개발하여 시스템의 요구에 맞게 기능을 확장할 수 있다.

* **커스텀 플러그인 개발**: 사용자는 자신만의 플러그인을 만들어 **rqt**에 추가할 수 있다. 예를 들어, 특정한 데이터 타입을 시각화하는 도구나, 특수한 노드 동작을 관리하는 툴을 직접 개발하여 **rqt**의 기능을 확장할 수 있다.
* **플러그인 설치 및 관리**: **rqt**는 다양한 플러그인을 ROS 패키지 관리 시스템을 통해 설치하고 관리할 수 있다. 기존의 오픈소스 플러그인을 쉽게 설치하여 **rqt**에 추가하거나,

필요하지 않은 플러그인을 제거할 수 있다.

이처럼 **rqt**는 사용자의 요구에 맞추어 시스템을 관리하고, 분석하는 데 매우 유용한 툴이며, 그 확장성과 유연성 덕분에 복잡한 ROS2 시스템에서도 효율적으로 활용할 수 있다.
