ROS STUDY #2: ROS 기본 개념, 명령어

  • 노드(Node): 최소 단위의 실행 가능한 프로세스로, 하나의 실행 가능한 프로그램으로 생각하면 된다. 각 노드는 메시지 통신으로 데이터를 주고받는다. 노드를 사용하면 하나의 노드에서 오류가 발생했을 때 다른 노드까지 영향이 가지 않는 이점이 있다.
  • 패키지(Package): 하나 이상의 노드, 노드 실행에 필요한 정보를 묶어 놓은 것. 패키지의 묶음은 메타패키지라 한다.
  • 메시지(Message): 노드 간 주고받는 변수 형태의 데이터. 메시지나 메시지의 배열 등의 구조를 메시지로 사용할 수 있다.

메시지의 종류에는 토픽, 서비스, 액션 세 가지가 있다.

종류 동기 방향 사용
Topic 비동기 단방향 연속으로 데이터를 송수신
Service 동기 양방향 요청 처리가 순간적(1회성); 현재 상태를 확인하고 응답받는 것이 필요한 경우
Action 비동기 양방향 요청 처리 후 응답까지 오래 걸려서 서비스를 이용하기 어려운 경우, 중간 피드백값이 필요한 경우

토픽은 실시간으로 전송되는 단방향성 메시지이다. 퍼블리셔나 서브스크라이버가 중지하지 않는 이상 메시지를 계속 보낸다.
이러한 특성 때문에 로봇의 상태나 센서 메시지 등을 보낼 때 토픽을 많이 사용한다.

서비스는 1회성의 메시지이다. 토픽에서는 동등한 지위의 두 개의 노드간에 통신이 이루어졌지만, 서비스는 서비스 서버와 클라이언트 사이에서 통신이 이루어진다.
서비스 클라이언트는 서비스를 요청하는 입장이고, 서비스 서버는 서비스를 요청받아 정해진 프로세스를 수행하고 응답하는 역할이다.
요청과 응답을 수행하면, 서로의 접속을 끊으므로, 다시 필요하면 접속부터 새롭게 진행해야 한다.
1회성이라는 특징때문에, 로봇에 1회성 행동 명령을 내려야 하는 경우 많이 사용된다.

액션은 서비스에서 중간 결과값을 보고하는 부분이 추가된 통신이다. 서비스를 기반으로 만들어진 통신이라 생각하기 쉽지만, 실제로는 토픽을 바탕으로 구동된다.
서비스와는 다르게 클라이언트에서 취소명령을 보내거나, 서버에서 결과값을 보내면 접속이 종료된다.

roscore

모든 ros 노드들에 대한 정보 중계를 담당.
각 노드들이 서로의 존재를 인식하게 하는 역할만 담당하고, 이후는 노드들끼리 직접 통신한다. 즉, 모든 통신이 roscore를 거치는 것은 아니다.

rosrun 패키지이름 노드이름
Subscriber나 Client를 따로 임의로 실행시킬 때 사용한다. 서브스크라이버 노드는 구동과 함께 마스터에 자신의 노드 이름과 메시지 형태, URI 주소 등 각종 정보를 등록한다.

rosrun 패키지이름 노드이름
Publisher나 Server를 따로 임의로 실행시킬 때 사용한다. 퍼블리셔 노드도 위와 마찬가지로 구동과 함께 마스터에 각종 정보를 등록한다.

마스터는 서브스크라이버 노드에게 새로운 퍼블리셔 정보를 알린다.

서브스크라이버 노드는 마스터로부터 받은 퍼블리셔 정보를 이용해 퍼블리셔 노드에게 직접 접속을 요청한다.

퍼블리셔 노드는 서브스크라이버 노드의 접속에 응답하여 자신의 URI 주소와 포트번호를 전송한다.

TCPROS를 이용하여 서브스크라이버 노드와 퍼블리셔 노드가 직접 연결된다.

토픽, 서비스, 액션으로 메시지를 송·수신한다.

다음은 ROS에서 주로 사용되는 명령어이다.

명령어 중요도(사용빈도) 의미 기능
roscd ★★★ ros+cd(change directory) 지정한 ROS 패키지의 디렉터리로 이동
rosls ★☆☆ ros+ls(list files) ROS 패키지의 파일 목록 확인
roscp ★☆☆ ros+cp(copy files) ROS 패키지의 파일 복사
명령어 중요도(사용빈도) 의미 기능
roscore ★★★ ros+core
rosrun ★★★ ros+run 노드 실행
roslaunch ★★★ ros+launch 노드를 여러 개 실행 및 실행 옵션 설정
rosclean ★★☆ ros+clean ROS 로그 파일을 검사하거나 삭제
명령어 중요도(사용빈도) 기능
rosnode list ☆☆☆ 활성화된 노드 목록 확인
rostopic list ☆☆☆ 활성화된 토픽 목록 표시
rosservice list ☆☆☆ 활성화된 서비스 정보 출력
명령어 중요도(사용빈도) 기능
catkin_create_pkg ★★★ 패키지 자동 생성
catkin_make ★★★ 캐킨 빌드 시스템에 기반을 둔 빌드
catkin_init_workspace ★★☆ 캐킨 빌드 시스템의 작업 폴더 초기화
catkin_find ★☆☆ 캐킨 검색
명령어 중요도(사용빈도) 의미 기능
rospack ★★★ ros+pack(age) ROS 패키지와 관련된 정보 보기
rosinstall ★★☆ ros+install ROS 추가 패키지 설치
rosdep ★★☆ ros+dep(endencies) 해당 패키지의 의존성 파일 설치

출처: 05_ROS_명령어.pdf
더 많은 명령어: ROS 명령어

turtlesim 패키지로 배운 내용을 적용해 보자.

이 예제는 터미널 창 3개를 띄우고 시작한다.

먼저, 마스터를 구동한다.

roscore

그 다음으로, turtlesim 패키지의 turtlesim_node 서브스크라이버 노드를 구동한다.

rosrun turtlesim turtlesim_node

turtlesim 패키지에서 키보드 입력을 받는 turtle_teleop_key 퍼블리셔 노드를 구동한다.

rosrun turtlesim turtle_teleop_key

이제 토픽으로 메시지가 전송되어 키보드의 방향키 입력이 실시간으로 거북이의 움직임에 반영된다.
키보드의 방향키를 이용해 거북이를 움직여보자.
↑: 전진 ↓: 후진 ←: 좌로 회전 →: 우로 회전

계기판.
각종 변수 값, 노드 간 통신상태 확인 및 Topic 수동 조회 등이 가능하다.

위의 turtlesim 예제를 실행한 상태로 노드 그래프를 생성해보자.

rqt_graph

  • activity/public/2021/ros/2.txt
  • 마지막으로 수정됨: 3년 전
  • 저자 yhy01625