시스템 요구 사항

ROS2 Humble을 설치하기 위해서는 우선 기본적인 시스템 요구 사항을 충족해야 한다. ROS2 Humble은 Linux 기반에서 가장 안정적으로 구동되며, Ubuntu 22.04 LTS (Jammy Jellyfish)를 권장한다. Windows와 macOS에서도 ROS2 Humble을 실행할 수 있지만, 이 문서에서는 Ubuntu를 기준으로 설명한다.

필수 요구 사항:

Ubuntu 22.04에 ROS2 Humble 설치

ROS2 Humble은 다양한 방법으로 설치할 수 있지만, 일반적으로 APT 패키지 관리자를 사용한 설치가 가장 간편한다. 다음은 APT 패키지를 이용한 설치 과정이다.

  1. 소스 목록에 ROS2 패키지 추가 우선, ROS2 APT 저장소를 사용하기 위해 시스템의 소스 목록에 저장소를 추가해야 한다. 터미널을 열고 다음 명령어를 입력한다.

bash sudo apt update && sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo tee /usr/share/keyrings/ros-archive-keyring.gpg > /dev/null

그 다음, APT 소스 목록 파일을 생성하여 ROS2 Humble 저장소를 추가한다.

bash echo "deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

  1. ROS2 패키지 설치 저장소가 추가된 후, 다음 명령어로 패키지 목록을 업데이트하고 ROS2 Humble 데스크탑 설치를 진행한다.

bash sudo apt update sudo apt install ros-humble-desktop

ros-humble-desktop 패키지는 ROS2의 기본적인 도구와 Rviz, Gazebo와 같은 시각화 도구를 포함한 설치 옵션이다.

  1. 환경 설정 ROS2를 설치한 후, ROS2 환경 변수를 매번 설정하지 않기 위해 Bash 프로필에 자동으로 로드되도록 설정한다. 터미널에 다음 명령을 입력하여 설정 파일을 편집한다.

bash echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc

위 명령어는 ROS2 Humble의 환경 변수를 로드하여, 시스템에서 ROS2 명령어를 인식할 수 있도록 한다.

ROS2 작업공간 설정

ROS2에서 패키지를 개발하거나 실행하기 위해서는 작업 공간(workspace)을 설정해야 한다. 작업 공간을 생성하고 초기화하는 과정은 다음과 같다.

  1. 작업 공간 디렉토리 생성 우선 작업 공간을 생성할 디렉토리를 만든다. 일반적으로 작업 공간은 홈 디렉토리 아래 ros2_ws와 같은 이름으로 생성된다.

bash mkdir -p ~/ros2_ws/src cd ~/ros2_ws

  1. 작업 공간 빌드 작업 공간을 초기화한 후, colcon 빌드 도구를 사용하여 ROS2 패키지를 빌드한다. colcon은 ROS2에서 기본적으로 사용하는 빌드 도구이다.

bash colcon build

빌드가 완료된 후, 빌드된 패키지를 사용할 수 있도록 환경 변수를 설정해야 한다.

bash source install/setup.bash

이렇게 하면, 해당 세션에서 작업 공간의 패키지를 인식하고 사용할 수 있다.

  1. 환경 변수 자동 로드 설정 매번 작업 공간에서 새로운 터미널을 열 때마다 환경 변수를 로드하지 않으려면, bashrc에 해당 작업 공간의 경로를 추가한다.

bash echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc source ~/.bashrc

추가 의존성 설치

ROS2 패키지를 사용할 때 특정한 추가 의존성이 필요한 경우가 있다. 예를 들어, LIDAR 센서를 사용하는 자율주행 로봇 시스템을 구현하기 위해서는 sensor_msgs, nav_msgs와 같은 메시지 타입과 관련된 패키지를 추가로 설치해야 할 수 있다. 이러한 패키지를 설치하는 방법은 다음과 같다.

sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup

이는 네비게이션 관련 패키지들을 설치하며, 다른 센서나 알고리즘에 따라 추가적인 패키지가 필요할 수 있다.

ROS2 패키지 관리 도구 사용

ROS2에서는 패키지 관리를 위한 다양한 도구가 제공된다. 대표적인 도구로는 rosdep, colcon, ros2cli가 있다.

bash sudo rosdep init rosdep update rosdep install --from-paths src --ignore-src -r -y

ROS2의 네트워크 설정

ROS2는 분산 시스템에서 노드 간의 통신을 기본으로 하기 때문에, 네트워크 설정이 매우 중요하다. ROS2는 DDS(데이터 분산 서비스)를 기반으로 노드 간의 통신을 수행하며, 이를 위한 네트워크 설정을 적절히 구성하는 것이 필요하다.

1. Fast DDS와 네트워크 구성

ROS2는 기본적으로 DDS 미들웨어를 사용하여 노드 간 통신을 수행한다. ROS2 Humble에서는 Fast DDS가 기본 설정으로 제공된다. 네트워크 상의 노드들이 서로 통신할 수 있도록 하기 위해서 여러 가지 설정을 고려해야 한다.

네트워크 인터페이스 설정

다중 네트워크 인터페이스가 있는 시스템에서, ROS2는 기본적으로 첫 번째 인터페이스를 사용한다. 특정 네트워크 인터페이스를 지정하고 싶다면, 환경 변수를 설정하여 제어할 수 있다. 예를 들어, 특정 IP 주소를 사용하도록 설정하려면 다음과 같이 환경 변수를 설정할 수 있다.

export ROS_DOMAIN_ID=1

여기서 ROS_DOMAIN_ID는 ROS2 네트워크를 분리하기 위한 개념으로, 다른 네트워크나 다른 프로젝트와 겹치지 않도록 각각의 프로젝트에 고유한 도메인 ID를 설정할 수 있다.

2. ROS_DOMAIN_ID의 활용

ROS_DOMAIN_ID는 동일한 네트워크에서 여러 개의 ROS2 시스템이 서로 간섭 없이 작동할 수 있도록 도와준다. 도메인 ID는 DDS 통신의 네트워크 파티션 역할을 하며, 같은 도메인 ID를 가진 노드끼리만 통신할 수 있다. 이를 활용하여 ROS2 시스템을 분리하거나 네트워크 간섭을 최소화할 수 있다.

도메인 ID 설정 방법은 다음과 같다.

export ROS_DOMAIN_ID=<원하는 ID 값>

이 명령어를 .bashrc에 추가하여 시스템에서 ROS2의 도메인 ID를 고정적으로 설정할 수 있다. 이 값은 0부터 232까지 설정 가능하며, 동일한 네트워크 상의 다른 프로젝트나 로봇 시스템과 겹치지 않는 값을 설정하는 것이 중요하다.

3. 멀티캐스트 통신 설정

ROS2는 네트워크 상에서 멀티캐스트를 통해 노드 간의 정보를 전파한다. 하지만 멀티캐스트 트래픽이 네트워크에서 차단되거나 제한될 수 있는 환경에서는 ROS2 통신이 제대로 동작하지 않을 수 있다. 이를 해결하기 위해서는 네트워크 장비에서 멀티캐스트 설정을 활성화해야 하며, 방화벽 규칙을 통해 멀티캐스트 트래픽이 허용되는지 확인해야 한다.

4. 보안 설정

ROS2는 DDS 보안 프로파일을 지원하여 데이터 통신의 보안을 강화할 수 있다. 이는 TLS와 같은 표준 암호화 기술을 사용하여 노드 간 통신을 보호하며, 네트워크 환경에서 데이터의 무결성과 기밀성을 유지할 수 있도록 한다. 보안 통신을 설정하기 위해서는 SROS2라는 도구를 사용한다.

sudo apt install ros-humble-sros2

SROS2를 이용하면 인증서 기반의 통신이 가능하며, 노드 간의 접근 제어를 세밀하게 설정할 수 있다. SROS2의 주요 기능은 다음과 같다.

5. 네트워크 문제 해결

ROS2 네트워크 통신에서 문제가 발생했을 때는 몇 가지 기본적인 문제 해결 절차를 수행할 수 있다.

네트워크가 정상적으로 설정되지 않으면, ros2 topic list 명령어로 노드 간의 토픽이 제대로 통신되고 있는지 확인하는 것도 중요한 방법이다.

ROS2의 환경 설정 도구

ROS2에서 환경 설정과 관련된 도구들은 시스템의 효율성을 높이고, 다양한 개발 환경에 맞춰 설정을 최적화하는 데 필수적이다. 주요 도구는 다음과 같다.

1. RMW(ROS Middleware) 선택

ROS2는 다양한 DDS 미들웨어를 지원하며, 기본으로 제공되는 Fast DDS 외에도 Cyclone DDS와 같은 다른 DDS 미들웨어를 사용할 수 있다. RMW(Robot Middleware)를 변경하는 방법은 환경 변수를 통해 설정할 수 있다.

예를 들어, Cyclone DDS를 사용하려면 다음과 같이 환경 변수를 설정한다.

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

이를 .bashrc에 추가하여 영구적으로 설정할 수 있다.

2. QoS 설정

QoS(서비스 품질) 설정은 ROS2 통신에서 매우 중요한 요소이다. 노드 간의 통신에 대해 신뢰성, 지속성, 우선순위 등 다양한 QoS 정책을 적용할 수 있다. 기본적으로 제공되는 QoS 설정 외에도, 개발자는 사용자 정의 QoS 프로파일을 설정할 수 있다.

QoS 설정은 yaml 파일로 정의되며, 네트워크 상황에 맞춰서 최적화할 수 있다. 예를 들어, 실시간 시스템에서는 낮은 지연 시간과 높은 우선순위의 QoS 설정이 필요할 수 있다.

3. 환경 설정 파일

ROS2에서는 사용자 정의 환경 설정을 .bashrc.zshrc 파일에 저장할 수 있다. 기본적인 ROS2 환경 변수를 포함한 설정 파일을 생성하여 여러 프로젝트나 로봇 시스템에서 빠르게 적용할 수 있다. 예를 들어, 다음과 같은 설정을 ~/.bashrc에 추가하면 매번 수동으로 설정할 필요가 없다.

source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=1
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

이렇게 설정하면 ROS2 실행 시마다 자동으로 환경 변수가 로드되어 효율적인 작업 환경을 유지할 수 있다.

ROS2 노드 실행 및 관리

ROS2를 설치하고 환경을 설정한 후에는 노드 실행과 관련된 다양한 명령어와 도구를 사용할 수 있다. 노드는 ROS2의 기본 단위로, 각 노드가 서로 통신하며 자율주행 시스템이나 로봇 애플리케이션을 구성한다.

1. ROS2 노드 실행

ROS2에서는 터미널을 통해 간단하게 노드를 실행할 수 있다. ROS2 노드를 실행하는 기본 명령어는 다음과 같다.

ros2 run <패키지 이름> <노드 이름>

예를 들어, ROS2 기본 패키지인 demo_nodes_cpp에서 talker 노드를 실행하려면 다음과 같이 입력한다.

ros2 run demo_nodes_cpp talker

이 명령은 talker 노드를 실행하며, 노드가 실행되면 초당 한 번씩 메시지를 퍼블리시(publish)한다. 이 메시지를 다른 노드가 구독(subscribe)할 수 있다.

2. 노드 목록 확인

ROS2에서 현재 실행 중인 노드를 확인하려면 다음 명령어를 사용할 수 있다.

ros2 node list

이 명령어는 현재 시스템에서 실행 중인 모든 노드의 이름을 반환한다. 노드 간의 통신 상태나 노드 이름을 확인할 때 유용하다.

3. 노드 정보 확인

특정 노드의 정보를 확인하려면 ros2 node info 명령어를 사용할 수 있다. 이 명령어는 노드가 퍼블리시하는 토픽, 구독하는 토픽, 사용하는 서비스 등 노드의 자세한 정보를 출력한다.

ros2 node info <노드 이름>

예를 들어, talker 노드의 정보를 확인하려면 다음과 같이 입력한다.

ros2 node info /talker

4. 토픽 확인 및 메시지 송수신

ROS2에서 노드 간 통신은 주로 토픽을 통해 이루어진다. 노드가 퍼블리시하는 메시지를 구독하거나 새로운 메시지를 퍼블리시할 수 있다.

토픽 목록 확인

현재 시스템에서 사용되는 모든 토픽을 확인하려면 다음 명령어를 사용한다.

ros2 topic list

이 명령어는 시스템에서 활성화된 모든 토픽을 나열하며, 각각의 토픽을 퍼블리시하는 노드와 구독하는 노드 간의 관계를 파악하는 데 유용하다.

토픽 메시지 내용 확인

특정 토픽에서 퍼블리시되는 메시지를 실시간으로 확인하려면 ros2 topic echo 명령어를 사용할 수 있다.

ros2 topic echo <토픽 이름>

예를 들어, /chatter 토픽에서 퍼블리시되는 메시지를 확인하려면 다음과 같이 입력한다.

ros2 topic echo /chatter

이 명령어는 /chatter 토픽에서 실시간으로 전송되는 모든 메시지를 터미널에 출력한다.

토픽에 메시지 퍼블리시

ROS2에서는 터미널을 통해 직접 메시지를 퍼블리시할 수도 있다. 다음 명령어를 사용하여 특정 토픽에 메시지를 전송할 수 있다.

ros2 topic pub <토픽 이름> <메시지 타입> "데이터"

예를 들어, /chatter 토픽에 std_msgs/String 타입의 메시지를 퍼블리시하려면 다음과 같이 입력한다.

ros2 topic pub /chatter std_msgs/String "data: 'Hello, ROS2'"

이 명령어는 /chatter 토픽에 "Hello, ROS2"라는 메시지를 전송하며, 이 메시지는 /chatter 토픽을 구독하는 모든 노드에 전달된다.

5. 서비스 및 액션 사용

ROS2에서는 토픽 외에도 서비스(service)와 액션(action)을 통해 노드 간 통신을 수행할 수 있다. 서비스는 요청(request)과 응답(response)으로 구성된 통신 모델을 사용하며, 액션은 장시간의 비동기 작업을 처리할 때 사용된다.

서비스 목록 확인

현재 시스템에서 실행 중인 모든 서비스를 확인하려면 다음 명령어를 사용할 수 있다.

ros2 service list

이 명령어는 시스템에서 활성화된 모든 서비스를 나열하며, 각각의 서비스에 대해 요청 및 응답을 처리할 수 있다.

서비스 호출

특정 서비스에 요청을 보내고 응답을 받기 위해서는 ros2 service call 명령어를 사용한다. 예를 들어, /add_two_ints 서비스에 두 개의 정수를 더하는 요청을 보내려면 다음과 같이 입력한다.

ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 2, b: 3}"

이 명령어는 /add_two_ints 서비스에 {a: 2, b: 3} 요청을 보내고, 결과로 더한 값을 응답으로 받는다.

액션 확인 및 실행

액션은 서비스와 비슷하지만, 장시간의 작업을 수행할 때 사용되며 중간 진행 상황을 반환할 수 있다. 현재 시스템에서 실행 중인 모든 액션을 확인하려면 다음 명령어를 사용할 수 있다.

ros2 action list

특정 액션을 실행하고 중간 상태를 확인하거나 결과를 받으려면, ros2 action send_goal 명령어를 사용할 수 있다.

ros2 action send_goal <액션 이름> <액션 타입> "목표 데이터"

6. 로그 확인 및 디버깅

ROS2 시스템에서 발생하는 로그 메시지를 확인하는 것은 매우 중요하다. 로그는 시스템의 상태나 오류를 추적하고 문제를 해결하는 데 유용하다.

로그 레벨 설정

노드에서 발생하는 로그의 레벨을 설정하여, 디버깅 정보를 더욱 세밀하게 제어할 수 있다. 로그 레벨은 DEBUG, INFO, WARN, ERROR, FATAL 등으로 나뉘며, 필요에 따라 노드의 로그 레벨을 조정할 수 있다.

로그 레벨을 설정하려면 다음 명령어를 사용한다.

ros2 run <패키지 이름> <노드 이름> --ros-args --log-level DEBUG

이 명령어는 지정한 노드를 DEBUG 레벨로 실행하며, 더욱 자세한 디버깅 정보를 제공한다.

ros2 로그 확인

ROS2 로그 파일은 일반적으로 ~/.ros/log 디렉토리에 저장된다. 로그 파일을 열어 시스템에서 발생한 모든 로그 메시지를 확인할 수 있다. 로그 파일은 자동으로 관리되며, 일정 기간이 지나면 오래된 로그는 삭제된다.

ROS2 패키지 생성 및 구조

ROS2에서는 사용자 정의 패키지를 생성하여 로봇 애플리케이션을 개발할 수 있다. 패키지는 ROS2에서 기능의 단위이며, 노드, 메시지 타입, 서비스 등을 포함할 수 있다.

1. 패키지 생성

새로운 ROS2 패키지를 생성하려면 ros2 pkg create 명령어를 사용한다.

ros2 pkg create <패키지 이름> --build-type ament_cmake

예를 들어, my_robot_pkg라는 이름의 패키지를 생성하려면 다음과 같이 입력한다.

ros2 pkg create my_robot_pkg --build-type ament_cmake

이 명령어는 기본적인 패키지 구조를 생성하며, src, include, CMakeLists.txt, package.xml 등의 파일이 포함된다.

2. 패키지 구조

ROS2 패키지는 다음과 같은 기본 구조를 갖는다.

my_robot_pkg/
├── CMakeLists.txt
├── package.xml
├── src/
└── include/

패키지를 생성한 후, 노드 파일을 작성하고 colcon을 사용하여 패키지를 빌드할 수 있다.