로봇 운영 체제(ROS)는 로봇 소프트웨어의 생태계를 구성하는 핵심 요소로, 다양한 패키지를 통해 로봇의 기능을 확장하고 저장할 수 있는 구조를 제공합니다. ROS 패키지를 만드는 과정은 처음에는 복잡하게 느껴질 수 있지만, 기초적인 이해와 단계적인 접근을 통해 누구나 쉽게 배울 수 있어요. 이번 포스트에서는 ROS 패키지를 만드는 방법을 단계별로 설명하고, 각 단계에서 주의해야 할 점과 유용한 팁을 제공하겠습니다. 특히, ROS 1과 ROS 2의 차이점도 함께 설명하여 다양한 환경에서의 패키지 개발 능력을 키울 수 있도록 돕겠습니다.
1. ROS 패키지의 이해
ROS 패키지란 무엇인가?
우선, ROS 패키지에 대해 이해하는 것이 중요해요. 패키지는 ROS에서 개발되는 소프트웨어를 논리적으로 묶어 놓은 것으로, 여러 파일, 라이브러리, 실행 파일 등을 포함하고 있습니다. 이렇게 패키지를 구성하는 이유는 소프트웨어를 모듈화하여 관리하기 쉽게 만들기 위해서예요. ROS 생태계에서 패키지는 정말 중요한 역할을 하며, 다양한 기능과 라이브러리를 통해 로봇의 동작을 확장할 수 있도록 도와줍니다.
패키지 구조 및 구성 요소
패키지는 기본적으로 특정한 디렉토리 구조를 가지고 있어요. 일반적인 구조는 다음과 같답니다:
- src: 소스 코드 파일이 위치하는 곳
- launch: 여러 노드를 동시에 실행하기 위한 launch 파일이 위치하는 곳
- msg: 커스텀 메시지 파일이 위치하는 곳
- srv: 서비스 파일이 위치하는 곳
그리고 CMakeLists.txt와 package.xml 파일이 필수로 포함되어야 해요. CMakeLists.txt는 패키지를 빌드하는 데 필요한 정보를 담고 있고, package.xml은 패키지 메타데이터를 정의하는 파일이에요. 각각의 기능과 중요성을 잘 이해하고 있으면, 패키지를 만들 때 큰 도움이 될 거예요.
2. ROS 패키지 생성하기
ROS 1에서의 패키지 생성
이제 본격적으로 패키지를 생성해볼까요? ROS 1에서는 catkin_create_pkg 명령어를 사용해 패키지를 만들 수 있어요. 터미널을 열고 해당 명령어를 입력하면 되는데, 예를 들어 ‘my_package’라는 이름의 패키지를 생성하고, 의존성으로 std_msgs를 추가하고 싶다면 다음과 같이 입력하면 됩니다:
catkin_create_pkg my_package std_msgs
이렇게 하면 my_package라는 폴더가 생성되고 그 안에 필요한 파일들이 생성됩니다. 이 과정에서 의존성 패키지를 추가하는 것도 잊지 마세요. 의존성 설정이 잘 되어 있어야 나중에 패키지를 빌드할 때 오류가 발생하지 않아요.
ROS 2에서의 패키지 생성
ROS 2에서는 ros2 pkg create 명령어를 사용해 패키지를 생성할 수 있어요. 이 명령어를 사용할 때는 빌드 유형도 선택해야 하니, 예를 들어 ament_cmake를 선택하고 싶다면 아래와 같이 입력하면 돼요:
ros2 pkg create --build-type ament_cmake my_package
이렇게 생성한 패키지 디렉토리로 이동하여 필요한 파일들을 추가적으로 설정할 수 있어요. ROS 2에서는 다양한 빌드 유형이 있으니, 원하는 유형에 맞게 선택해주면 좋겠어요.
3. 패키지 빌드 및 노드 작성
패키지 빌드 과정
패키지를 생성한 후에는 패키지 빌드를 해야 해요. ROS 1에서는 catkin_make 명령어를 사용하고, ROS 2에서는 colcon build 명령어를 사용해요. 빌드를 진행하기 전에 항상 작업 공간으로 이동한 후 명령어를 입력해야 해요. 예를 들어:
cd ~/catkin_ws
catkin_make
이렇게 빌드를 진행하면, 패키지에 포함된 모든 소스 파일이 컴파일되어 실행 가능한 파일로 만들어져요. 빌드 과정에서 오류가 발생할 수 있으니, 발생한 오류를 잘 살펴보고 해결 방법을 찾아야 해요. 보통은 의존성 문제나 파일 경로 오류가 많으니, 자주 확인해보세요.
ROS 노드 작성
이제 ROS 노드를 작성해볼 차례예요. 퍼블리셔와 서브스크라이버 노드를 작성할 수 있는데, Python을 사용한 예제를 보여드릴게요. 아래의 코드는 간단한 퍼블리셔 노드의 예시예요:
import rospy
from std_msgs.msg import String
def publisher():
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
이 코드를 작성한 후, 해당 파일에 실행 권한을 부여하고 실행하면 퍼블리셔 노드가 동작하게 돼요. 노드 실행 방법은 각 터미널에서 rosrun 명령어를 사용하면 되니 참고하세요!
4. Launch 파일 사용하기
Launch 파일의 필요성
여러 노드를 동시에 실행하고 싶을 때는 launch 파일을 사용해야 해요. Launch 파일은 XML 형식으로 작성되며, 여러 노드를 한꺼번에 실행할 수 있도록 도와줍니다. 예를 들어, 아래와 같이 기본적인 launch 파일을 작성할 수 있어요:
<launch>
<node pkg="my_package" type="pub.py" name="pub_node" />
<node pkg="my_package" type="sub.py" name="sub_node" />
</launch>
이렇게 작성한 후, roslaunch 명령어로 실행하면 두 개의 노드가 동시에 시작돼요. launch 파일의 활용을 통해 훨씬 더 효율적으로 작업할 수 있답니다!
5. 커스텀 메시지 및 서비스 만들기
커스텀 메시지 정의
ROS에서 제공하는 기본 메시지로는 부족할 때, 커스텀 메시지를 만들어 사용할 수 있어요. msg 폴더를 생성하고, 원하는 메시지 파일을 작성하면 됩니다. 예를 들어, MyMessage.msg라는 파일을 만들어서 아래와 같이 작성할 수 있어요:
string data
int32 number
이후에는 CMakeLists.txt와 package.xml 파일을 수정하여 이 메시지를 사용할 수 있도록 설정해줘야 해요. 이렇게 커스텀 메시지를 정의해두면, 다양한 노드 간의 데이터 통신에 유용하게 활용할 수 있어요.
서비스 및 액션 정의
ROS에서는 서비스와 액션도 정의할 수 있어요. 서비스는 요청과 응답의 형태로 작동하고, 액션은 긴 프로세스에 대해 피드백을 제공하는 방식으로 작동합니다. srv 폴더를 만들어 서비스 파일을 작성한 후, 아래와 같이 간단한 서비스 노드를 구현해볼 수 있어요:
import rospy
from my_package.srv import MyService, MyServiceResponse
def handle_service(req):
return MyServiceResponse(req.data + 1)
def service_node():
rospy.init_node('service_node')
s = rospy.Service('my_service', MyService, handle_service)
rospy.spin()
이런 식으로 노드를 작성하면, 간단한 서비스도 구현할 수 있답니다!
6. 패키지 배포 및 관리
패키지 배포 전략
자신이 만든 패키지를 다른 사람과 공유하고 싶다면, GitHub와 같은 플랫폼을 이용해 소스 코드를 올릴 수 있어요. 이렇게 배포할 때는 버전 관리도 중요해요. Git을 활용하면 패키지의 버전을 쉽게 관리할 수 있으니, 적극 활용해보세요.
패키지 문서화
패키지를 배포할 때는 README.md 파일을 작성하는 것이 중요해요. 패키지의 설명, 설치 방법, 사용 예제 등을 자세히 적어두면 다른 사용자들이 패키지를 쉽게 이해하고 사용할 수 있어요. 또한, 사용자 가이드와 튜토리얼을 작성해두면 더욱 좋답니다!
결론
ROS 패키지를 만드는 과정은 단순히 소프트웨어를 개발하는 것을 넘어, 로봇의 기능을 극대화하고 다양한 응용 프로그램을 가능하게 하는 중요한 단계예요. 이번 포스트에서 소개한 내용을 바탕으로, 여러분이 실습을 통해 자신만의 패키지를 만들어보기를 바랍니다. ROS의 매력을 느끼고, 로봇 소프트웨어 개발의 세계로 한 걸음 더 나아갈 수 있는 기회를 제공하는 것이 이 글의 목표예요. 앞으로도 ROS 커뮤니티와 함께 성장해 나가길 바라요!