[ROS] Linux, ROS 주요 명령어

한은기·2021년 12월 30일
3

ROS

목록 보기
3/10
post-thumbnail

이전 포스팅에서 간간히 리눅스 명령어 몇 가지를 소개한 바가 있다.
이번 포스팅에서는 ROS 프로그래밍에 자주 쓰이는 리눅스 명령어와, ROS의 주요 명령어에 대해 알아보자.


🐧 1. Linux 주요 명령어

명령어약어/뜻설명
cdchange directorycd 경로 해당 경로로 이동
lslist segment파일&디렉토리 목록 출력
mkdirmake directorymkdir 폴더이름 디렉토리 생성
echo반향되다echo 대상 터미널 창에 출력
grep특정 문자열 검색
alias별명명령어의 별칭 등록
ifconfiginterface config컴퓨터의 네트워크 상황 출력
sudosuperuser do사용자 권한을 root로

이 외에도 cp(copy, 복사), mv(move, 이동), rm(remove, 제거), cat(catenate, 출력), head(앞에서부터 출력), tail(뒤에서부터 출력), 등이 있으나 ROS 프로그래밍 및 시뮬레이션에서 잘 사용하지 않아 정리하진 않았다. 궁금하다면 구글링!

터미널에서 $는 그 뒤에 명령어를 입력할 수 있다는 뜻이다. $ 앞 부분에는 현재 명령을 하기 위해 사용자가 위치한 경로를 알려준다.

모든 명령어는 뒤에 --help를 옵션으로 주면 명령어의 사용법을 출력한다

바(|)는 파이프라인(pipeline)이라고 한다. 앞 명령어의 결과를 뒤 명령어의 입력으로 한다는 뜻이다.

1-1. cd

터미널 상에서 작업하는 위치를 변경한다.

  • cd ~ 또는 cd: 홈 디렉토리로 이동
  • cd ..: 상위 디렉토리로 이동
  • cd /경로: 특정 경로로 이동

절대경로와 상대경로
.은 현재 디렉토리, ..은 바로 상위 디렉토리를 의미한다.
예를 들어, 내가 지금 /America/Canada에 있다 하자. cd ../America/USA/LA이면, 상위 디렉토리인 America로 이동한 후, 그 하위 디렉토리인 /America/USA/LA로 이동하게 된다.

1-2. ls

터미널에 현재 위치한 곳에서의 파일 및 디렉토리의 목록을 출력한다. 리눅스에서는 폴더, USB 등까지 모두 파일로 처리함을 참고하자.

  • 옵션 -l: 상세 정보까지 출력
  • 옵션 -a : 숨긴 파일까지 출력

명령어 뒤에 대시(-)가 있으면 그것은 옵션이란 뜻이다.
옵션은 복수 개를 사용할 수 있고, 선언 순서는 상관 없다. -la이든 -al든 ‘숨긴 파일까지 상세하게 출력하라’라는 뜻이다.

1-3. mkdir

기본적인 사용법으로는, 현재 위치에서 하위 폴더(디렉토리)를 만들 수 있다.

mkdir test1		#test1이라는 디렉토리를 만듦
mkdir test2/test3	#test2 하에 test3 디렉토리를 만듦

1-4. echo

무언가를 터미널 창에 출력한다. 추후 ROS 부분에 가면 rostopic echo로 붙여서 질리게 사용한다.

$ var1=200	#var1라는 변수를 선언하고 200을 할당함

$ echo $var1	#var1을 출력함
200

$ echo $USERNAME	#사용자 이름을 출력함
lumos

1-5. grep

파일 혹은 입력으로 주어진 어떤 것에서 문자열을 검색하는 방법이다. 파이프라인 기능을 이용해 앞에서의 출력을 대상으로 검색하기도 한다.
grep 옵션 패턴 파일 형태로 사용한다. 옵션은 생략 가능하며, '패턴'은 찾으려는 조건에 해당하고, '파일'은 검색하는 위치(대상)이다. ‘파일’에서 ‘패턴’에 해당하는 것을 검색해 돌려준다.

$ grep “ABC” test.txt			#test.txt에서 ABC 문자열을 검색해 출력

$ cat /proc/meminfo | grep  MemFree	#/proc/meminfo 파일에서 MemFree를 찾아 출력
MemFree:          12825929 kB

alias, ifconfig, sudo

alias, ifconfig, sudo이전 포스팅에 정리해두었다. 궁금하거나 잊어버렸다면 참고하자.


😎 2. 와일드카드

와일드카드(wildcard)는 정확한 문자열이 아니더라도 특정 조건을 걸어 검색이 가능해진다.
특히 *은 빈번히 사용되므로 눈에 익혀두자.

  • *: 0개 이상의 문자 포함
  • ?: 해당 자리에 하나의 문자 위치
  • [문자 집합]: 해당 문자들 중에 있음
  • ^ 또는 !: 제외
$ grep “ABC” *.txt	#확장자가 txt인 파일 중에서 ABC를 가진 것을 검색

$ ls test?.[c-g]		# test 뒤에 한 문자가 더 있고 c, d, e, f, g 중 하나의 확장자를 가지는 파일명을 출력
test1.c		testa.d		test.g

🚩 3. 특정 상황에 자주 쓰이는 명령어

자율운항보트 대회를 준비하며 많이 쓰였던 것들을 회상하며, 상황 별로 명령어(구)를 정리했다. 수가 많지는 않으며, 앞으로 계속 업데이트 해 나갈 예정이다.

3-1. 센서 연결 확인하기

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로 뜰 수도 있다. 무엇이든 큰 상관은 없다.

3-2. chmod: 권한 부여하기

chmod (change mode)는 파일등에 권한을 부여할 때 사용한다.

  • 사용법: chmod 옵션 모드 파일
  • 파일에 권한 부여:
    • 본인이 작성한 혹은 다운로드 받은 스크립트 파일을 실행하려면 실행 권한을 파일에 주어야 한다.
    • 스크립트 파일이 있는 폴더에서 ls를 해보면 권한이 있는 파일은 굵은 글씨로 색이 덧입혀서 출력되고, 그렇지 않은 파일은 일반 흰 글자로 출력이 된다. 아래 사진에서 권한 부여 전과 후를 비교해보자.

  • 연결한 센서 등에 권한 부여
    • USB 등으로 연결한 센서들을 위에서 확인했다면, 이에도 권한을 부여해야 사용할 수 있다.
    • 스크립트에 권한을 부여한 것과는 다르게, 권한을 부여하려면 추가적인 '사용자'의 권한이 필요해 sudo 명령어로 선언해줘야 한다.
sudo chmod 777 /dev/tty*  #tty로 연결된 모든 것에 권한을 부여함

3-3. 파일 권한

계속 ‘권한’이라는 단어가 나오는데, 이에 대해 조금만 더 알아본다.

파일은 user/group/others 별로 read(읽기), write(쓰기), execute(실행) 세 가지 권한을 부여할 수 있다.

ls-l 옵션으로 ls -l하면 파일에 부여된 권한을 알 수 있다.

  • 맨 앞 -기호가 있으면 그것은 파일(file)이란 뜻이고, 대신 d로 시작하면 그것은 디렉토리(directory)라는 뜻이다.
  • 맨 앞 한 문자를 제외하면 r, w, x, - 조합의 9개 길이의 문자가 나온다.
  • 세 개씩 끊어 앞에서부터 user(소유자, owner)에 대한 권한, group(그룹)에 대한 권한, others(나머지 사용자)에 대한 권한을 의미한다.
    • 예를 들어 세 개가 rw-라면 읽고 쓸 수는 있지만 실행할 수는 없단 의미이다.
  • 세 문자를 각각 8진수로 표현하면 r=4, w=2, x=1이며, 이를 모두 더하면 7이다.
    • 위에서 모드를 777이라고 했다면 모든 사용자에 대해 모든 권한을 부여한 것이다.
  • +/-로 직접 권한을 주거나 뺏을 수도 있다.
    • 위에서 모드를 +x라고 했으니 모든 사용자에게 해당 파일에 대해 실행할 수 있는 권한을 부여한단 의미이다.


🐢 4. ROS 명령어

4-1. ROS 실행 명령어

명령어설명
roscoreROS master 구동
rosrunrosrun 패키지 노드 노드 실행
roslaunchroslaunch 패키지 런치이름 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를 실행함

4-2. ROS 정보 명령어

명령어설명
rostopicROS 토픽 정보 확인
rosnodeROS 노드 정보 확인
rosparamROS 파라미터 정보 확인 및 수정
rosbagROS 메시지 기록 및 재생
rosmsgROS 메시지 정보 확인

rostopic

  • rostopic list: 현재 퍼블리시되고 있는 모든 토픽 목록 출력. 아래 사진은 IMU를 연결한 뒤의 모습이다.

  • rostopic echo /토픽이름: 해당 토픽이 쏘고 있는 정보 출력. 토픽 이름 앞에 붙은 /기호를 빼먹지 않도록 유의한다.
$ rostopic echo /imu/data

  • rostopic hz /토픽이름: 해당 토픽이 퍼블리시 되고 있는 주기(헤르츠)를 나타낸다.
  • rostopic info 토픽이름: 해당 토픽에 대한 정보를 출력한다.
  • rostopic type /토픽이름: 해당 토픽의 메시지 타입을 출력한다

  • rostopic pub /토픽이름/토픽타입 데이터
    • 토픽에 데이터를 직접 퍼블리시한다.
    • 필자는 배를 직접 움직이지 않고, 특정 위치에 배가 갔을 때 경로를 어떻게 생성하는지 알아보기 위해 사용했다. 가령, (0, 0)에 있다가 배가 (4, 5)로 갔다고 pub 해보고, 배가 (6, 5)에 있는 장애물을 피해 목적지까지 어떻게 경로를 생성하나 본 것이다.
    • 방법은 Latching, Once, Rate 3가지 모드가 있다. 아래는 간단한 사용법이다.
      • Latching 모드: ctrl + C로 강제종료 할 때까지 계속 사용자가 pub으로 입력한 내용을 퍼블리시한다.
      • Once 모드: 딱 한 번만 3초간 퍼블리시하고 rostopic pub 명령을 종료한다. 이전에 해당 토픽으로 쏘던 퍼블리셔가 있으면 다시 그 값으로 원상복귀될 것이다.
      • Rate 모드: 특정 주기(헤르츠)로 퍼블리시한다. 기본은 10hz이다.
    • 인자를 전달하는 방식도 여러 가지가 있다.
      • rostopic pub 토픽이름 토픽타입 데이터: 커맨드 라인(command line) 인자를 전달한다. 기본 모드이다.
      • rostopic echo 토픽1 | rostopic pub 토픽2 토픽타입: 파이프 입력(Piped input)을 사용한다. Rate 모드의 기본으로, 기본 헤르츠는 10hz로 한다. 토픽1은 pub의 입력이 되는 토픽이고, 토픽2는 쏴주고 싶은 값이다. 즉, 토픽1의 퍼블리시 값을 토픽2의 퍼블리시 값으로 하겠단 뜻이다.
    • 옵션 중 쓸 만한 것은 아래와 같다.
      • -r 헤르츠: Rate 모드를 활성화시킨다. 입력해준 헤르츠 숫자만큼 빠르기로 퍼블리시한다.
      • -1 또는 --once: Once 모드를 활성화시킨다.
    • pub로 직접 입력을 할 때 자료형이 header까지 포함해 매우 길 수 있으니, 사전에 자료형을 미리 확인해보는 것이 좋다.
$ 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

  • rosnode info /노드이름: 노드의 정보를 출력한다.
  • rosnode kill /노드이름: 해당 노드를 중단한다.
  • rosnode list: 현재 활성화되어 있는 노드 목록을 출력한다.

rosbag

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로 바꾸어주는 패키지를 이용하면 간편하게 이 기능을 이용할 수 있다.

4-3. ROS catkin 명령어

명령어설명
catkin_create_pkgcatkin_create_pkg 패키지이름 의존성 catkin 패키지 자동 생성
catkin_make캐킨 빌드 시스템 기반으로 빌드

위 명령어들은 다음 포스팅([ROS] 패키지 빌드와 노드 작성)에서 자세하게 다룬다.


5. 🙄기타 명령어

잘 쓰이는 도구를 불러오는 명령어 세 가지이다.

rqt

rqt는 주로 노드의 연결 상태를 보기 위해 사용하는 도구(패키지)이다.

  • rqt: rqt GUI 자체를 실행하는 명령어로, 실행하면 아무것도 안 보인다. 상단 바의 플러그인 등으로 원하는 것을 실행시킨다. 사실상 다짜고짜 이렇게는 잘 안 쓴다.
  • rqt_image_view: 연결되어 있는 카메라 등의 영상을 보여준다. realsense 카메라를 쓴다면 해당 툴을 실행시켜 볼 수도 있지만 rqt로도 가능한 기능이다. 플러그인을 통해 실행시킬 수도 있다.
  • rqt_graph: 가장 많이 사용하는 rqt 툴로, 노드와 토픽 사이의 관계를 그래프로 보여준다. 잘 퍼블리시&서브스크라이브 되고 있는지, 연결은 잘 되어 있는지를 확인하기에 매우 유용하다.
  • rqt_plot: 좌표 상에 데이터를 나타낸다.

rviz

Rviz 툴은 3차원으로 모델을 보여준다. 시뮬레이션도 가능한 툴이다.
필자는 IMU를 통한 이동 경로 추적에서 경로를 점으로 표시할 때 쓰거나, 센서들의 x, y, z 축을 확인하는 등의 용도로 사용하고 있었다.

  • rviz: roscore을 실행한 후에 해당 명령어를 입력하면 rviz GUI 창이 나온다.
  • rosrun rviz rviz: 위 명령어와 같은 명령이다.

code

앞선 포스팅에서 밝혔듯, VS Code를 실행하는 명령어이다.


참고자료

profile
🏫Inha Univ. Naval Architecture and Ocean Engineering & Computer Engineering (Undergraduate) / 🚢Autonomous Vehicles, 💡Machine Learning

0개의 댓글