❗ 위 링크의 블로그에서는 20.04 버전으로 다운로드하지만, 아직(특히 트라이캣 팀은) 18.04을 사용해주세요.
❗ 본격적인 설치를 하게 되면 컴퓨터를 쓰지 못하므로, 태블릿PC 혹은 휴대폰으로 링크를 타고 들어가 설치를 진행해야 한다.
❗ 터미널을 켜는 단축키는
ctrl
+alt
+T
❗ 원래 터미널 창에서 비밀번호를 입력할 때는 아무것도 안 뜬다. 입력이 안된다고 당황하지 말자!
❗ 터미널 창에서는
Ctrl
+Shift
+C
,V
를 해야 복사/붙여넣기가 가능하다.
❗ 참고로 OpenCV를 설치하기 위해서는 ROS보다 먼저 설치가 되어야 한다!
❗ 이제부터 이어지는 코드에서 명령어 맨 앞에 붙은
$
은 명령어를 입력한다는 뜻이다. 터미널을 켜보면 앞에 붙어있는 문자말이다. 그러니 복사/붙여넣기 과정에서$
는 생략하고 붙여넣기 하고, 서로 다른 줄에 $가 있다면, 앞에 명령을 먼저 실행한 뒤에 뒤의 것을 실행해야 한다.
❗ 잘못 입력했는데 하나하나 지우기엔 귀찮다면
ctrl
+C
로 빠져나올 수 있다. 강제종료 단축키다. 터미널을 켜는 단축키만큼 자주 사용하게 되니 필시 알아두자.
다시 한 번 기억하자. 단축키는 ctrl
+ alt
+ T
ros-latest.list
에 ROS 저장소를 추가하는 과정이다.
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
❓ sudo 명령어 리눅스에서는 특정한 명령을 실행하거나 파일에 접근하려면 루트(root) 권한이 필요할 때가 있다. 일반 사용자가 root 권환을 획득하려면
su
또는sudo
명령어를 쓴다.sudo
는 ‘superuser do’의 약자로,sudo
다음에 원하는 명령어를 입력하면 현재 계정에서 root 권한으로 명령어를 실행한다. 명령어를 입력하면 실행 전 사용자의 비밀번호를 묻는다.
ROS 저장소로부터 패키지를 내려받기 위해 공개키를 추가한다.
$ sudo apt install curl
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo apt-get update && sudo apt-get upgrade -y
ROS, rqt, Rviz, 로봇 관련 라이브러리, 2D/3D 시뮬레이터 등이 포함된다.
[y/n]
가 나오면 y
를 입력한다.
$ sudo apt install ros-melodic-desktop-full
혹시 설치가 안 되었을 경우를 대비하기 위함이다.
$ sudo apt-get install ros-melodic-rqt*
해당 파일에는 ROS_ROOT
, ROS_PACKAGE_PATH
등의 환경변수들이 정의되어 있다.
새로운 쉘이 실행될 때마다 bash에 자동적으로 ROS 환경변수가 추가되도록 하기 위해 아래의 명령을 입력한다.
$ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
현재 쉘에서만 환경변수를 바꾸고 싶다면 아래 명령 한 줄만 입력
$ source /opt/ros/melodic/setup.bash
❓ 환경변수 변수는 변수이나, 흔히 프로그래밍할 때 어떠한 계산 값을 담는 데 사용하는 변수가 아니라, 컴퓨터 혹은 운영체제, 프로그램이라는 ‘환경’에서 그 프로그램이 동작할 때 필요한 값을 담고 있는 변수이다. 가장 대표적인 리눅스 환경변수 중 하나가
HOME
이다. 사용자의 홈디렉토리 경로를 담고 있는 변수이다.USER
는 사용자의 이름을 담고 있으며,PATH
는 명령어나 파일을 찾는 위치를 담고 있는 실행파일 탐색 경로이다. 나중에 설명하겠지만, 환경변수도 사용자가 임의로 할당하고 해제할 수 있으며, 설정 명령어는export
이고 할당 방법도=
을 사용해export 변수명=값
으로 한다.
❓ 쉘(Shell)과 bash 쉘(Shell)은 리눅스에서 명령어와 프로그램을 실행할 때 사용하는 것(인터페이스, 프로그램)이다. 커널(Kernel)과 사용자 사이에서, 사용자의 명령을 해석하고 실행한다. 깊게 들어가지 않을 사람들은 그저 터미널이라 이해해도 무방하다. 셀에는 여러 종류가 있고, 우리는 bash 쉘을 쓰고 있다. Bash(Bourne Again Shell)는 현재 리눅스의 표준 쉘(Shell)이다.
ROS를 사용할 때 유용한 도구와 의존성 등을 설치한다. 먼저, rosinstall 등을 설치한다. ROS 패키지들을 빌드하는데 필요한 의존성과 도구들이다.
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
다음으로는 rosdep을 초기화한다.
$ sudo apt install python-rosdep
$ sudo rosdep init
$ rosdep update
rosdep ros의 핵심 컴포넌트들을 사용하고 컴파일할 때 의존성 패키지를 쉽게 설치해 사용자 편의성을 높여주는 기능이다.
ROS에서는 ROS 전용 빌드 시스템으로 catkin(캐킨)을 사용하므로, 이를 위해 catkin 작업 폴더를 생성하고 초기화해야 한다.
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
모든 작업은 catkin_ws
디렉토리에서 이루어진다.
catkin_make
명령어는 catkin 빌드 명령어이다. 해당 명령어를 입력한 뒤 ls
로 파일 리스트를 출력해보면, 빌드를 했으므로, 기존에 있던 /src
폴더와 CMakeList.txt
외에도 /build
, /devel
폴더가 추가적으로 생성되어 있을 것이다.
2-7번 [환경설정 파일 불러오기]에서 source /opt/ros/melodic/setup.bash
으로 명령어를 작성했다면, 아래의 코드로 수정된 스크립트 파일을 바로 적용하기 위해 다음의 명령어를 추가적으로 입력한다.
$ source devel/setup.bash
모든 터미널 창을 닫고 다시 하나를 열어 아래의 명령어를 입력하고 결과를 확인한다.
$ roscore
터미널 창을 실행할 때마다 환경설정파일을 불러오려 매번 2-7의 코드를 실행하기엔 번거롭다.
따라서 새로운 터미널 창을 열 때마다 정해진 환경설정 파일을 읽어오고, ROS 네트워크를 설정하며, 자주 사용하는 명령어를 단축 명령어로 만드는 등의 일을 하기 위해 bashrc
파일을 편집한다.
우선 bashrc
파일을 연다.
$ gedit ~/.bashrc
이미 설정되어 있는 것들은 건드리지 않고, 맨 아래에 다음 내용을 붙여넣기 한다.
아래 내용은 변수 할당 및 명령어 설정이므로 특히 더 띄어쓰기에 민감하다. =
앞뒤로는 반드시 띄어쓰기가 없어야 한다.
# ROS 환경설정 파일
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
# ROS 네트워크 설정 (이 내용은 ‘3-2. ROS 네트워크 설정’을 참고)
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://localhost:11311
# ROS alias 명령어 설정 (이 내용은 ‘3-3. 단축 명령어 설정’을 참고)
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'
해당 변경사항을 저장하고 나면 다시 터미널 창으로 돌아와 아래의 명령을 입력해주어야 적용이 된다. 터미널을 껐다가 다시 켜면 위에서 설정한 예약어(명령어)들이 잘 실행될 것이다.
$ source ~/.bashrc
❓bashrc bash는 다섯 개의 설정 파일을 가지고 있다.
/etc
에 속한 두 파일은 전역적 파일이고, 나머지는 각 사용자의 설정 파일이므로 그 파일의 주인인 사용자에게만 영향을 주며, 그 사용자의 홈디렉토리에서 숨김파일로 주로 찾아볼 수 있다. 이 중bashrc
는 bash에서 작업할 때마다 수행되는 파일이다. 일종의 환경변수의 개념처럼 작동하여, 예를 들어python
이라고만 해도 python3.x 버전으로 연결해준다. 이런 설정을 모든 사용자에게 적용하고 싶다면etc/profile
에 선언하면 되는 것이다.
/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc
~/.bash_logout
❓gedit(지 에디트) Windows로 따지자면 메모장 격이다. 텍스트 편집기 프로그램 중 하나이며, 우분투 LTS18 기준으로 우분투 데스크탑의 공식 텍스트 편집기이다. 터미널에
gedit
를 쓰고 파일명을 입력하면 그 파일을 gedit으로 편집할테니 gedit으로 열라는 뜻이다.
- 파일명 앞에 붙은
.
은 숨긴파일이라는 표시이다.#
은 주석 표시이다.
ROS는 네트워크를 이용해 노드 간 메시지 통신을 하므로 네트워크 설정이 필요하다. 하나의 PC에서 모든 ROS 패키지를 실행한다면 IP 지정이 필요가 없고, 3-1의 코드처럼 localhost로 설정하면 된다. 마스터 PC가 따로 있고 호스트 PC를 로봇이 사용할 때, 이를 구분해 지정해주기만 하면 된다. 아래는 그 예.
export ROS_HOSTNAME=192.168.1.100
export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311
본인의 IP 정보는 터미널에서 ifconfig
명령어로 확인할 수 있다. 필자는 와이파이로 네트워크에 연결한 상태에며, 개인의 네트워크 상황에 따라 화면은 다르게 보일 수 있다.
만약 Command ifconfig not found
에러가 난다면 아래와 같이 설치를 진행한 후에 다시 명령어를 입력한다.
sudo apt install net-tools
❓ 리눅스 쉘 변수 😂깊게 들어갈 필요가 없는 사람들은 아래 내용은 참고만 하자.
- 위에서도 잠깐 밝혔듯, 리눅스 쉘에서는 변수를 설정하고 해제할 수 있다.
- 쉘 변수에는 환경 변수(Environment Variables)와 내장 환경 변수(Built-in Environment Variables), (사용자 지정) 변수가 있다.
- 사용자가 임의로 변수를 할당할 때는
변수명=값
으로 터미널 창에서 바로 선언이 가능하다.set
명령어는 현재 설정되어 있는 변수 모두를 출력한다.unset 변수명
은 설정된 변수를 해제한다.- 환경 변수는 각 자식 프로세스가 부모 프로세스에서부터 copy해오는 변수들이다. 상속의 개념이다.
export 변수명=값
으로 선언하고,env
(environment)로 모든 환경 변수를 확인할 수 있으며,export -n 변수명
으로 해제한다.- 내장 환경변수는 리눅스가 미리 지정해놓은 변수들로, 보통 대문자로 선언되어 있다. (그렇기 때문에 바꾸면 좀 일이 복잡해진다.)
HOME
,PATH
가 예시이다.PATH
는PATH=/usr/local/sbin:/usr/local/bin:/usr/sbi n:/usr/bin
처럼 콜론(:
)으로 구별되어 있는 경로의 모음이다.- 그러니 위 코드에서
ROS_HOSTNAME
,ROS_MASTER_URI
는 환경변수 이름이고export
로 설정해준 것이다.- 아래는 몇 개의 환경변수를 출력해본 결과이다. 참고로
echo
는 터미널 창에 무언가를 출력하라는 명령어이며, 변수는 이름 앞에$
를 붙여줘야 명령어가 아닌 변수로 인식한다.
❓ 파라미터 확장(변수 치환)(Parameter expansion (Variable substitution)) 리눅스에서
${이름}
은 중괄호 안에 있는 변수로 바꾸라는 뜻의 변수 치환이다. 위 예시에서ROS_HOSTNAME
을192.168.1.100
으로 설정했으므로, 두번째 줄에서http://${ROS_HOSTNAME}:11311
은 ` http://192.168.1.100:11311`으로 치환된다.
❓ alias 명령어 ROS 개발에 자주 사용하는 명령어를 등록한 것이다. 단축키를 새로 만드는 것이라 생각하면 쉽다.
명령어 | 명령 |
---|---|
cw | catkin 작업폴더 ~/catkin_ws 로 이동 |
cs | catkin 작업폴더 중 소스파일이 있는 폴더 ~/catkin_ws/src 로 이동 |
cm | catkin 작업폴더 ~/catkin_ws 로 이동한 후, catkin_make 명령어로 ROS 패키지 빌드 |
우분투에 기본적으로 내장된 터미널을 사용해도 아무 문제가 없다. 하지만 개발과 테스트를 하다보면 필시 여러 창을 동시에 켜고 명령어를 입력하고 실행해야 할 때가 온다. 이 기능을 편리하게 할 수 있는 프로그램 중 하나가 터미네이터(Terminator)이다.
$ sudo apt-get install terminator
위 명령어로 설치를 진행한다. 똑같이 단축키 ctrl
+ alt
+ T
를 하면 기본 터미널이 아닌 터미네이터가 실행된다.
아래는 자주 사용되는 창 관련 단축키이다.
기능 | 단축키 |
---|---|
수평 분할 | Ctrl + Shift + O |
수직 분할 | Ctrl + Shift + E |
다음 창 활성화 | Ctrl + Tab 또는 Ctrl + Shift + N |
이전 창 활성화 | Ctrl + Shift + Tab 또는 Ctrl + Shift + P |
현재 활성화 된 창 닫기 | Ctrl + Shift + W |
터미네이터 종료 | Ctrl + Shift + Q |
전체화면 | F11 |
글자 크기 크게 | Ctrl + Shift + +(백스페이스 좌측 +/=키) |
글자 크기 작게 | Ctrl + -(0 우측 _/-키) |
(분할만 해둬도 뭔가 있어보여서 기분이 좋다)
윈도우에서 C/C++을 쓸 때는 Visual Studio, Python을 쓸 때는 Pycharm을 사용하는 편이다. 리눅스(우분투)에서는 VS Code(Visual Studio Code)를 사용한다. 비주얼 스튜디오보다 가볍다는 평이 있다. 이들을 통합개발환경(IDE)이라 하며, 코딩과 디버그, 컴파일, 배포 등 모든 작업을 하나의 프로그램 안에서 처리하도록 하는 소프트웨어이다.
.deb
파일을 다운받는다.sudo dpkg -i code*.deb
를 입력해 설치를 진행한다.실행할 때는 아무 경로에서나 터미널 창에 code .
를 입력하면 바로 실행된다.
기본 문서 편집기로 VS code를 설정하고 싶다면 아래와 같은 명령을 실행한다.
$ xdg-mime default code.desktop text/plain
ROS의 상징은 거북이이다. ROS에서 제공하는 turtlesim
패키지를 이용해 테스트해보자
한 터미널 창을 열고 roscore
을 입력한다.
$ roscore
다른 새 터미널에 터틀심 노드를 실행한다.
$ rosrun turtlesim turtlesim_node
파란 창에 거북이 한 마리가 보일 것이다.
설명을 보태보자면, turtlesim
은 패키지 이름, turtlesim_node
는 rosrun
으로 실행할 노드 이름이다. 이왕 터미네이터를 실행한 거, 화면 분할로 실행해도 좋다.
이제 이 거북이를 키보드로 움직일 수 있도록 하자. 또다른 터미널 창에 아래와 같은 명령어를 입력한다.
$ rosrun turtlesim turtle_teleop_key
이 터미널 창에서 방향키를 누르면 아까 그 거북이가 움직인다.
rqt 그래프를 그려 현재 노드들의 통신 상황을 알아보자. 새 터미널을 열자.
$ rqt_graph
위 사진처럼 안 보인다면 상단 체크박스에서 Leaf topics
를 클릭한다.
동그라미는 노드, 네모는 토픽을 의미하며, 화살표는 어디서 시작해 어디로 토픽을 전달하는지를 나타낸다.
노드를 종료할 때는 아까처럼 Ctrl
+ C
로 하고, 터미널을 끄려면 exit
로 끌 수 있다.
❗ 터미널 창에서
Tab
키 사용하기 여기까지 따라왔다면, 오타 없이 터미널 창에 명령어를 입력하는 것이 얼마나 어려운 일인지 알 것이다. 익숙하지 않으니 필자도 아직까지 명령어 입력 시 신중에 신중을 기한다.(자칫 파일이 몽땅 삭제되거나 날아갈 수도 있으니) 리눅스 터미널 창에서는(터미네이터도 마찬가지) 자동완성기능을 제공한다. 예를 들어rosrun turtlesim
을 입력하고Tab
키를 누르면 이 패키지에서 사용할 수 있는 노드 리스트를 검색할 수 있다. 또한rosrun turtlesim turtle_teleop
까지만 입력해도Tab
을 누르면 뒤에_key
를 자동으로 완성해준다. 매우매우 자주 쓰는 기능이니 기억해두자.