ROS2: Node: 구현

Node 생성

ROS2에서 Node를 생성하는 첫 번째 단계는 rclcpp 라이브러리를 사용하여 Node 클래스를 정의하는 것이다. ROS2의 Node는 독립적인 실행 단위로, 네트워크 상에서 통신하는 프로세스이다. Node 클래스는 일반적으로 rclcpp::Node를 상속받아 구현되며, Node 이름을 생성자에서 지정한다. Node의 생성은 ROS2의 Node 라이프사이클에 따라 관리되며, Node가 생성되면 자동으로 ROS2의 네트워크에 등록된다.

#include "rclcpp/rclcpp.hpp"

class MyNode : public rclcpp::Node
{
public:
    MyNode() : Node("my_node_name")
    {
        RCLCPP_INFO(this->get_logger(), "Node has been created");
    }
};

콜백 함수와 멀티스레딩

Node는 일반적으로 콜백 함수를 통해 데이터를 수신하거나 주기적으로 특정 작업을 수행한다. ROS2에서는 다양한 콜백 방식이 지원되며, rclcpp::executors를 사용하여 콜백을 처리하는 스레드를 제어할 수 있다. 기본 실행기는 단일 스레드를 사용하지만, 멀티스레딩이 필요한 경우 rclcpp::MultiThreadedExecutor를 사용할 수 있다.

콜백 함수는 Node 내부에서 정의되며, ROS2 메시지를 주고받기 위해 Subscription 또는 Service 등을 통해 연결된다.

void timer_callback()
{
    RCLCPP_INFO(this->get_logger(), "Timer callback triggered");
}

멀티스레딩을 구현할 때는 주의해야 할 점이 많다. 예를 들어, 각 스레드에서 데이터 경합이 발생하지 않도록 동기화 메커니즘을 사용하는 것이 중요하다. ROS2는 기본적으로 std::shared_ptr을 사용하여 메시지 데이터를 관리하며, 이를 통해 스레드 간의 안전한 데이터 공유를 보장한다.

토픽과 서비스의 사용

Node는 PublisherSubscription을 통해 토픽 기반의 통신을 구현할 수 있다. Publisher는 데이터를 발행하고, Subscription은 데이터를 수신한다. 이는 ROS2에서 가장 기본적인 통신 패턴이다. 서비스는 요청-응답 패턴으로 동작하며, Node 간의 동기화된 통신을 가능하게 한다.

퍼블리셔의 구현

퍼블리셔는 create_publisher 메서드를 통해 생성되며, 주기적으로 데이터를 발행한다. 퍼블리셔는 메시지의 타입과 버퍼 크기를 지정해야 한다.

서브스크립션의 구현

서브스크립션은 create_subscription 메서드를 통해 구현되며, 콜백 함수를 등록하여 데이터를 수신한다.

서비스의 구현

서비스는 Node가 특정 요청에 대해 응답을 제공할 수 있게 한다. 서비스는 create_service 메서드를 사용하여 정의된다.

서비스 콜백 함수는 클라이언트의 요청을 처리한 후, 응답을 반환한다.

매개변수 관리

Node에서 매개변수를 관리하는 것은 매우 중요한 작업이다. 매개변수는 Node의 동작을 동적으로 제어할 수 있게 하며, declare_parameterget_parameter 메서드를 사용하여 관리된다. Node는 런타임 중에 매개변수를 선언하고 이를 통해 설정된 값을 사용할 수 있다.

매개변수는 Node 실행 중에 동적으로 업데이트될 수 있으며, 이를 위해 매개변수 이벤트 콜백을 사용할 수도 있다.

QoS 설정

ROS2에서의 QoS (Quality of Service) 설정은 Node 간 통신의 신뢰성과 성능을 조절하는 데 중요한 역할을 한다. QoS는 퍼블리셔와 서브스크립션에 모두 적용되며, 주기적 데이터 손실, 지연, 우선순위 등을 관리할 수 있다.

QoS 설정은 rclcpp::QoS 객체를 사용하여 지정되며, 각 Node의 통신 요구사항에 맞게 조정할 수 있다.

실행 루프와 이벤트 처리

ROS2에서 Node의 실행은 일반적으로 실행 루프(spin)를 통해 이루어진다. 이 루프는 Node가 살아있는 동안 콜백 함수를 지속적으로 호출하여 이벤트를 처리한다. rclcpp::spin 함수는 Node 객체를 인자로 받아 Node의 라이프사이클을 관리한다.

복수의 Node를 관리하는 경우, rclcpp::executors를 사용하여 실행을 제어할 수 있다. 이는 여러 Node를 동시에 실행하거나 특정 Node의 우선순위를 설정하는 등의 고급 기능을 제공한다.


관련 자료:

  • ROS2 공식 문서: https://docs.ros.org/en/foxy/index.html

  • Programming Robots with ROS2 by Morgan Quigley, Brian Gerkey, William D. Smart

  • Mastering ROS for Robotics Programming by Lentin Joseph

Last updated