새 터미널에서 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는 이 워크스페이스만 불러옵니다.

다음 편

source까지 했는데 고친 코드가 그대로라면?

8편고친 코드가 왜 그대로일까? 5강 목록