[ROS 튜토리얼] 1.1.6 ROS의 토픽(topic)에 대한 이해

    Note : 이 튜토리얼은 이전의 understanding ROS nodes 튜토리얼을 학습했다고 가정한 후 작성된 튜토리얼이다.

    이 튜토리얼에 관련된 문제 및 질문은 answers.ros.org에서 확인할 것. 질문 작성시, 이 튜토리얼 페이지에 대한 링크, OS & ROS 버전 및 적절한 태그를 추가할 것.

    Understanding ROS Topics

    • Description : 이 튜토리얼은 ROS topic에 대해 소개하고 커맨드라인 툴인 rostopic과 rqt_plot의 사용법에 대해 다룰 것이다.
    • Tutorial Level : BEGINNER
    • Next Tutorial : Understanding ROS services and parameters

    1. Setup

    1.1 roscore

    시작하기에 앞서, 새로운 터미널에서 roscore가 실행되고 있는지 확인한다.

    roscore

    이전의 튜토리얼에서 roscore를 종료하지 않고 그대로 이어서 하는 중이라면, 다음과 같은 에러 메시지를 볼 수 있을 것이다.

    roscore cannot run as another roscore/master is already running. 
    Please kill other roscore/master processes before relaunching

    하나의 roscore만 구동되면 되기 때문에 괜찮다.

     

    1.2 turtlesim

    해당 튜토리얼을 진행하려면 turtlesim을 사용해야 한다. 새로운 터미널에서 다음을 입력하여 turtlesim을 실행한다.

    rosrun turtlesim turtlesim_node

    terminator를 사용중이라면, [ctrl]+[shift]+O를 통해 수평 분할하여 새로운 창을 추가할 수 있다.

     

    1.3 turtle keyboard teleoperation

    거북이를 움직일 무언가(여기서는 드라이버)가 필요하다. 새로운 터미널에서 다음과 같이 입력한다.

    rosrun turtlesim turtle_teleop_key

    이제 키보드의 방향키를 사용하여 거북이를 이동시킬 수 있다. 만약 거북이가 움직이지 않는다면, /teleop_turtle 노드가 실행중인 터미널창을 클릭(활성화)한 상태에서 방향키를 입력하여 기록(record)할 수 있게 해준다.

    이제 거북이를 움직일 수 있게 되었고, 뒤에서 어떤 일이 벌어지고 있는지를 살펴볼 것이다.

     


     

    2. ROS Topics

    ROS의 토픽(topic)을 통해 /turtlesim/teleop_turtle 노드가 통신을 주고 받는다. /teleop_turtle 노드는 키 입력(stroke)을 토픽에 게시(publish)하고, 동시에 /turtlesim 노드는 같은 토픽을 구독(subscribe)하여 키 입력을 수신한다. rqt_graph를 사용하여 현재 구동되고 있는 노드와 토픽을 확인할 수 있다.

     

    2.1 Using rqt_graph

    rqt_graph는 ROS 시스템에서 어떤 일이 벌어지고 있는지 동적 그래프(dynamic graph)를 생성해준다. rqt_graphrqt 패키지의 일부이다. 아직 rqt가 설치되지 않았다면 아래의 명령어를 통해 설치해준다.

    (터미널에서 rqt를 입력하여 무언가 실행된다면 이미 설치된 것이다.)

    sudo apt-get install ros-<distro>-rqt
    sudo apt-get install ros-<distro>-rqt-common-plugins

    위의 <distro> 부분을 자신의 ROS 배포판에 맞게 대체하여 입력하면 된다. (예. indigo, jade, kinetic, lunar 등...)

     

    새로운 터미널에서 다음을 입력한다.

    rosrun rqt_graph rqt_graph

    이와 같은 프로그램이 실행된 것을 볼 수 있을것이다.

    /turtle1/cmd_vel 위에 마우스를 올려놓아보면 아래와 같이 ROS 노드(파란색, 초록색)와 토픽(빨간색)이 하이라이트되는 것을 볼 수 있다. 이와 같이 두 노드가 /turtle1/cmd_vel 토픽을 통해 통신한다는 것을 가시적으로 확인할 수 있다.

     

    2.2 Introducing rostopic

    rostopic 툴은 토픽에 대한 정보를 제공해준다. help 옵션(-h 혹은 --help)을 사용하여 rostopic과 함께 사용가능한 sub-command를 확인 가능하다.

    rostopic -h
    conceptbug95@ubuntu-linux-ongoing:~$ rostopic --help
    rostopic is a command-line tool for printing information about ROS Topics.
    
    Commands:
        rostopic bw    display bandwidth used by topic
        rostopic delay    display delay of topic from timestamp in header
        rostopic echo    print messages to screen
        rostopic find    find topics by type
        rostopic hz    display publishing rate of topic    
        rostopic info    print information about active topic
        rostopic list    list active topics
        rostopic pub    publish data to topic
        rostopic type    print topic or field type
    
    Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

    아니면, rostopic을 입력한 후 탭(tab) 키를 눌러보면 사용 가능한 sub-command들을 출력해준다.

    이제 rostopic의 몇몇 sub-command를 사용하여 turtlesim을 테스트해 볼 것이다.

     

    2.3 Using rostopic echo

    rostopic echo는 토픽에 게시되고 있는 데이터를 보여준다.

    사용법 :

    rostopic echo [TOPIC_NAME]

    이 명령어를 통해 /teleop_turtle 노드가 게시하는 속도 명령(command velocity) 데이터를 살펴본다. 새로운 터미널에서 다음과 같이 입력한다.

    rostopic echo /turtle1/cmd_vel

    현재 해당 토픽에 게시되고 있는 데이터가 없기 때문에, 위 명령어를 실행해도 아무것도 보이지 않을 것이다. 이제 앞서 방향키를 입력하여 거북이를 움직였던 것과 똑같이 키를 입력하여 데이터를 게시해보자. 거북이가 움직이지 않는다면 /teleop_turtle 노드가 실행된 터미널을 활성화하는 것을 잊지 않도록 한다.

    "---"로 구분된 부분이 1회 구독했을때 들어오는 토픽이다. 즉 위의 캡쳐는 2회분의 토픽을 보고 있는 것이다.

    rqt_graph를 다시 살펴보자. 새로운 노드를 보기 위해 왼쪽 상단의 refresh(새로고침) 버튼을 누른다.

    되돌리기 모양의 버튼이 refresh 버튼이다.

    이미 rostopic echo 명령어를 통해 확인할 수 있었던 것 처럼, 새로운 노드가 생겨난 것을 볼 수 있다. 아래 초록색으로 보이는 새로운 노드인 /rostopic_21585_1617333833661는 현재 터미널에서 rostopic echo 명령어로 구동중인 노드다.

    보기 옵션을 바꾸면 이렇게 같은 토픽이 여러 노드에서 구독중이라는 사실을 좀 더 객관적으로 살펴볼 수 있다.

     

    2.4 Using rostopic list

    rostopic list 명령어를 사용해 현재 구독 및 발행중인 모든 토픽의 리스트를 받아볼 수 있다. list의 sub-command가 어떤 인수를 필요로 하는지 알아볼 것이다. 새 터미널을 실행하여 다음을 입력한다.

    rostopic list -h

    예를 들어 아래는 verbose 옵션을 사용했을때다.

     


     

    3. ROS Message

    토픽을 통한 통신은 노드와 노드간에 ROS message를 주고 받으면서 이루어진다. 현재 진행중인 튜토리얼을 예로 들어서 설명을 해보겠다. 해당 튜토리얼에 비유하자면 publisher(게시자)는 /teleop_turtle 노드에 해당되고, subcriber(구독자)는 /turtlesim 노드에 해당된다. 이 publisher와 subscriber가 상호 통신을 하려면 반드시 같은 type의 메시지를 주고 받아야 한다. 이는 publish 되는 메시지 type에 따라 토픽의 type이 정의된다는 의미다. 토픽을 통해 전송되는 메시지의 typerostopic tpye 명령어를 통해 확인 가능하다.

     

    3.1 Using rostopic type

    rostopic type 명령어는 publish되고 있는 토픽의 메시지 타입을 반환한다.

    사용법 :

    rostopic type [TOPIC_NAME]

    아래와 같이 입력한다.

    rostopic type /turtle1/cmd_vel

    그러면 다음과 같은 결과를 반환받을 것이다.

    geometry_msgs/Twist

    rosmsg 명령어를 사용하여 메시지의 세부 사항을 살펴볼 수 있다.

    rosmsg show geometry_msgs/Twist

    이렇게 turtlesim 노드가 어떤 타입의 메시지를 기대(expect)하는지 알았으니, 이제 turtlesim의 거북이에게 명령을 publish 할 수 있다.

     


     

    4. rostopic continued

    이제까지 ROS message에 대해 배워보았다. 메시지와 함께 rostopic을 사용해볼 것이다.

     

    4.1 Using rostopic pub

    rostopic pub 명령어를 사용하여 현재 advertise중인 토픽에 데이터를 publish 가능하다.

    사용법 :

    rostopic pub [topic] [msg_type] [args]

    해당 명령어로 거북이를 움직이기 위해 아래와 같이 입력해본다.

    rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist "linear:
      x: 2.0
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: 1.8"

    위의 명령어를 모두 직접 입력할 필요없이, 탭(tab)키를 이용해 자동완성할 수 있다. 처음에는 모든 값이 모두 0으로 나올 것인데, 이를 방향키로 이동하여 값을 바꿔주면 된다. 위의 값은 거북이의 선속도(linear) 및 각속도(angular)를 입력해 이동시킨 것이다. 각속도는 거북이의 머리(heading)방향이라고 생각하면 된다. -1 값은 토픽을 1회만 publish 하겠다는 의미로, 설정하지 않으면 무한히 반복된다.

    (지금 보고 있는 공간은 3차원 공간이 아니기 때문에 linear는 x, y값만, angular는 z값만 수정 가능할 것이다. 이 값들을 제외하고 나머지 값들을 수정하여 거북이를 움직여볼 수 있다.)

     

    위의 명령어대로 입력하면 거북이가 원을 1/4 정도만 그리다 만 것을 볼 수 있을 것이다. 이는 거북이가 계속해서 움직이기 위해서는 '1 Hz'의 꾸준한 명령값(steady stream of commands)을 필요로 하기 때문이다. 이렇게 특정한 rate의 토픽을 요구하는 상황에서는 -r 옵션을 사용해 publish 가능하다. 아래와 같이 -r 옵션과 함께 입력해본다.

    rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist "linear:
      x: 2.0
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: 1.8"

    위와 같이 거북이가 계속해서 원을 그리는 것을 볼 수 있다.

     

    rqt_graph를 통해서도 확인 가능하다.

    1Hz로 publish되는 것을 확인할 수 있다.

     

    4.2 Using rostopic hz

    rostopic hz 명령어는 특정 토픽이 publish되는 rate[Hz]를 알려준다.

    사용법 :

    rostopic hz [TOPIC_NAME]

    다음과 같이 현재 publish되는 /turtle1/pose 토픽의 rate를 알아볼 것이다.

    이와 같이 /turtle1/pose 토픽이 약 62Hz 정도로 publish되고 있다는 것을 확인할 수 있다.

     


     

    5. Using rqt_plot

    (ROS Electric 및 이전의 버전은 rqt를 사용할 수 없으므로 rxplot을 사용할 것.)

    rqt\_plot은 토픽에 publish된 데이터의 시간 그래프(scrolling time plot)를 보여준다. 여기서는 /turtle1/pose 토픽에 publish 되고 있는 데이터를 표시해볼 것이다.

     

    새로운 터미널창을 열고 아래와 같이 입력하여 시작한다. (현재 거북이는 계속해서 원주 운동을 하는 상태다.)

    rosrun rqt_plot rqt_plot

    아직 토픽을 추가하지 않았기 때문에 어떠한 아이템도 display되지 않는다.

    위와 같은 새로운 창이 생겨나고, 좌측 상단 부분에 토픽을 추가할 수 있는 기능이 있다. /turtle1/pose/x/turtle1/pose/y 토픽을 입력하여 각각 추가해본다. 아래와 같은 결과를 볼 수 있을 것이다.

    plot 창을 더 키우면 현재 값도 볼 수 있다.

    토픽 추가는 플러스 버튼을 눌러서 했고, "마이너스 버튼은 현재 모니터링중인 토픽을 숨기는(hide) 기능이다"라고 튜토리얼은 설명하는데, 실제로는 '삭제'가 맞다. 2개 토픽을 모두 삭제한다.

    새로운 토픽인 /turtle1/pose/theta를 추가한다.

    여기까지가 이번 튜토리얼에서 다룰 범위다. 해당 섹션은 어디까지나 topic을 다루는 '툴 사용법'에 초점을 맞춘 것이므로, 이것 저것 계속해서 버튼도 눌러보고, 다른 값도 넣어보고 하는것을 추천한다. 튜토리얼에서 언급하지 않은 기능들도 접해 봐야 나중에 자유 자재로 툴을 다룰 수 있을 것이다. 참고로 마지막 rqt_plot은 잘만 사용하면 유사 오실로스코프로도 사용 가능하다.

    댓글

    Designed by JB FACTORY