Link
Background
workspace는 ROS2 패키지를 담아두는 폴더다. ROS2를 사용하기 전에 ROS2 environment를 먼저 sourcing해두는 작업이 필요하고 이 작업이 잘 끝나야 workspace에서 다양한 ROS2 패키지들을 사용할 수 있다.
workspace 하나만 ROS2 environment 위에서 sourcing 하면서 쓸 수 있는게 아니라, 제2의 workspace를 첫번째 workspace 위에 overlay 형태로 sourcing할 수도 있다. 이 경우, 첫번째 workspace를 수정하고 다시 sourcing할 필요없이 사용이 가능하다. 물론 그렇게 쌓을 경우, 첫번째 workspace가 underlay가 되는데 이 workspace가 두번째 workspace가 필요로 하는 의존성을 갖추고 있어야 되겠다. 두번째 workspace에 있는 패키지들은 첫번째 workspace에 있는 패키지를 덮어쓰는 형태가 된다. 이러한 형태는 단순히 2층만 가능한게 아니라 N층도 가능하다.
Prerequisites
- ROS2 설치
- colcon 설치
- git 설치
- turtlesim 설치
- rosdep 설치
Tasks
1. Source ROS2 environment
ROS2 설치가 가장 기본이되는 underlay다. (주의할 점은 underlay가 항상 설치한 ROS2 자체를 의미하는 것은 아니다. 쌓고 쌓는 구조면 다르다.)
ROS2를 설치한 방법에 따라 조금 다를 순 있지만 권장 방식으로 설치를 했다면 다음 커맨드를 통해 환경 (underlay) 준비는 끝난다.
source /opt/ros/foxy/setup.bash
2. Create a new directory
가장 좋은 습관은 workspace를 새로 만들어야 할 때마다 새로운 폴더를 만들어서 관리하는 것이다. 예시에서 드는 이름에 집착할 필욘 없고 사용할 때 헷갈리지 않게 적당한 이름을 지어두면 된다. 일단은 ros2_ws라는 이름을 쓰겠다.
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
src 안에 패키지들을 정리하는 습관도 꼭 지키자.
3. Clone a sample repo
원래라면 직접 코딩한 패키지를 갖고 연습을 해야하겠지만 지금 실력에서는 그게 불가능하니 github에서 ros_tutorials의 코드를 갖고와서 사용하는 식으로 연습해보자. 이 코드는 여태까지 사용했던 turtlesim이 포함된 코드다.
ros2_ws/src 위치까지 들어온 다음 다음 커맨드는 입력한다.
git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
-b argument로 들어가는 string은 ROS2 distro를 명시하는 것인데 설치한 버전이 다르면 변경해줘야 한다.
이제 ros2_ws/src 내에 ros_tutorials이 존재하고 그 안에 turtlesim이 있는 것을 볼 수 있을 것이다. 기본적으로 turtlesim 외에는 내부에 COLCON_IGNORE가 들어있는 상태롤 clone 되었을 거라 나머지들은 무시될 것이다.
4. Resolve dependencies
workspace를 building하기 전에 패키지들의 의존성을 맞춰줄 필요가 있다. 웬만하면 이미 다 맞춰져 있을텐데 습관적으로 매번 확인해주는 것이 좋다. 나중에 의존성 문제 때문에 코드 작업 다 하고 고생하고 싶지 않다면 말이다.
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro foxy -y
ROS2를 source로부터 직접 build해서 설치했다면 약간 차이가 있을 것인데 그것은 홈페이지에 걸려있는 링크를 참고하길 바란다.
만약 의존성 확인이 다 끝나면 다음과 같이 출력될 것이다.
All required rosdeps installed successfully
패키지들은 각각이 갖는 의존성을 package.xml 파일로 알려준다. 이 커맨드는 그 파일 하나 하나를 짚어가면서 빠진 것이 없는지 확인해주는 커맨드이다. 더 궁금하다면 rosdep에 대한 튜토리얼을 따로 보길 추천한다.
5. Build the workspace with colcon
준비가 끝났으니 workspace 위치 (ros2_ws)에서 빌드한다.
colcon build
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
빌드가 끝나면 workspace에 결과물들이 build, install, log에 나누어 저장된 것을 확인해보자.
build install log src
install 폴더는 workspace의 setup file도 들어있고 overlay sourcing할 때 쓰인다. (앞서 설명한 바 있다.)
6. Source the overlay
overlay를 sourcing하기 전에 새로운 터미널을 꼭 열어야 한다. workspace를 만들 때 썼던 터미널 그대로 쓰면 복잡한 이슈가 생길 수 있다. 빌드했던 터미널에서 overlay를 sourcing하거나 overlay를 sourcing한 터미널에서 빌드를 할 경우 복잡한 이슈가 생길 수 있다.
새 터미널에 먼저 ROS2 환경을 sourcing 한다. underlay를 만드는 것이다. 이후 그 위에 overlay를 빌드할 수 있다.
source /opt/ros/foxy/setup.bash
workspace 폴더로 이동한 overlay를 빌드한다.
cd ~/ros2_ws
. install/local_setup.bash
이제 turtlesim 패키지를 overlay로부터 실행할 수 있다.
ros2 run turtlesim turtlesim_node
이게 ROS2 기본 설치 (underlay)에 있는 turtlesim인지 overlay에서 온 turtlesim인지 어떻게 구분할까?
실험해보기 위해 overlay에 있는 turtlesim을 변경해보고 그 변화를 관찰해보자. 다음과 같은 사실을 미리 알아두고 시작한다.
- overlay에 있는 패키지는 underlay와 독립적으로 수정하거나 재빌드하는 것이 가능하다.
- overlay는 underlay보다 상위에 존재해서 우선순위를 갖는다.
7. Modify the overlay
overlay에 있는 turtlesim의 title bar를 바꿔보자. turtle_frame.cpp 파일을 ~/ros2_ws/src/ros_tutorials/turtlesim/src 위치로 옮겨둔 뒤 turtle_fram.cpp 의 코드를 수정한다.
52번째 줄에 setWindowTitle("TurtleSim"); 을 "MyTurtleSim" 으로 변경한다.
첫번째 터미널 (colcon build로 underlay 만들었던 터미널)로 돌아와 다시 build를 해본다.
그리고 거북이 윈도우를 한번 보고 이번엔 두번째 터미널 (overlay를 만들었던 터미널)에서 다시 ros2 run을 해본다.
ros2 run turtlesim turtlesim_node
그러면 두번째가 지난 후에 제목이 바뀌는 것을 볼 수 있다. 즉, overlay에서 띄운 turtlesim 인 것이다.
underlay와 overlay의 윈도우 제목이 이제 다를텐데 보이는 것은 overlay 값인 것을 볼 수 있는데 이것은 overlay가 underlay보다 우선순위가 높다는 것의 예시이기도 하다.
손대지 않은 underlay가 그대로 남아있다는 것을 확인하기 위해 새로운 터미널을 열어 ROS2 installation을 sourcing한 뒤 turtle sim을 다시 실행해봐라. 그러면 아래와 같이 제목이 그대로 일 것이다.
overlay의 변화가 underlay에 아무런 영향을 주지 않는다는 것을 볼 수 있다.
Summary
이번 튜토리얼에서 ROS2 foxy를 underlay로 sourcing하고, 새로운 workspace에서 예제 패키지들을 빌드하여 overlay를 만들어 보았다. overlay는 경로에 추가되어 underlay보다 우선 적용된다. (거북이 예시 처럼)
overlay를 사용하는 것은 적은 수의 패키지로 작업할 때 권장된다. 거대한 workspace에서 모든 것을 한 번에 빌드할 필요없이 적은 수로 나누어 하는게 좋다.
'Knowhow > ROS2' 카테고리의 다른 글
[ROS2 Foxy Tutorial 한글 번역] 13. Creating a package (0) | 2023.02.06 |
---|---|
[ROS2 Foxy Tutorial 한글 번역] 11. Using colcon to build packages (0) | 2023.02.03 |
[ROS2 Foxy Tutorial 한글 번역] 10. Recording and playing back data (0) | 2023.02.03 |
[ROS2 Foxy Tutorial 한글 번역] 9. Launching nodes (0) | 2023.02.03 |
[ROS2 Foxy Tutorial 한글 번역] 8. Using rqt_console to view logs (0) | 2023.02.03 |