ROS2를 이용해 로봇 개발을 하다보면 package라는 용어를 많이 접하게 된다.
이 package는 무엇을 의미할까?
ROS2에서 packge란 노드, 라이브러리, 런치 파일 및 다른 여러 정보,파일 등을 하나로 묶는 구조라고 생각할 수 있다.
예를 들어 4개 바퀴 달린 로봇이 자율주행하는 기능을 실행하는 "auto_driving"이라는 package가 있다고 가정해보자.
이 package내에는 길 찾는 node, 바퀴를 제어하는 node등이 있을 수 있다.
또한 이 node들이 동작하기 위해 어떤 기능들을 모아놓은 라이브러리들이 있을 수 있다.
더불어 node를 실행하기 위해 런치파일들이 작성되어 있을 수 있다.
이 처럼 큰 기능(또는 프로그램)을 수행하기 위해 필요한 정보 및 작은 기능들이 모여있는 구조를 package라고 한다.
다소 추상적이므로 앞으로 개발하면서 차차 알아가면 되기 때문에 지금 와닿지 않아도 크게 걱정하지 않아도 된다!
일단 큰 기능을 위해 작은 기능을 모아놓은 구조 정도로 받아드리고 넘어가자.
그렇다면 이제 이런 package를 만들기 위해 필요한 개념들을 하나씩 배워보자.
이번엔 colcon으로 ROS2 작업공간을 구성하는 것부터 배워보겠다.
Let's go!
목표
colcon을 이용해 ROS2 workspace(작업공간)을 만든다.
예상 소요시간
20분 내외
colcon은 Concept of Libraries for Compilers Installation의 약자이다. Concept의 CO, Libraries의 L, Compilers의 CO, Installation의 N을 따서 만들었다.
colcon은 ROS2와 관련된 pakcage를 관리하는데 사용되는 도구인데, colcon을 이용하면 ROS2 작업공간을 설정하고 패키지 빌드할 수 있고, 패키지의 의존성 관리, 패키지 설치, 런치 파일 관리등 다양항 작업들을 주행 할 수 있다.
지금은 어려울 수 있으니, 그냥 colcon을 "아 패키지를 만들 때 사용되는 구나" 정도로 받아드리고 넘어가면 되겠다.
colcon을 사용하기 위해선 설치를 먼저 해야한다.
다음과 같은 명령어를 터미널에 입력한다.
sudo apt install python3-colcon-common-extensions
ROS2의 작업 공간(폴더와 파일들로 이루어져있다고 생각하면 된다)은 다소 특이한 구조를 따른다.
ROS2 작업공간 폴더이름을 "ros2_colcon_practice_ws"라고 이름 짓게 되면 이 폴더 안에는 "src"라는 폴더를 갖고 있기 마련이다.
예시)
ros2_colcon_practice_ws
-src
이때 "src"는 ROS2 package의 소스코드를 갖는 폴더이다. 최초 작업공간을 만들었을 때 이 src폴더는 아무 것도 없다.
colcon은 "out of source builds"(소스코드를 빌드하여 얻어진 실행파일, 라이브러리등의 결과물을 분리하여 관리하는 방식. 즉 다른 폴더에 결과물이 저장된다.)을 사용한다.
따라서 colcon으로 build하게 되면 "build", "install", "log"와 같은 폴더들이 생기게 된다.
ros2_colcon_practice_ws
-src
-build
-install
-log
생성되는 각 폴더는 다음과 같은 역할을 담당한다.
build: intermediate 파일들이 저장되는 경로이다. 작업 공간내에 각 package(CMake 가 있는 공간)에 해당하는 폴더들이 생성된다. 이 파일들은 라이브러리나 최종 실행 파일들을 생성하는데 필요하다.
install: 각 package들이 설치되는 경로이다. default옵션은 package별로 다른 경로에 생성된다. lib나 share같은 결과물들이 들어 있다.
log: colcon이 일하는 동안 각종 log들을 저장하는 경로이다.
어느 정도 작업공간에 대한 용어를 알아보았으니 간단한 실습을 진행해보자.
사실 지금 단계에서 각 폴더에 무엇이 담겨있는지 몰라도 크게 상관 없다.
mkdir -p ~/ros2_ws
cd ~/ros2_ws
git clone https://github.com/ros2/examples src/examples -b humble
git clone이 끝났다면 다음과 같은 폴더 및 파일 구조를 갖을 것이다.
ros2_ws
└── src
└── examples
├── CONTRIBUTING.md
├── LICENSE
├── rclcpp
├── rclpy
└── README.md
4 directories, 3 files
source an underlay와 overlay
-source an underaly: 우리가 ROS2를 설치했을 때 ROS2의 기본 작업환경을 .bashrc 파일에 "source /opt/ros/humble/setup.bash" 형태로 source했던 것을 일반적으로 "underlay를 source했다"고 한다.
이렇게 작업환경들을 source하는 이유는 서로 의존성이 있을 수 있는 파일들에게 "야 너가 지금 쓰려고 하는거 저기 다른 작업환경에 있어"라는 식으로 알려줄 수 있기 때문이다.
작업환경을 build하기 위해선 "colcon build"라는 명령어를 사용할 수 있다.
ros2_ws 경로로 이동하여 다음 명령어를 입력하자.
cd ~/ros2_ws
colcon build --symlink-install
근데 symlink-install이라는 인자가 보이는데 뭐하는 것일까? 이는 Python같은 compile하지 않는 파일들을 단순히 수정하므로써 컴파일 없이 변경내용이 적용 될 수 있도록 해준다.
build가 끝나면 다름과 같이 폴더(경로)들이 생성된다.
ros2_ws
├── build
├── install
├── log
└── src
4 directories, 0 files
colcon을 이용하면 방금 build한 package들을 테스트 해볼 수 있다.
colcon test
test가 완료 됐다면 다음과 같은 메세지를 확인할 수 있다.
아까 말했듯이 install경로에는 package를 build한 결과물 lib, share, 실행파일등이 담겨있다. 실행 파일 및 library를 사용하려면 이들을 path및 library path에 포함시켜야 한다.
이렇게 포함 시키는 것을 작업환경을 source한다고 한다.
이렇게 source하기 위해서는 install폴더에 있는 setup.bash를 이용하면 된다. 이 setup.bash는 colcon으로 package를 build할 때 생성된다.
다음 명령어를 터미널에 입력한다.
source install/setup.bash
사용하고자 하는 라이브러리 및 실행 파일들이 담겨 있는 작업환경을 source했다면 이제 실행 실습을 해보자.
다음과 같은 명령어로 "examples_rclcpp_minimal_subscriber"라는 package에 있는 "subscriber_member_function" node를 실행해보자.
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
그 다음 새로운 터미널을 열고 작업환경을 source한다음 다음 publisher_member_function이라는 node를 실행해보자.
cd ~/ros2_ws
source install/setup.bash
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
그러면 다음과 같이 publisher node에서 message를 publish하고, subscriber node에서 해당 message를 subscribe하는 것을 다음 이미지와 같이 확인 할 수 있다.
ros2 pkg create 명령어를 사용하면 새로운 기본 ros2 package를 생성할 수 있다.
보통 새로운 package는 작업공간 폴더 밑에 있는 src안에서 만들어지는게 통상적이다.
다음과 같이 만들어보자
cd ~/ros2_ws/src
ros2 pkg create my_package_name
cd my_package_name
ls
그러면 다음과 같이 파일이 형성 된 것을 볼 수 있다.
이렇게 생성된 새로운 패키지(지금은 아주 기본적인 파일 및 폴더들만 있고 아무 기능이 구현되있지 않다)는 앞서 배운 것 처럼 colcon build --symlink-install로 build가능하다.
build하게 되면 다음과 같이 패키지 수가 22개에서 23개로 증가한 것을 확인 할 수 있다.
여태까지 colcon을 이용해 package를 build하는 법을 알아보았다.
이번 블로그에서는 git clone을 통해 남이 이미 만들어놓은 package를 build했고 마지막에 아주 기본 구조만 갖춘 나만의 package를 만들어 build해보았다.
나중에 package내에 기능들(topic, service 등)을 구현해서 build해볼 예정이니 지금은 명령어가 이런게 있구나~ 하고 넘어가면된다.
오늘도 여기까지 온 스스로를 칭찬해주자!
질문하고 싶거나 인공지능 & 로봇 개발에 대해 다뤄줬으면 하는 주제를 댓글로 남겨주기 바란다~!
문의메일: irobou0915@gmail.com
오픈톡 문의: https://open.kakao.com/o/sXMqcQAf
IRoboU 유튜브 채널: https://www.youtube.com/channel/UC2-d99PrBwJy15MjPa32zYg
참고 문헌: https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Colcon-Tutorial.html