본문 바로가기

Study Information Technology

ROS 패키지와 라이브러리 개발 및 사용

728x90
반응형

ROS 패키지와 라이브러리 개발 및 사용

개요

로봇 운영 체제(Robot Operating System, ROS)는 로봇 소프트웨어를 개발할 때 필요한 도구와 라이브러리를 제공하는 프레임워크입니다. ROS는 로봇 애플리케이션을 개발하는 데 필수적인 여러 구성 요소를 모듈화하여 재사용성과 확장성을 높입니다. ROS의 핵심 요소 중 하나는 패키지와 라이브러리입니다. 이 글에서는 ROS 패키지와 라이브러리를 개발하고 사용하는 방법을 상세히 설명하겠습니다.

ROS 패키지 및 라이브러리 개요

ROS 패키지

ROS 패키지는 ROS 시스템의 기본 단위입니다. 패키지는 노드, 메시지, 서비스, 파라미터 등 ROS의 모든 구성 요소를 포함할 수 있습니다. 패키지는 로봇 소프트웨어의 기능적 모듈을 구성하며, 다른 패키지와의 의존성 관리, 코드 공유 및 재사용을 용이하게 합니다.

패키지 구조는 다음과 같은 주요 요소로 구성됩니다:

  • src 디렉토리: C++ 또는 Python 소스 코드가 포함됩니다.
  • include 디렉토리: C++ 헤더 파일이 포함됩니다.
  • msg 디렉토리: 사용자 정의 메시지 파일이 포함됩니다.
  • srv 디렉토리: 사용자 정의 서비스 파일이 포함됩니다.
  • launch 디렉토리: ROS launch 파일이 포함됩니다.
  • CMakeLists.txt: CMake 빌드 설정 파일입니다.
  • package.xml: 패키지의 메타데이터 및 의존성을 정의하는 XML 파일입니다.

ROS 라이브러리

ROS 라이브러리는 특정 기능을 수행하는 코드 모듈로, ROS 패키지 내에서 활용될 수 있습니다. 라이브러리는 일반적으로 노드의 기능을 구현하거나, 사용자 정의 메시지 및 서비스를 처리하는 데 사용됩니다. ROS 라이브러리는 C++로 작성되거나 Python으로 작성될 수 있습니다.

ROS 패키지 개발

1. 새로운 패키지 생성

새로운 ROS 패키지를 생성하려면 catkin_create_pkg 명령어를 사용합니다. 이 명령어는 ROS 패키지의 기본 구조를 자동으로 생성합니다. 기본 사용법은 다음과 같습니다:

catkin_create_pkg <패키지_이름> [의존성_패키지_목록]

예를 들어, my_robot이라는 이름의 패키지를 생성하고 roscppstd_msgs 패키지에 의존하는 경우 다음과 같이 입력합니다:

catkin_create_pkg my_robot roscpp std_msgs

이 명령어를 실행하면 my_robot 디렉토리가 생성되고, 그 안에 기본적인 파일과 디렉토리 구조가 설정됩니다.

2. 패키지 구조 이해

생성된 패키지의 기본 구조는 다음과 같습니다:

  • CMakeLists.txt: CMake 빌드 설정을 정의하는 파일입니다. ROS 패키지의 빌드를 관리하며, 패키지의 의존성을 정의하고, 빌드 및 설치 과정에서 필요한 설정을 포함합니다.
  • package.xml: 패키지의 메타데이터를 정의하는 XML 파일입니다. 패키지 이름, 버전, 의존성, 저작권 등의 정보를 포함합니다.
  • src: C++ 또는 Python 소스 코드가 포함됩니다. 노드, 클래스, 기능 등을 구현합니다.
  • msg: 사용자 정의 메시지 정의 파일이 포함됩니다. .msg 확장자를 가진 파일들이 위치합니다.
  • srv: 사용자 정의 서비스 정의 파일이 포함됩니다. .srv 확장자를 가진 파일들이 위치합니다.
  • launch: 노드와 파라미터를 설정하는 launch 파일이 포함됩니다. .launch 확장자를 가진 XML 파일들이 위치합니다.

3. C++ 노드 작성

C++ 노드는 ROS의 핵심 기능을 구현하는 주체입니다. 예를 들어, talker.cpp라는 파일을 작성하여 메시지를 퍼블리시하는 노드를 구현할 수 있습니다. 다음은 기본적인 C++ 노드의 예입니다:

#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 chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

ros::Rate loop_rate(10);

while (ros::ok())
{
std_msgs::String msg;
msg.data = "Hello, ROS!";
chatter_pub.publish(msg);

ros::spinOnce();
loop_rate.sleep();
}

return 0;
}

이 코드는 chatter라는 이름의 토픽에 Hello, ROS!라는 메시지를 퍼블리시합니다.

4. Python 노드 작성

Python 노드는 Python으로 작성된 ROS 노드입니다. Python은 간결하고 직관적인 문법을 제공하므로, 빠른 프로토타이핑에 유리합니다. 다음은 Python으로 작성된 기본적인 노드의 예입니다:

#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
msg = "Hello, ROS!"
rospy.loginfo(msg)
pub.publish(msg)
rate.sleep()

if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass

이 Python 코드는 C++ 예제와 동일하게 chatter 토픽에 메시지를 퍼블리시합니다.

5. 사용자 정의 메시지 및 서비스

ROS에서 사용자 정의 메시지와 서비스는 특별한 요구 사항에 맞게 통신 데이터를 정의할 수 있습니다.

사용자 정의 메시지

메시지를 정의하려면 .msg 파일을 생성하여 필요한 필드를 정의합니다. 예를 들어, CustomMsg.msg 파일을 생성하고 다음과 같이 작성할 수 있습니다:

string name
int32 age

이 파일을 msg 디렉토리에 저장한 후, CMakeLists.txtpackage.xml 파일을 수정하여 메시지를 컴파일할 수 있도록 설정해야 합니다.

사용자 정의 서비스

서비스는 요청과 응답을 정의하는 파일로, .srv 확장자를 가진 파일을 사용합니다. 예를 들어, AddTwoInts.srv라는 파일을 생성하고 다음과 같이 작성할 수 있습니다:

int64 a
int64 b
---
int64 sum

이 파일을 srv 디렉토리에 저장한 후, 서비스 서버와 클라이언트를 구현하여 서비스를 제공하고 요청을 처리할 수 있습니다.

6. 빌드 및 실행

패키지 작성 후, catkin_make 명령어를 사용하여 패키지를 빌드합니다. catkin_makeCMakeLists.txt 파일을 기반으로 빌드를 수행합니다.

cd ~/catkin_ws
catkin_make

빌드가 완료되면, source devel/setup.bash 명령어를 사용하여 환경 변수를 업데이트합니다. 이 후, roscore를 실행한 다음, rosrun 명령어로 노드를 실행할 수 있습니다.

roscore
rosrun my_robot talker

ROS 패키지 및 라이브러리 활용

1. 패키지 의존성 관리

ROS는 패키지 간의 의존성을 명확하게 정의하고 관리하는 데 유용합니다. package.xml 파일에서 패키지의 의존성을 선언하고, CMakeLists.txt 파일에서 의존성을 처리하는 방법을 정의합니다.

패키지의 의존성 예시는 다음과 같습니다:

<depend>roscpp</depend>
<depend>std_msgs</depend>

CMakeLists.txt 파일에서는 find_package 명령어로 패키지 의존성을 설정합니다:

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)

2. 패키지 배포

자신이 개발한 패키지를 배포하려면, 패키지를 rosinstall 또는 rosdep을 사용하여 관리할 수 있습니다. 패키지를 배포하는 과정에서 중요한 점은 다른 사용자들이 패키지를 쉽게 설치하고 사용할 수 있도록 의존성을 명확하게 설정하는 것입니다.

3. 패키지 관리 도구

  • rosdep: 패키지의 의존성을 자동으로 설치해주는 도구입니다. rosdep install 명령어를 사용하여 의존성을 설치할 수 있습니다.
  • rosinstall: 여러 패키지를 한 번에 설치하고 관리할 수 있도록 돕는 도구입니다.
rosdep install --from-paths src --ignore-src -r -y
728x90
반응형