이번에는 ROS의 파일 시스템에 대해서 알아보도록 하자.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/2500
https://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem
<목차>
1. 파일 시스템의 정의
2. ROS 파일 시스템
3. ROS 설치 폴더
4. 사용자 작업 폴더
5. ROS 파일 시스템 관련 기능, 명령어
먼저 파일 시스템이 무엇인지부터 짚고 넘어가자.
💡 파일: 주기억장치 혹은 디스크처럼 하드웨어 저장공간에 저장되는 데이터 집합을 의미한다
💡 파일 시스템: 저장 장치 내에서 데이터를 읽고 쓰기 위해 미리 정한 약속이다. 즉, 파일에 대해서 저장 및 검색, 데이터 보호, 공유, 백업 등 다양한 기능을 제공하는 시스템을 의미한다. 운영 체제가 데이터를 디스크에 어떻게 저장하고 검색하는지도 관여하며, 데이터를 파일과 디렉토리로 조직화 하고 디스크에 어떻게 배치할지도 결정한다.
이러한 파일 시스템은 리눅스 커널의 중요한 요소 중 하나이다.
이제 리눅스의 파일 시스템의 정의를 알게 되었으니, ROS 파일 시스템에 대해서 살펴보자. ROS 파일 시스템은 ROS 설치 폴더 와 사용자 작업 폴더 로 구분된다.
💡 ROS 설치 폴더 : ROS를 설치하게 되면 /opt/ 폴더에 /ros 폴더가 생성되고, 그 안에 roscore를 포함한 핵심 유틸리티 및 rqt, rviz, 로봇 관련 라이브러리, 시뮬레이션, 네비게이션 등이 설치된다.
💡 사용자 작업 폴더 : 사용자가 원하는 곳에 폴더를 생성 가능하며, 통상적으로 ROS 작업 폴더인 ~/catkin_ws/에 설치한다.
"/opt/ros/{ros-distro}"에 설치된다.
bin, etc, include, lib, share 폴더 + 환경 설정 파일들로 다양하게 구성되어 있다.
💡 세부적으로 살펴보도록 하자
- /bin: 실행 가능한 바이너리 파일
- /etc: ROS 및 catkin 관련 설정 파일
- /include: 헤더 파일
- /lib: 라이브러리 파일
- /share: ROS 패키지
- env.*: 환경설정 파일
- setup.*: 환경설정 파일
사용자 작업 폴더는 사용자가 원하는 곳에 생성한 폴더를 의미하며, 통상적으로 리눅스/ROS 워크스페이스인 ~/catkin_ws의 하위 디렉토리로 생성한다.
catkin_ws 폴더는 "build", "devel", "src" 폴더로 구성되어 있다.
💡 세부적으로 살펴보도록 하자
- /build: catkin 빌드 시스템의 빌드 환경 파일
- /devel: catkin 빌드 시스템에 의해 빌드된 msg, srv 헤더 파일 및 사용자 패키지 라이브러리 및 실행 파일
- /src: 사용자 패키지
통상적으로 이 src 폴더 하위에 사용자 패키지를 사용하게 된다.
사용자 패키지는 통상적으로 다음 폴더들로 구성되게 된다.
💡 세부적으로 살펴보면 다음과 같다.
- /include: 헤더파일
- /launch: roslaunch에 사용되는 스크립트
- /node, /script: rospy용 스크립트
- /msg: 메시지 파일
- /src: 소스코드 파일
- /srv: 서비스 파일
- CMakeLists.txt: 빌드 설정 파일
- package.xml: 패키지 설정 파일
https://docs.ros.org/en/independent/api/rospkg/html/rospack.html
rospack은 ROS 패키지 관리 도구(package management tool)로써, dpkg의 일부, pkg-config의 일부라고 할 수있다. 주요 기능은 ROS 패키지의 정보 및 내용을 출력하는 것이다.
대표적인 rospack 사용의 옵션은 다음과 같다.
$ rospack <command> [options] [package]
Allowed commands:
help [subcommand]
cflags-only-I [--deps-only] [package]
cflags-only-other [--deps-only] [package]
depends [package] (alias: deps)
depends-indent [package] (alias: deps-indent)
depends-manifests [package] (alias: deps-manifests)
depends-msgsrv [package] (alias: deps-msgsrv)
depends-on [package]
depends-on1 [package]
depends-why --target=<target> [package] (alias: deps-why)
depends1 [package] (alias: deps1)
export [--deps-only] --lang=<lang> --attrib=<attrib> [package]
find [package]
langs
libs-only-L [--deps-only] [package]
libs-only-l [--deps-only] [package]
libs-only-other [--deps-only] [package]
list
list-duplicates
list-names
plugins --attrib=<attrib> [--top=<toppkg>] [package]
profile [--length=<length>] [--zombie-only]
rosdep [package] (alias: rosdeps)
rosdep0 [package] (alias: rosdeps0)
vcs [package]
vcs0 [package]
Extra options:
-q Quiets error reports.
더 자세한 내용은 링크를 참조하도록 하자.
roscd는 rosbash의 일종으로, 특정 디렉토리에서 다른 디렉토리에 있는 패키지나 스택에 다이렉트로 가고 싶을 때 사용한다.
💡 rosbash
rosbash 패키지는 bash 함수 및 tab키를 통한 자동완성 기능을 지원하는, 편리성을 위해 작성된 패키지이다.
우리가 예를 들어서source /opt/ros/noetic/setup.bash
이런 코드를 입력하는 것도 다 rosbash를 source하기 위함이다.
roscd의 사용법은 다음과 같다.
$ roscd <package-or-stack>[/subdir]
예를 들어서
$ roscd roscdpp
그리고 나서 현재 내 위치를 $ pwd 명령어를 통해서 알 수 있다.
$ roscd log
이렇게 한번에 log 폴더로 이동하는 등 유용하게 사용할 수 있다.
rosls 역시 roscd와 마찬가지로 rosbash의 일부이다. roscd와 마찬가지로, 절대경로를 사용하지 않더라도 바로 내가 원하는 패키지나 스택에 대해서 ls 명령어를 적용 가능하다.
$ rosls <package-or-stack>[/subdir]