본문 바로가기

ROS

Linux, ROS 주요 명령어

SMALL

1. Linux 주요 명령어

명령어 약어/뜻 설명
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.. : 상위 디렉토리로 이동
  • cd / 경로 : 특정 경로로 이동

절대경로와 상대경로

. 은 현재 디렉토리, ..은 바로 상위 디렉토리를 의미합니다.

예를 들어, 내가 지금 /America/Canada 에 있다고 하면, cd../America/USA/LA 이면, 상위 디렉토리인 America로 이동한 후, 그 하위 디렉토리인 /America/USA/LA로 이동하게 됩니다.

 

 

  • ls

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

 

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

명령어 뒤에 대시 ( - )가 있다면 옵션이란 뜻입니다.

옵션은 복수 개를 사용할 수 있고, 선언 순서는 상관 없습니다. -la , -al 어떤 것이여도 '숨긴 파일까지 상세하게 출력하라'라는 뜻으로 해석이 됩니다.

 

 

  • mkdir

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

mkdir test1       #test1이라는 디렉토리를 만듦

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

 

  • echo

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

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

$ echo $var1	#var1을 출력함
200

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

 

  • grep

파일 혹은 입력으로 주어진 어떤 것에서 문자열을 검색하는 방법입니다.

파이프라인 기능을 이용해서 앞에서의 출력을 대상으로 검색하기도 합니다. 

'grep 옵션 패턴 파일' 형태로 사용합니다. 옵션은 생략이 가능하며, '패턴'은 찾으려는 조건에 해당하고, '파일'은 검색하는 위치(대상)입니다.

$ grep "ABC" test.txt    		#test.txt 에서 ABC문자열을 검색해 출력
$ cat /proc/meminfo | grep MemFree #/proc/meminfo 파일에서 MemFree를 찾아 출력
MemFree:		12825929 kB

 

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. 특정 상황에 자주 쓰이는 명령어

 

자율운항보트 대회를 준비하며 많이 쓰였던 것들을 회상하며, 상황 별로 명령어(구)를 정리했다.

수가 많지는 않으며, 앞으로 계속 업데이트 해 나갈 예정입니다.

 

  • 센서 연결 확인하기

USB 등으로 센서를 연결했다면, 'ls' 명령어로 연결이 되었는지 확인할 수 있습니다.

$ ls /dev/ttyACM
$ ls /dev/ttyUSB
$ ls /dev/tty*

참고로, dev는 device의 약어입니다.

맨 마지막 줄을 보자면, tty로 연결된 모든 목록이 뜹니다. ls는 모든 파일과 디렉토리를 출력하므로 /dev폴더에 있는 tty로 시작하는 모든 목록을 출력하는 것입니다.

※ tty(Teletypewriter)

리눅스의 드라이브 중 콘솔/터미널을 의미합니다.

콘솔(Cosol)은 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 : 권한 부여하기

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

- 사용법 : chmod 옵션 모드 파일

- 파일에 권한 부여:

    => 본인이 작성한 혹은 다운로드 받은 스크립트 파일을 실행하려면 실행 권한을 파일에 주어야 합니다.

    => 스크립트 파일이 있는 폴더에서 ls를 해보면 권한이 있는 파일은 굵은 글씨로 색이 덧입혀서 출력되고, 그렇지 않은 파일은 일반 흰 글자로 출력이 됩니다. 아래 사진에서 권한 부여 전과 후를 비교해봅시다.

 

- 연결한 센서 등에 권한 부여

     => USB 등으로 연결한 센서들을 위에서 확인했다면, 이에도 권한을 부여해야 사용할 수 있습니다.

     => 스크립트에 권한을 부여한 것과는 다르게, 권한을 부여하려면 추가적인 '사용자'의  권한이 필요해 sudo 명령어로 선언해줘야 합니다.

 

sudo chmod 777 /dev/tty*    #tty로 연결된 모든 것에 권한을 부여함

 

 

  • 파일 권한

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

 

파일은 user/group/others 별로 read , write, execute 세 가지 권한을 부여할 수 있습니다.

 

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

   => 맨 앞 ' - ' 기호가 있다면 그것은 파일(file) 이란 뜻이고, 대신 d로 시작하면 그것은 디렉토리(directory)라는 뜻입니다.

   => 맨 앞 한 문자를 제외하면 r, w, x, - 조합의 9개 길이의 문자가 나옵니다.

   => 세 개씩 끊어 앞에서부터 user(소유자, owner)에 대한 권한, group(그룹)에 대한 권한, others(나머지 사용자)에 대한 권한을 의미합니다.

   => 세 문자를 각각 8진수로 표현하면 r=4, w=2, x=1이며, 이를 모두 더하면 7입니다.

             -> 위에서 모드를 777이라고 했다면 모든 사용자에 대해 모든 권한을 부여한 것입니다.

   => +/- 로 직접 권한을 주거나 뺏을 수도 있습니다.

             -> 위에서 모드를 +x 라고 했으니 모든 사용자에게 해당 파일에 대해 실행할 수 있는 권한을 부여한단 의미입니다.

 

 

4. ROS 명령어

 

- ROS 실행 명령어

 

명령어 설명
roscore ROS master 구동
rosrun rosrun 패키지 노드 실행
roslaunch roslaunch 패키지 런치이름 launch 파일 실행 (노드 여러 개)

아래는 간단한 예시입니다.

$ roscore
	# 단독으로 한 터미널에 실행해야 합니다.

$ rosrun test_pkg test_script.py
	#test_pkg 패키지의 test_script.py를 실행함

$ roslaunch test_pkg test_launch.launch
	#test_pkg 패키지의 test_launch.launch를 실행합니다.

 

- ROS 정보 명령어

명령어 설명
rostopic ROS 토픽 정보 확인
rosnode ROS 노드 정보 확인
rosparam ROS 파라미터 정보 확인 및 수정
rosbag ROS 메시지 기록 및 재생
rosmsg ROS 메시지 정보 확인

 

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 play : bag 파일들의 내용을 재생합니다. 기록했던 것과 똑같이 상황을 재현합니다.

  • rosbag play bag파일1 bag파일2 ... : 해당 bag 파일의 내용을 재생합니다.
  • rosbag play bag파일 --topics /토픽1 /토픽2 ... : 해당 bag파일 중 특정 토픽들에 대해서만 재생합니다.

 

※ bag 파일을 csv로 바꾸는 방법

.bag 파일은 ROS나 리눅스 내에서 기록에 매우 편리하지만, 이를 우리가 익숙한 툴, 즉 엑셀로 바꾸어 처리할 수 있다면 더욱 좋을 것입니다.

때문에 .bag 파일을 .csv로 바꾸어주는 패키지를 이용하면 간편하게 이 기능을 이용할 수 있습니다.

 

 - ROS catkin 명령어

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

 

 

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 : 위 명령어와 같은 명령입니다.

LIST

'ROS' 카테고리의 다른 글

package 빌드와 node 작성  (0) 2023.02.22
ROS 기본  (0) 2023.02.13