ROS2로 개발할 때 자주 듣게 되는 용어 중 하나는 workspace(작업 공간)이다. 이와 관련된 몇가지 실습을 진행하며 개념을 익혀보자.
목표:
tutorial level: 입문
예상 소요시간
약 20분
workspace는 여러 ROS2 package를 담고 있는 디렉토리이다. 보통 ROS2에서 제공하는 패키지를 이용하려면 일단 터미널에서 ROS2 installation workspace를 source 해야한다.
ROS2에서 제공하는 installation workspace이외에도 다른 workspace를 source할 수 있는데 이를 기존의 ROS2 workspace(underlay)에 overlay한다고 한다.
이때 underlay는 overlay의 모든 패키지의 dependencies를 포함하고 있어야한다.
이름에서 처럼 overlay에 있는 패키지들은 underlay에 있는 패키지들을 override하게 되는데 이는 underlay의 패키지를 무효로하고 overlay의 패키지를 우선한다고 생각하면된다.
또한 underlay위의 overlayer, 이의 overlayer, 또 이 위의 overlayer의 형태를 갖을 수 있기도 하다.
쉽게 생각하면 작업공간을 한층 한층 점차 확장 할 수 있다는 의미이다.
이 튜토리얼에서는 ROS2 installation workspace가 underlay로써 역할을 한다. 다만, ROS2 installation workspace가 항상 underlay일 필요는 없다는 것을 참고하자.
Linux OS에서 설치했다면 다음 명령어를 통해 ROS2 installation workspace를 source할 수 있다.
$ source /opt/ros/humble/setup.bash
기본적으로 한 directory당 하나의 workspace를 배정하면 좋다. directory이름은 크게 상관 없지만 해당 workspace의 용도를 가리킬 수 있는 이름으로 해두면 나중에 여러 workspace가 있을 때 "아, 이 workspace는 이 용도였지~"라고 기억 할 수 있게 된다.
이번 실습에서는 ros2_ws라는 workspace를 다음과 같이 만들어 사용하고자 한다.
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src
위의 명령어의 경우 ros2_ws라는 workspace directory 밑에 src라는 directory를 만드는 것을 볼 수 있다.
이때 src는 앞으로 사용될 ROS2 패키지들이 있게될 directory이다.
ros2_ws/src 경로에 위치한 후, 다음 명령어를 통해 humble branch를 복사한다.
$ git clone https://github.com/ros/ros_tutorials.git -b humble
위의 명령어를 실행 시키면 ros_tutorials이라는 repository가 복사되는데 이는 turtlesim 이라는 패키지를 포함하고 있다.
다른 패키지들도 포함되어있지만 COLCON_IGNORE 파일이 포함되어 있어서 빌드시 무시된다는 점을 참고하자.
여태까지 ros2_ws라는 workspace를 만들고, turtlesim이라는 sample package도 복사했다.
그런데 dependency(sample package를 빌드하는데 필요한 다른 패키지등)을 아직 체크하지 않았기 때문에 sample package가 온전히 빌드될 것인지 보장할 수 없다.
그럼 이는 어떻게 확인하고 해결할 수 있을까?
다음 실습에서 배워보자!
우리가 복사한 sample package turtlesim의 dependency는 ROS2를 설치할 때 전부다 설치됐을 수 있지만, 항상 package를 빌드하기전에 확인하는 습관을 만들어 놓으면 좋다.
일단 다음 명령어로 ros2_ws로 이동한 후 rosdep을 이용하여 필요한 ros dependency를 모두 확인 하고 설치하라는 명령어를 실행한다.
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
$ cd ~/ros2_ws
$ rosdep install -i --from-path src --rosdistro humble -y
필요한 dependency가 없다면 설치할 것이고 이미 다 설치됐다면 다음과 같은 메세가 출력될 것이다.
#All required rosdeps installed successfully
간단히 rosdep 명령어의 동작원리를 설명하자면 ros2 package는 package.xml이라는 파일을 포함하고 있는데 rosdep 명령어는 이 파일에 명시된 dependency들을 확인하고 아직 설치되어있지 않다면 설치한다.
package.xml과 rosdep에 대한 좀 더 자세한 설명은 다른 포스트에서 다룰 예정이니 많은 관심 바란다!
dependency까지 해결 했다면 다음 명령어를 통해 ros2_ws를 빌드할 수 있다.
$ cd ~/ros2_ws
$ colcon build
성공적으로 빌드 됐다면 다음과 같은 메세지를 출력하게된다.
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
빌드가 끝나면 ls 명령어를 통해 다음과 같은 build, install, log와 같은 directory가 생성된 것을 확인할 수 있다.
$ cd ~/ros2_ws
$ ls
build install log src
위에서 생성된 install directory는 overlay를 source할 때 필요한 file들이 저장되어있는 곳이다.
build를 진행했던 같은 terminal에서 overlay를 불러오게되면 예기치 못한 문제가 생길 수 있기 때문에, overlay를 불러오기 전에 build했던 terminal과 다른 터미널을 열어줘야 한다.
새로운 terminal에서 기존의 ROS2 환경을 source하면 "underlay"가 되게 되고 이후에 새롭게 build한 환경을 source하게 되면 "underlay"위에 "overlay"가 되게 된다.
이렇게 overlay와 underlay를 만드는 명령어는 다음과 같다.
#ROS2환경을 underlay로 만든다.
$ source /opt/ros/humble/setup.bash
$cd ~/ros2_ws
#ROS2환경 위에 새롭게 빌드한 환경을 overlay로 만든다.
$ source install/local_setup.bash
<참고>
local_setup 과 setup의 차이
이제 드디어 source한 overlay로부터 turtlesim을 실행할 수 있다.
$ ros2 run turtlesim turtlesim_node
그런데 의문점이 하나 있다.
어떻게 지금 실행된 turtlesim이 underlay것이 아니고 overlay에서 실행된 것인지 알 수 있을까?
overlay에 있는 turtlesim을 조금 변형시켜서 변화가 일어나면 overlay의 turtlesim이라는 것을 알 수 있다.
몇가지 실험을 해보자.
이번에는 overlay에 있는 turtlesim을 변경해보자한다. turtlesim을 실행했을 때 윈도우에 있는 타이틀을 변경해보자.
먼저 turtle_frame.cpp파일을 수정하기 위해 올바른 directory로 다음 명령어를 통해 이동하자.
$cd ~/ros2_ws/src/ros_tutorials/turtlesim/src
ls를 해보면 turtle_frame.cpp 파일이 있는데 해당 파일을 열어보자.
$ls
$gedit turtle_frame.cpp
52번째 줄을 보면
setWindowTitle("TurtleSim");
이라는 함수가 있는데, "TurtleSim"을 "MyTurtleSim"으로 바꿔보자.
그다음 colcon build를 했던 터미널로 돌아와 다시 colcon build를 실행한다.
$colcon build
빌드를 끝마쳤다면 빌드에 사용한 터미널이 아닌 overlay를 source한 두번째 터미널로 와서 turtlesim을 실행한다.
$ros2 run turtlesim turtlesim_node
다음과 같이 turtlesim 창에서 "MyTurtleSim"이라는 타이틀을 확인할 수 있을 것이다.
overlay와 underlay에 대한 실험을 하나해보자.
새로운 터미널을 열어서 ROS2 installation 작업환경만 source해보자.
$source /opt/ros/humble/setup.bash
그 후 turtlesim을 실행하게 되면 다음과 같은 창이 뜬다.
왜 "MyTurtleSim"이 아닐까?
이는 overlay와 underlay의 개념을 생각해보면 알 수 있다.
"MyTurtleSim"가 뜨는 terminal의 작업환경에서는 우리의 작업공간이 overlay이기 때문에 underlay에 있는 turtlesim보다 우선순위로 여겨졌기 때문에 "TurtleSim"대신 "MyTurtleSim"이 창 타이틀에 표시되는 것이다.
반대로 ROS2 installation 작업공간만 source한 경우 해당 작업공간에 있는 turtlesim이 최우선적으로 적용되게 된다.
또한 이는 overlay에 있는 것을 작업한다고 underlay에 있는 같은 이름의 node 또는 package에 아무 영향이 없다는 것을 의미한다.
이번시간에는 작업공간에 대한 underlay와 overlay에 대해 배웠다.
overlay는 underlay보다 더 높은 우선순위를 있는 것을 위의 예제를 통해 배웠다.
또한 overlay 작업공간을 이용하면 기존의 작업공간과 독립적으로 작업할 수 있기 때문에 기능 단위로 작업공간을 생성하는 것을 추천한다.
이런 습관을 들이면 한 작업공간에 수많은 pakcage들이 있는 것을 예방할 수 있어서 관리차원에서 수월하다.
다음시간에는 pakcage를 만드는 실습을 해보도록 하겠다.
오늘도 여기까지 온 스스로를 칭찬해주자!
질문하고 싶거나 인공지능 & 로봇 개발에 대해 다뤄줬으면 하는 주제를 댓글로 남겨주기 바란다~!
문의메일: irobou0915@gmail.com
오픈톡 문의: https://open.kakao.com/o/sXMqcQAf
IRoboU 유튜브 채널: 링크텍스트
참고 문헌: 링크텍스트
엉엉 생각없이 복붙하다가 select package 안했네요 ㅠ