카테고리 없음

ROS로 로봇 프로그래밍 첫걸음 내딛기

issuefeed1 2025. 4. 24. 01:15

ROS 코드 샘플로 시작하기

서론

로봇 운영 시스템(ROS)은 로봇 소프트웨어 개발을 위한 오픈 소스 프레임워크입니다. 이 시스템은 로봇 응용 프로그램의 개발을 단순화하고 효율화하는 데 도움을 줍니다. ROS는 다양한 패키지를 통해 확장성이 뛰어나며, 여러 사용자가 공동으로 작업할 수 있는 환경을 제공합니다. 본 글에서는 ROS를 처음 접하는 초보자를 위해 기본적인 코드 샘플과 함께 ROS의 개념 및 사용 방법을 설명하고자 합니다.

ROS란 무엇인가?

  • ROS는 로봇 소프트웨어 플랫폼으로서, 다양한 기능과 모듈을 제공합니다.
  • 주요 목표는 로봇 시스템의 재사용성을 높이고, 로봇 소프트웨어의 개발을 용이하게 하는 것입니다.
  • ROS는 개발자들 사이의 협업을 촉진하여 다양한 로봇 응용 프로그램을 지원합니다.

ROS의 특징

  • 모듈화: 각 기능이 별도의 패키지로 구성되어 있어 필요에 따라 추가하거나 수정할 수 있습니다.
  • 분산 시스템: 여러 기기가 네트워크를 통해 구성 요소를 공유하며, 기본적으로 클라이언트-서버 구조로 이루어져 있습니다.
  • 오픈 소스: 누구나 자유롭게 사용하고 수정할 수 있어 다양한 개발자들이 이를 활용할 수 있습니다.

ROS 설치 및 환경 설정

ROS 설치

ROS를 사용하기 위해서는 먼저 시스템에 설치해야 합니다. 대부분의 사용자들은 Ubuntu와 같은 리눅스 기반 운영 체제를 사용합니다. ROS의 설치 방법은 다음과 같습니다:

  • Ubuntu를 설치합니다.
  • 다음 명령어로 ROS를 설치합니다:
    • sudo apt update
    • sudo apt install ros-noetic-desktop-full

여기서 'noetic'은 ROS의 특정 배포판을 의미합니다. 적절한 버전을 선택해야 합니다.

환경 변수 설정

ROS를 설치한 후, 사용자의 환경 변수를 설정해야 합니다. 이는 새로운 터미널 세션에서 ROS를 사용할 수 있도록 도와줍니다. 다음 명령어를 실행합니다:

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

ROS 패키지의 구조

패키지 구성요소

ROS의 패키지는 특정 기능을 수행하는 코드와 리소스를 포함하고 있습니다. 일반적으로 패키지는 다음과 같은 구조를 갖습니다:

구성요소 설명
src 소스 코드 파일이 포함됩니다.
launch 노드를 실행하기 위한.launch 파일이 포함됩니다.
msg 고유 메시지 형식이 정의됩니다.
srv 서비스 정의가 포함됩니다.

패키지 작성

새로운 패키지를 작성하기 위해서는 다음과 같은 명령어를 사용합니다:

roscreate-pkg <패키지 이름> <의존성>

여기서 <패키지 이름>은 사용자 정의 패키지의 이름이며, <의존성>은 사용하는 라이브러리나 패키지를 명시합니다.

기본적인 ROS 코드 샘플

퍼블리셔 및 서브스크라이버 예제

ROS에서 퍼블리셔와 서브스크라이버는 메시지를 송수신하는 기본 단위입니다. 다음 코드 샘플은 퍼블리셔와 서브스크라이버의 간단한 예제를 보여줍니다.

퍼블리셔 코드

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");
    ros::NodeHandle n;
    ros::Publisher chatterpub = n.advertise<stdmsgs::String>("chatter", 1000);

    ros::Rate loop_rate(10);
    while (ros::ok())
    {
        std_msgs::String msg;
        msg.data = "안녕하세요, ROS!";

        chatter_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

서브스크라이버 코드

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
    ROSINFO("수신 메시지: [%s]", msg->data.cstr());
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "listener");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    ros::spin();
    return 0;
}

코드 설명

위 코드는 퍼블리셔와 서브스크라이버가 서로 메시지를 송수신하는 간단한 예제입니다. 퍼블리셔는 "chatter"라는 주제로 문자열 메시지를 전송하고, 서브스크라이버는 해당 메시지를 수신하여 출력합니다.

ROS의 노드와 실행

노드란 무엇인가?

ROS에서 노드는 하나의 실행 가능한 프로그램으로, ROS 네트워크 상에서 특정 작업을 수행합니다. 각 노드는 서로 다른 기능을 맡을 수 있으며, 메시지를 통해 서로 통신합니다.

노드 실행 방법

노드를 실행하려면 터미널에서 다음 명령어를 사용합니다:

  • rosrun <패키지 이름> <노드 이름>

로직의 분리

각 노드는 특정 기능을 수행하므로, 복잡한 로직 또한 여러 노드로 분리하여 관리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 높입니다.

결론

ROS는 로봇 소프트웨어 개발을 위해 많은 기능과 도구를 제공합니다. 본 글에서는 ROS의 기본 개념, 설치 방법, 그리고 간단한 코드 샘플에 대해 알아보았습니다. 이러한 기초가 마련되면, 복잡한 로봇 응용 프로그램으로 나아갈 수 있는 발판이 될 것입니다. ROS는 커뮤니티의 도움을 받을 수 있어 개인의 발전에 큰 기여를 하며, 다양한 앱과 패키지를 통해 더욱 발전할 수 있습니다. 초보자 여러분이 이 글을 통해 ROS의 세계에 첫 발을 내딛길 바랍니다.