이전 포스팅에서 간간히 리눅스 명령어 몇 가지를 소개한 바가 있다.
이번 포스팅에서는 ROS 프로그래밍에 자주 쓰이는 리눅스 명령어와, ROS의 주요 명령어에 대해 알아보자.
명령어 | 약어/뜻 | 설명 |
---|---|---|
cd | change directory | cd 경로 해당 경로로 이동 |
ls | list segment | 파일&디렉토리 목록 출력 |
mkdir | make directory | mkdir 폴더이름 디렉토리 생성 |
echo | 반향되다 | echo 대상 터미널 창에 출력 |
grep | 특정 문자열 검색 | |
alias | 별명 | 명령어의 별칭 등록 |
ifconfig | interface config | 컴퓨터의 네트워크 상황 출력 |
sudo | superuser do | 사용자 권한을 root로 |
이 외에도 cp
(copy, 복사), mv
(move, 이동), rm
(remove, 제거), cat
(catenate, 출력), head
(앞에서부터 출력), tail
(뒤에서부터 출력), 등이 있으나 ROS 프로그래밍 및 시뮬레이션에서 잘 사용하지 않아 정리하진 않았다. 궁금하다면 구글링!
터미널에서
$
는 그 뒤에 명령어를 입력할 수 있다는 뜻이다.$
앞 부분에는 현재 명령을 하기 위해 사용자가 위치한 경로를 알려준다.
모든 명령어는 뒤에
--help
를 옵션으로 주면 명령어의 사용법을 출력한다
바(
|
)는 파이프라인(pipeline)이라고 한다. 앞 명령어의 결과를 뒤 명령어의 입력으로 한다는 뜻이다.
터미널 상에서 작업하는 위치를 변경한다.
cd ~
또는 cd
: 홈 디렉토리로 이동cd ..:
상위 디렉토리로 이동cd /경로
: 특정 경로로 이동❗ 절대경로와 상대경로
.
은 현재 디렉토리,..
은 바로 상위 디렉토리를 의미한다.
예를 들어, 내가 지금/America/Canada
에 있다 하자.cd ../America/USA/LA
이면, 상위 디렉토리인America
로 이동한 후, 그 하위 디렉토리인/America/USA/LA
로 이동하게 된다.
터미널에 현재 위치한 곳에서의 파일 및 디렉토리의 목록을 출력한다. 리눅스에서는 폴더, USB 등까지 모두 파일로 처리함을 참고하자.
-l
: 상세 정보까지 출력-a
: 숨긴 파일까지 출력명령어 뒤에 대시(
-
)가 있으면 그것은 옵션이란 뜻이다.
옵션은 복수 개를 사용할 수 있고, 선언 순서는 상관 없다.-la
이든-al
든 ‘숨긴 파일까지 상세하게 출력하라’라는 뜻이다.
기본적인 사용법으로는, 현재 위치에서 하위 폴더(디렉토리)를 만들 수 있다.
mkdir test1 #test1이라는 디렉토리를 만듦
mkdir test2/test3 #test2 하에 test3 디렉토리를 만듦
무언가를 터미널 창에 출력한다. 추후 ROS 부분에 가면 rostopic echo
로 붙여서 질리게 사용한다.
$ var1=200 #var1라는 변수를 선언하고 200을 할당함
$ echo $var1 #var1을 출력함
200
$ echo $USERNAME #사용자 이름을 출력함
lumos
파일 혹은 입력으로 주어진 어떤 것에서 문자열을 검색하는 방법이다. 파이프라인 기능을 이용해 앞에서의 출력을 대상으로 검색하기도 한다.
grep 옵션 패턴 파일
형태로 사용한다. 옵션은 생략 가능하며, '패턴'은 찾으려는 조건에 해당하고, '파일'은 검색하는 위치(대상)이다. ‘파일’에서 ‘패턴’에 해당하는 것을 검색해 돌려준다.
$ grep “ABC” test.txt #test.txt에서 ABC 문자열을 검색해 출력
$ cat /proc/meminfo | grep MemFree #/proc/meminfo 파일에서 MemFree를 찾아 출력
MemFree: 12825929 kB
alias
, ifconfig
, sudo
는 이전 포스팅에 정리해두었다. 궁금하거나 잊어버렸다면 참고하자.
와일드카드(wildcard)는 정확한 문자열이 아니더라도 특정 조건을 걸어 검색이 가능해진다.
특히 *
은 빈번히 사용되므로 눈에 익혀두자.
*
: 0개 이상의 문자 포함?
: 해당 자리에 하나의 문자 위치[문자 집합]
: 해당 문자들 중에 있음^
또는 !
: 제외$ grep “ABC” *.txt #확장자가 txt인 파일 중에서 ABC를 가진 것을 검색
$ ls test?.[c-g] # test 뒤에 한 문자가 더 있고 c, d, e, f, g 중 하나의 확장자를 가지는 파일명을 출력
test1.c testa.d test.g
자율운항보트 대회를 준비하며 많이 쓰였던 것들을 회상하며, 상황 별로 명령어(구)를 정리했다. 수가 많지는 않으며, 앞으로 계속 업데이트 해 나갈 예정이다.
USB 등으로 센서를 연결했다면, ls
명령어로 연결이 되었는지 확인할 수 있다.
$ ls /dev/ttyACM
$ ls /dev/ttyUSB
$ ls /dev/tty*
참고로, dev
는 device의 약어이다.
맨 마지막 줄을 보자면, tty로 연결된 모든 목록이 뜬다. ls
는 모든 파일과 디렉토리를 출력하므로 /dev
폴더에 있는 tty
로 시작하는 모든 목록을 출력하는 것이다.
❗ tty(Teletypewriter)
리눅스의 드라이브 중 콘솔/터미널을 의미한다.
콘솔(Consol)은 CLI(Command Line Interface)라고도 하는 인터페이스이다. 계속 '까만창'이라 불려왔던 그것이다. 컴퓨터와 사용자가 명령어를 주고 받는 방식/프로그램으로 이해하면 된다.
❗ ACM, USB
USB가 통신에 쓰일 때 각자 지원하는 기기가 있고, 이를 기능별로 분류해 클래스를 만들며 클래스별로 여러 프로토콜(규약, 규칙)을 정해놓았다. 그 중 하나가 시리얼 통신을 하며 USB 포트에 연결하여 사용하는 CDC(Communication Device Class)이고, 통신 방법 중 하나가 ACM(Abstract Control Model Class)이다. ACM은 USB to Serial에 사용된다.
센서 혹은 아두이노 등을 USB 포트에/dev/tty*
명령을 수행할 때 ACM으로 뜰 수도 있고 USB로 뜰 수도 있다. 무엇이든 큰 상관은 없다.
chmod (change mode)는 파일등에 권한을 부여할 때 사용한다.
chmod 옵션 모드 파일
ls
를 해보면 권한이 있는 파일은 굵은 글씨로 색이 덧입혀서 출력되고, 그렇지 않은 파일은 일반 흰 글자로 출력이 된다. 아래 사진에서 권한 부여 전과 후를 비교해보자.sudo
명령어로 선언해줘야 한다.sudo chmod 777 /dev/tty* #tty로 연결된 모든 것에 권한을 부여함
계속 ‘권한’이라는 단어가 나오는데, 이에 대해 조금만 더 알아본다.
파일은 user/group/others 별로 read(읽기), write(쓰기), execute(실행) 세 가지 권한을 부여할 수 있다.
ls
의 -l
옵션으로 ls -l
하면 파일에 부여된 권한을 알 수 있다.
-
기호가 있으면 그것은 파일(file)이란 뜻이고, 대신 d
로 시작하면 그것은 디렉토리(directory)라는 뜻이다.r
, w
, x
, -
조합의 9개 길이의 문자가 나온다.rw-
라면 읽고 쓸 수는 있지만 실행할 수는 없단 의미이다.777
이라고 했다면 모든 사용자에 대해 모든 권한을 부여한 것이다.+/-
로 직접 권한을 주거나 뺏을 수도 있다. +x
라고 했으니 모든 사용자에게 해당 파일에 대해 실행할 수 있는 권한을 부여한단 의미이다.명령어 | 설명 |
---|---|
roscore | ROS master 구동 |
rosrun | rosrun 패키지 노드 노드 실행 |
roslaunch | roslaunch 패키지 런치이름 launch 파일 실행(노드 여러 개) |
위 명령어들은 앞서 소개한 바 있으므로 그곳([ROS] ROS 기본 개념)을 참고하길 바란다. 아래는 간단한 예시이다.
$ roscore
# 단독으로 한 터미널에 실행해야 한다.
$ rosrun test_pkg test_script.py
#test_pkg 패키지의 test_script.py를 실행함
$ roslaunch test_pkg test_launch.launch
#test_pkg 패키지의 test_launch.launch를 실행함
명령어 | 설명 |
---|---|
rostopic | ROS 토픽 정보 확인 |
rosnode | ROS 노드 정보 확인 |
rosparam | ROS 파라미터 정보 확인 및 수정 |
rosbag | ROS 메시지 기록 및 재생 |
rosmsg | ROS 메시지 정보 확인 |
rostopic list
: 현재 퍼블리시되고 있는 모든 토픽 목록 출력. 아래 사진은 IMU를 연결한 뒤의 모습이다.rostopic echo /토픽이름
: 해당 토픽이 쏘고 있는 정보 출력. 토픽 이름 앞에 붙은 /
기호를 빼먹지 않도록 유의한다.$ rostopic echo /imu/data
rostopic hz /토픽이름
: 해당 토픽이 퍼블리시 되고 있는 주기(헤르츠)를 나타낸다.rostopic info 토픽이름
: 해당 토픽에 대한 정보를 출력한다.rostopic type /토픽이름
: 해당 토픽의 메시지 타입을 출력한다rostopic pub /토픽이름/토픽타입 데이터
ctrl
+ C
로 강제종료 할 때까지 계속 사용자가 pub으로 입력한 내용을 퍼블리시한다.rostopic pub 토픽이름 토픽타입 데이터
: 커맨드 라인(command line) 인자를 전달한다. 기본 모드이다.rostopic echo 토픽1 | rostopic pub 토픽2 토픽타입
: 파이프 입력(Piped input)을 사용한다. Rate 모드의 기본으로, 기본 헤르츠는 10hz로 한다. 토픽1은 pub의 입력이 되는 토픽이고, 토픽2는 쏴주고 싶은 값이다. 즉, 토픽1의 퍼블리시 값을 토픽2의 퍼블리시 값으로 하겠단 뜻이다.-r 헤르츠
: Rate 모드를 활성화시킨다. 입력해준 헤르츠 숫자만큼 빠르기로 퍼블리시한다.-1
또는 --once
: Once 모드를 활성화시킨다.$ rostopic pub /new_location uint -r 10 -- 0 0 0
#메시지 타입에 값이 하나가 아니라 여러 개를 동시에 전달해야 한다면
#'--' 뒤에 작성한다.
$ rostopic pub /test_topic std_msgs/String “hello there?!”
#띄어쓰기 된 어구를 입력하려면 `“ ”`로 묶어줘야 하나로 인식한다
$ rostopic pub test_topic std_msgs/String “hellow there?!”
$ rostopic echo chatter | rostopic pub bar std_msgs/String
rosnode info /노드이름
: 노드의 정보를 출력한다.rosnode kill /노드이름
: 해당 노드를 중단한다.rosnode list
: 현재 활성화되어 있는 노드 목록을 출력한다.ROS Wiki에 rosbag
을 검색하면 패키지라고 나온다. rosbag
은 해당 패키지를 실행하는 명령어인 셈이다.
여기서는 커맨드 라인 도구, 즉 터미널에서 사용하는 방법을 소개한다. rosbag은 마치 노드처럼 작용함을 참고하자.
rosbag record
: 해당 토픽을 서브스크라이브해서 bag 파일에 저장한다.
rosbag record 토픽이름1 토픽이름2 …
: 해당 토픽의 메시지를 저장한다. 여러 개의 토픽을 동시에 지정할 수도 있다.rosbag record -a
또는 rosbag record --all
: 모든 토픽 메시지를 저장한다.rosbag record --node=/노드이름
: 특정 노드가 서브스크라이브하는 모든 토픽 메시지를 저장한다.rosbag info bag파일
: bag 파일에 대한 정보를 출력한다.
rosbag play
: bag 파일들의 내용을 재생한다. 기록했던 것과 똑같이 상황을 재현한다.
rosbag play bag파일1 bag파일2 …
: 해당 bag 파일의 내용을 재생한다.rosbag play bag파일 --topics /토픽1 /토픽2 …
해당 bag파일 중 특정 토픽들에 대해서만 재생한다.❗ bag 파일을 csv로 바꾸는 방법
.bag
파일은 ROS나 리눅스 내에서 기록에 매우 편리하지만, 이를 우리가 익숙한 툴, 즉 엑셀로 바꾸어 처리할 수 있다면 더욱 좋을 것이다.
때문에.bag
파일을.csv
로 바꾸어주는 패키지를 이용하면 간편하게 이 기능을 이용할 수 있다.
명령어 | 설명 |
---|---|
catkin_create_pkg | catkin_create_pkg 패키지이름 의존성 catkin 패키지 자동 생성 |
catkin_make | 캐킨 빌드 시스템 기반으로 빌드 |
위 명령어들은 다음 포스팅([ROS] 패키지 빌드와 노드 작성)에서 자세하게 다룬다.
잘 쓰이는 도구를 불러오는 명령어 세 가지이다.
rqt는 주로 노드의 연결 상태를 보기 위해 사용하는 도구(패키지)이다.
rqt
: rqt GUI 자체를 실행하는 명령어로, 실행하면 아무것도 안 보인다. 상단 바의 플러그인 등으로 원하는 것을 실행시킨다. 사실상 다짜고짜 이렇게는 잘 안 쓴다.rqt_image_view
: 연결되어 있는 카메라 등의 영상을 보여준다. realsense 카메라를 쓴다면 해당 툴을 실행시켜 볼 수도 있지만 rqt로도 가능한 기능이다. 플러그인을 통해 실행시킬 수도 있다.rqt_graph
: 가장 많이 사용하는 rqt 툴로, 노드와 토픽 사이의 관계를 그래프로 보여준다. 잘 퍼블리시&서브스크라이브 되고 있는지, 연결은 잘 되어 있는지를 확인하기에 매우 유용하다.rqt_plot
: 좌표 상에 데이터를 나타낸다.Rviz 툴은 3차원으로 모델을 보여준다. 시뮬레이션도 가능한 툴이다.
필자는 IMU를 통한 이동 경로 추적에서 경로를 점으로 표시할 때 쓰거나, 센서들의 x, y, z 축을 확인하는 등의 용도로 사용하고 있었다.
rviz
: roscore을 실행한 후에 해당 명령어를 입력하면 rviz GUI 창이 나온다.rosrun rviz rviz
: 위 명령어와 같은 명령이다.앞선 포스팅에서 밝혔듯, VS Code를 실행하는 명령어이다.