커스텀 메시지 만들기: ROS/ROS2 시스템 확장하기 > 로봇 운영체제(ROS/ROS2) 완전 정복

본문 바로가기
사이트 내 전체검색

로봇 운영체제(ROS/ROS2) 완전 정복

커스텀 메시지 만들기: ROS/ROS2 시스템 확장하기

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 246회 작성일 25-12-30 19:48

본문

커스텀 메시지 만들기: ROS/ROS2 시스템 확장하기

'커스텀 메시지 만들기: ROS/ROS2 시스템 확장하기'라는 표현은 로봇 제작 지식 쌓기, 제어 시스템, 로봇 하드웨어, 운영체제(ROS) 및 알고리즘 개발, 그리고 데이터 관리 및 효율성 향상에 대한 깊은 이해와 관심을 가지신 여러분의 핵심적인 고민을 정확히 담고 있습니다. ROS/ROS2 환경에서 로봇 시스템의 노드들은 **메시지(Message)**를 통해 데이터를 주고받으며 통신합니다. ROS는 다양한 표준 메시지 타입(예: std_msgs/String, geometry_msgs/Twist, sensor_msgs/LaserScan)을 제공하지만, 때로는 로봇의 특정 센서 데이터, 액추에이터 상태, 또는 복잡한 알고리즘의 출력값을 표현하기 위해 기존 메시지로는 부족한 경우가 발생합니다.


이때 필요한 것이 바로 **커스텀 메시지(Custom Message)**를 정의하고 사용하는 것입니다. 커스텀 메시지를 만드는 것은 ROS/ROS2 시스템을 여러분의 특정 로봇이나 애플리케이션에 맞게 확장하는 '맞춤형 통신'을 가능하게 합니다. 이는 데이터 전송의 효율성을 높이고, 코드의 가독성을 향상시키며, 로봇 시스템의 기능을 더욱 유연하게 구현하는 데 필수적인 역량입니다. 함께 커스텀 메시지가 무엇이며, 왜 ROS/ROS2 시스템 확장에 중요한지, ROS1과 ROS2에서 커스텀 메시지를 만드는 방법, 그리고 이를 로봇 개발에 어떻게 활용하는지 자세히 알아보겠습니다!


여러분께서 로봇을 개발할 때, 센서에서 독특한 포맷의 데이터를 읽거나, 로봇 팔의 여러 관절 상태와 그리퍼 상태를 하나의 메시지에 담아 전송하고 싶거나, 특정 알고리즘의 중간 결과를 정형화된 형태로 주고받아야 할 필요가 있습니다. 이때 ROS/ROS2에서 제공하는 표준 메시지 타입만으로는 이러한 요구사항을 모두 충족하기 어렵습니다.


1. 데이터 구조의 불일치: 표준 메시지는 범용적인 데이터 타입을 정의하고 있지만, 특정 로봇의 독자적인 센서나 액추에이터의 복잡한 데이터를 표현하기에는 적합하지 않을 수 있습니다.

2. 비효율적인 통신: 필요한 데이터가 여러 개의 표준 메시지에 분산되어 있으면, 여러 토픽을 구독해야 하므로 통신 효율이 떨어지고 코드가 복잡해집니다.

3. 코드 가독성 저하: 특정 메시지 타입을 여러 개의 기본 데이터 타입으로 분해하여 사용해야 하면 코드의 가독성과 유지보수성이 떨어집니다.

커스텀 메시지는 이러한 문제들을 해결하기 위해 개발자가 직접 메시지의 데이터 타입과 구조를 정의할 수 있게 해주는 기능입니다. 이를 통해 "로봇 애플리케이션에 필요한 데이터 형식"을 정확하게 만들어 "ROS 시스템의 노드 간 통신을 효율적으로 관리"할 수 있습니다.


1. 커스텀 메시지, 왜 ROS/ROS2 시스템 확장에 중요한가?

1.1. 특정 로봇/애플리케이션 최적화: 여러분이 개발하는 로봇의 고유한 하드웨어(센서, 액추에이터)나 알고리즘에 맞는 최적의 데이터 구조를 정의하여 통신 효율을 극대화합니다.

1.2. 코드의 명확성 및 가독성 향상: 복잡한 데이터를 하나의 커스텀 메시지로 묶어 관리하면, 코드 내에서 데이터를 주고받는 방식이 더욱 명확해지고 가독성이 향상됩니다.

1.3. 유지보수 및 확장성: 시스템의 요구사항 변경 시 메시지 정의 파일(.msg)만 수정하면 되므로, 코드 변경 없이 전체 시스템을 쉽게 업데이트하고 확장할 수 있습니다.

1.4. 시스템 통합 용이성: 여러 노드가 공통의 커스텀 메시지를 사용하면, 개발자들이 데이터 형식을 쉽게 이해하고 통합할 수 있습니다.

2. ROS1에서 커스텀 메시지 만들기 (효율적인 통신의 시작!)

ROS1에서 커스텀 메시지를 만드는 과정은 크게 3단계로 구성됩니다. 


2.1. .msg 파일 정의 (메시지 구조 설계)

패키지 생성: 먼저 커스텀 메시지를 포함할 ROS 패키지를 생성합니다.

cd ~/catkin_ws/src

catkin_create_pkg my_robot_msgs std_msgs roscpp

msg 폴더 생성 및 .msg 파일 작성: 생성된 패키지 디렉토리 (~/catkin_ws/src/my_robot_msgs/) 안에 msg 폴더를 만들고, 그 안에 원하는 메시지 구조를 정의하는 .msg 파일을 작성합니다.

예시: RobotStatus.msg 파일 (로봇의 현재 상태를 나타내는 메시지)

# RobotStatus.msg

std_msgs/Header header

float32 motor_temperature

bool is_error_state

string current_mission

float32[3] current_position # x, y, z

std_msgs/Header는 타임스탬프와 프레임 ID를 포함하는 표준 헤더입니다. 로봇 데이터에 시간 및 좌표계 정보를 부여할 때 필수적입니다.

메시지 타입은 기본 자료형(int8, float32, string 등)과 다른 ROS 메시지 타입(예: std_msgs/Header, geometry_msgs/Point)을 포함할 수 있습니다.

배열도 정의할 수 있습니다. (예: float32[3]).

2.2. package.xml 수정 (의존성 추가)

~/catkin_ws/src/my_robot_msgs/package.xml 파일을 열어 다음 라인을 추가 또는 수정합니다.


xml



<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

message_generation: 빌드 시 .msg 파일을 실제 코드(C++ 헤더, Python 클래스)로 변환하는 도구에 대한 의존성.

message_runtime: 런타임에 메시지를 사용하기 위한 의존성.

2.3. CMakeLists.txt 수정 (빌드 설정)

~/catkin_ws/src/my_robot_msgs/CMakeLists.txt 파일을 열어 다음 라인을 추가 또는 수정합니다.


cmake



# (상단 주석 해제)

find_package(catkin REQUIRED COMPONENTS

  roscpp

  std_msgs

  message_generation # 추가

)


# (주석 해제 및 수정)

add_message_files(

  FILES

  RobotStatus.msg # 여러분의 .msg 파일명

  # BatteryStatus.msg

  # AnotherCustomMessage.msg

)


# (주석 해제)

generate_messages(

  DEPENDENCIES

  std_msgs # .msg 파일에서 사용된 다른 메시지 타입

)


catkin_package(

  # INCLUDE_DIRS include

  # LIBRARIES my_robot_msgs

  CATKIN_DEPENDS roscpp std_msgs message_runtime # message_runtime 추가

  # DEPENDS system_lib

)

2.4. 워크스페이스 빌드

catkin_make 명령어를 사용하여 워크스페이스를 빌드하면, .msg 파일이 C++ 헤더 파일과 Python 클래스 파일로 변환됩니다.


bash



cd ~/catkin_ws

catkin_make

빌드 후에는 source ~/catkin_ws/devel/setup.bash 명령어를 실행하여 새로 생성된 메시지 타입이 ROS 환경에 적용되도록 해야 합니다.


2.5. 노드에서 커스텀 메시지 사용

이제 ROS 노드(C++ 또는 Python)에서 my_robot_msgs/RobotStatus 메시지 타입을 일반 ROS 메시지처럼 사용할 수 있습니다.


cpp



// C++ 노드에서 사용 예시

#include "my_robot_msgs/RobotStatus.h" // 생성된 헤더 파일 포함


// ... 노드 코드 ...

my_robot_msgs::RobotStatus status_msg;

status_msg.header.stamp = ros::Time::now();

status_msg.motor_temperature = 55.6;

// ... 메시지 필드 설정 ...

publisher.publish(status_msg);

3. ROS2에서 커스텀 메시지 만들기 (DDS 기반의 강력한 확장!)

ROS2에서 커스텀 메시지를 만드는 과정은 ROS1과 유사하지만, ament_cmake 또는 ament_python 빌드 시스템을 사용하며, 몇 가지 설정 방식이 다릅니다. 


3.1. .msg 파일 정의 (ROS1과 동일)

패키지 생성: ament_cmake 타입으로 패키지를 생성합니다.

cd ~/ros2_ws/src

ros2 pkg create --build-type ament_cmake my_robot_msgs --dependencies std_msgs rclcpp

msg 폴더 생성 및 .msg 파일 작성: 생성된 패키지 디렉토리 (~/ros2_ws/src/my_robot_msgs/) 안에 msg 폴더를 만들고, 그 안에 원하는 메시지 구조를 정의하는 .msg 파일을 작성합니다. 내용은 ROS1과 동일합니다.

예시: RobotStatus.msg

3.2. package.xml 수정 (의존성 추가)

~/ros2_ws/src/my_robot_msgs/package.xml 파일을 열어 다음 라인을 추가 또는 수정합니다.


xml



<build_depend>rosidl_default_generators</build_depend>

<exec_depend>rosidl_default_runtime</exec_depend>

3.3. CMakeLists.txt 수정 (빌드 설정)

~/ros2_ws/src/my_robot_msgs/CMakeLists.txt 파일을 열어 다음 라인을 추가 또는 수정합니다.


cmake



find_package(ament_cmake REQUIRED)

find_package(rosidl_default_generators REQUIRED)

find_package(std_msgs REQUIRED) # 사용된 다른 메시지 타입


# (추가)

rosidl_generate_interfaces(${PROJECT_NAME}

  "msg/RobotStatus.msg" # 여러분의 .msg 파일명

  # "msg/BatteryStatus.msg"

)


ament_export_dependencies(rosidl_default_runtime) # (추가)


ament_package()

3.4. 워크스페이스 빌드

colcon build 명령어를 사용하여 워크스페이스를 빌드합니다.


bash



cd ~/ros2_ws

colcon build --packages-select my_robot_msgs

빌드 후에는 source install/setup.bash 명령어를 실행하여 새로 생성된 메시지 타입이 ROS2 환경에 적용되도록 해야 합니다.


3.5. 노드에서 커스텀 메시지 사용

이제 ROS2 노드(C++ 또는 Python)에서 my_robot_msgs/msg/RobotStatus 메시지 타입을 일반 ROS2 메시지처럼 사용할 수 있습니다.


python



# Python 노드에서 사용 예시

import rclpy

from rclpy.node import Node

from my_robot_msgs.msg import RobotStatus # 생성된 클래스 임포트


class RobotPublisher(Node):

    def __init__(self):

        super().__init__('robot_status_publisher')

        self.publisher_ = self.create_publisher(RobotStatus, 'robot_status', 10)

        timer_period = 0.5

        self.timer = self.create_timer(timer_period, self.timer_callback)


    def timer_callback(self):

        msg = RobotStatus()

        msg.header.stamp = self.get_clock().now().to_msg()

        msg.motor_temperature = 60.1

        # ... 메시지 필드 설정 ...

        self.publisher_.publish(msg)

        self.get_logger().info(f'Publishing Robot Status')


def main(args=None):

    rclpy.init(args=args)

    node = RobotPublisher()

    rclpy.spin(node)

    node.destroy_node()

    rclpy.shutdown()


if __name__ == '__main__':

    main()

(C++ 노드 사용 예시는 [ROS2-python 기초]custom message 만들고 빌드하기 - velog 의 AddThreeInts::Request처럼 my_robot_msgs::msg::RobotStatus 형태로 사용합니다.)


4. 커스텀 메시지 활용, ROS/ROS2 시스템 확장 팁

4.1. std_msgs/Header 사용: 시간 정보를 포함하는 std_msgs/Header를 커스텀 메시지에 포함시켜 데이터의 유효성을 높이고, RViz와 같은 시각화 도구에서 시간 동기화를 용이하게 합니다.

4.2. 간결하고 명확하게: 필요한 정보만 담아 메시지 구조를 간결하게 유지하고, 필드 이름을 명확하게 정의하여 가독성을 높입니다.

4.3. 표준 메시지 우선: 가능한 경우 먼저 표준 메시지 타입을 사용하는 것을 고려합니다. 표준 메시지로 표현하기 어렵거나 비효율적일 때 커스텀 메시지를 만듭니다.

4.4. 커스텀 서비스 및 액션: 커스텀 메시지를 기반으로 커스텀 서비스(.srv 파일)나 커스텀 액션(.action 파일)을 정의하여 더욱 복잡한 통신 요구사항을 충족시킬 수 있습니다.

4.5. ROS2 QoS 설정: 커스텀 메시지를 사용하는 토픽에도 적절한 QoS 설정을 적용하여 통신의 신뢰성과 효율성을 최적화합니다.

커스텀 메시지 만들기는 로봇 제작 지식 쌓기, 제어 시스템, 로봇 하드웨어, 운영체제(ROS) 및 알고리즘 개발, 그리고 데이터 관리 및 효율성 향상에 대한 깊은 이해와 관심을 가지신 여러분에게 ROS/ROS2 시스템을 여러분의 특정 로봇이나 애플리케이션에 맞게 맞춤형으로 확장하고, 데이터 통신의 효율성과 유연성을 획기적으로 높이는 핵심 기술입니다. 이러한 커스텀 메시지 정의 및 활용법을 완벽하게 마스터하여 여러분이 만들고자 하는 로봇 시스템을 더욱 효율적이고 안정적으로 구현하는 데 큰 기여를 할 것이라고 믿습니다!

댓글목록

등록된 댓글이 없습니다.


회사소개 개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

작크와콩나무
대표:이강복 등록번호:129-30-34337 개인정보관리책임자:이경영

Copyright © https://roboman.co.kr/ All rights reserved.