새 터미널에서 source, 언더레이와 오버레이
분명 빌드했는데 왜 내 패키지를 못 찾을까?
증상
빌드만으로는 터미널이 모릅니다
빌드는 install에 결과를 놓을 뿐, 터미널에 알려 주지는 않습니다. ros2 명령은 터미널에 등록된 곳에서만 패키지를 찾으므로 my_package를 찾지 못합니다.
source
setup.bash가 찾을 곳을 더해 줍니다
source install/setup.bash는 이 워크스페이스의 install을 터미널이 패키지를 찾는 목록에 더합니다. 목록은 환경 변수에 담기므로, source 한 그 터미널에만 적용됩니다.
/opt/ros/jazzy는 2강 3편에서 ~/.bashrc에 넣어 새 터미널마다 자동으로 들어갑니다.
새 터미널에서
빌드한 터미널 말고 새 터미널에서
빌드한 터미널이 아니라 새 터미널을 열고, 워크스페이스 루트에서 source install/setup.bash를 합니다. 다른 폴더에 있다면 source ~/ros2_ws/install/setup.bash처럼 절대 경로로 칩니다.
빌드한 터미널에서 source 하거나, source 한 터미널에서 빌드하면 꼬일 수 있다고 공식 문서가 경고합니다. 새로 연 터미널마다 다시 source 합니다.
층 쌓기
깔린 것 위에 덧쌓습니다
먼저 깔려 있는 환경을 언더레이(underlay), 그 위에 덧쌓는 내 워크스페이스를 오버레이(overlay)라고 합니다. 오버레이의 패키지는 언더레이에 있는 것을 가져다 씁니다. 그래서 언더레이를 먼저 source 합니다.
14강 2편에서는 /opt/ros/jazzy → turtlebot3_ws → 내 워크스페이스 순서로 쌓습니다.
같은 이름이면
위층에 있는 것이 먼저 쓰입니다
같은 이름의 패키지가 두 층에 있으면 오버레이 쪽이 쓰입니다. 그래서 공식 패키지의 소스를 내 워크스페이스에 받아 고쳐 써 볼 수 있습니다. 이때 언더레이는 그대로 남습니다.
공식 문서의 워크스페이스 튜토리얼이 turtlesim 소스를 받아 창 제목을 바꿔 보는 예를 씁니다.
확인
어느 층에서 왔는지 prefix로 봅니다
ros2 pkg prefix 패키지는 그 패키지를 어느 층에서 찾았는지 보여 줍니다. 안 보이거나 엉뚱한 층이 나오면 source를 빠뜨렸거나 다른 터미널에서 친 것입니다.
user는 내 계정 이름입니다. install/setup.bash는 언더레이까지 함께 불러오고, install/local_setup.bash는 이 워크스페이스만 불러옵니다.
다음 편