09-17 16:42
Notice
Recent Posts
Recent Comments
반응형
관리 메뉴

BAN2ARU

[ROS2/FOXY] 튜토리얼 4. Understanding topics 본문

Study/ROS

[ROS2/FOXY] 튜토리얼 4. Understanding topics

밴나루 2023. 6. 5. 21:06

ROS-foxy 튜토리얼은 공식 홈페이지를 참조함

이전 튜토리얼 글 모음

 

목표 : rqt_graph를 활용하여 ROS2의 topics에 대해 알아보자

Background

ROS2는 복잡한 시스템을 여러개의 모듈식 node단위로 나눈다. Topic은 node들 간의 메시지를 주고받는 bus의 역할을 함으로 ROS 그래프에서 중요한 요소이다.

node는 여러 topic에 대해 data를 publish(게시)하고 subscibe(구독)할 수 있으며, 이러한 node들간의 통신을 제공하는 것이 Topic이라고 볼 수 있다.

Tasks

1. 설치

새로운 터미널을 열고 다음과 같은 명령어를 실행한다.

ros2 run turtlesim turtlesim_node

또 다른 터미널을 열고 다음과 같은 명령어를 실행한다.

ros2 run turtlesim turtle_teleop_key

Docker version

docker start [컨테이너명:ros_cyg]
docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 run turtlesim turtlesim_node"
# 새로운 터미널 오픈
docker attach [컨테이너명:ros_cyg]
ros2 run turtlesim turtle_teleop_key

2. rqt_graph

이번 시간에는 rqt_graph는 사용하여 노드와 토픽이 변화하는 것과 이들 사이의 연결을 시각화하여 볼 것이다. 이전에 설치한 rqt에는 rqt_graph가 포함되어 있으므로, 만약 rqt를 설치를 안한 경우에는 튜토리얼 2를 참고하기 바란다.

새로운 터미널을 열고 아래 명령어를 통해 rqt_graph를 실행한다.

rqt_graph

또는 rqt를 실행하고 Plugins > Introspection > Node Graph 를 통해 실행할 수도 있다.

Node Graph 밑에 Nodes only 버튼을 클릭하여 Nodes/Topics (active)로 바꾸면 현재 실행중인 노드와 토픽 정보를 확인할 수 있다. 그리고 토픽에 마우스를 두면 색이 변하는 것을 확인할 수 있으며, 이를 하이라이팅 기능이라고 한다.

그래프에서는 /turtlesim노드와 /teleop_turtle노드가 어떻게 토픽을 통해서 서로 통신하고 있는지를 보여준다. /teleop_turtle노드는 데이터(거북이를 움직이기 위해서 입력하는 키보드 입력)를 publish(발행)하고, /turtlesim 노드는 해당 토픽을 subscribe(구독)하여 데이터를 수신한다.

위와 같이 rqt_graph에서 하이라이팅기능은 복잡한 시스템에서 노드와 통신간의 연결 방식을 분석할 때 유용하다.

Dokcer version

새로운 터미널을 열고 아래 명령어를 통해 rqt_graph를 실행한다.

docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && rqt_graph"

3. ros2 topic list

새로운 터미널을 열고 ros2 topic list 을 실행하면 아래와 같이 현재 실행 중인 토픽리스트를 확인할 수 있다.

ros2 topic list

ros2 topic list -t는 똑같은 리스트를 반환하지만, 토픽 유형이 대괄호안에 포함되어 나타난다. 토픽 유형은 특정 메시지 유형을 나타내며, 해당 토픽을 통해 교환되는 데이터의 형식을 알 수 있다.

ros2 topic list -t

만약 rqt_graph의 모든 토픽들이 궁금하다면 hide 부분의 체크를 풀면 된다.

Dokcer version

새로운 터미널을 열고 ros2 topic list 를 실행한다.

docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 topic list"
docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 topic list -t"

4. ros2 topic echo

토픽에서 publish(발행)하는 데이터를 보기 위해서는 ros2 topic echo <topic_name>을 실행하면 된다. 이번에는 /teleop_turtle 이 /turtle1/cmd_vel  토픽을 통해 /turtlesim 노드에 데이터를 전달하는 것을 ros2 topic echo 를 통해 알아보자.

ros2 topic echo /turtle1/cmd_vel

명령어를 실행하면 아무런 데이터를 return하지 않을 것이다. 이는 아직 우리가 /teleop_turtle 에 아무런 데이터를 입력하지 않았기 때문이다. 그러면 turtle_teleop_key 가 실행하고 있는 터미널을 열어서 거북이를 움직여보자. 움직이기 시작하면 echo 를 실행한 터미널에 아래와 같이 움직인 값이 반환되는 것을 확인할 수 있다.

rqt_graph로 돌아가서 Debug box의 체크를 해제해보자. 그러면 /_ros2cli_166 이라는 echo명령어를 통해 생성한 노드를 확인할 수 있다. 아래와 같이 publisher가 cmd_vel 이라는 토픽을 통해 2개의 subscriber가 구독하고 있는 것을 확인할 수 있다.

Dokcer version

docker exec -it [컨테이너명:ros_cyg] /bin/bash
ros2 topic echo /turtle1/cmd_vel

5. ros2 topic info

토픽은 one-to-one 통신이 아니라 one-to-many, many-to-one, many-to-many 통신 일 수도 있다. 아래 명령어를 통해 이를 확인할 수 있다.

ros2 topic info /turtle1/cmd_vel

해당 토픽의 메시지 타입은 geometry_msgs/msg/Twist이며 Publisher는 1개 이고 Subscriber는 2개이다.

Docker version

새로운 터미널을 열고 아래 명령어를 실행한다.

docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 topic info /turtle1/cmd_vel"

6. ros2 interface show

노드는 메시지를 사용하여 토픽을 통해 데이터를 보낸다. Publisher와 Subscriber가 통신하려면 동일한 유형의 메시지를 주고받아야 한다.

ros2 topic list -t 를 통해 실행 중인 토픽에 대해 어떠한 메시지 유형이 사용되는지 확인할 수 있다. cmd_vel의 경우에는 geometry_msgs/msg/Twist라는 메시지 타입을 가지고 있다. 이는 geometry_msgs 패키지에 Twist 라 불리는 msg 가 있다는 의미이다.

이번에는 ros2 interface show <msg type> 을 실행하여 이에 대해 자세히 알아보자.

ros2 interface show geometry_msgs/msg/Twist

해당 메시지는 3개의 요소로 구성된 linear 벡터와 angular 벡터를 포함한다는 것을 의미한다. 이전에 echo 명령어를 통해 /teleop_turtle 노드에서 /turtlesim 노드로 아래와 같은 데이터가 전달되는 것을 확인한 적이 있다.

Docker version

docker exec [컨테이너명:ros_cyg] /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 interface show geometry_msgs/msg/Twist"

7. ros2 topic pub

메시지 구조를 기반으로 아래 명령어와 같이 직접 topic에 data를 publish할 수 있다.

ros2 topic pub <topic_name> <msg_type> '<args>'

'<args>' 는 선택적인 인수로, publish할 메시지의 값을 지정할 수있다. 즉, 실제로 topic에 전달될 데이터의 값이라고 할 수 있다. 해당 인수는 YAML 구문으로 작성되어야 한다.

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

--once 는 지정된 메시지를 한번만 publish하고 종료하는 동작을 수행하는 옵션이다. 명령어를 수행하면 터미널에 아래와 같은 값을 출력하고 거북이는 입력한대로 약간 회전하듯이 돈 것을 확인할 수 있다.

만약 한번이아닌 지속적으로 움직이게 할려면 아래와 같은 명령어를 실행하면 된다.

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

이전 명령어에서 --once 를 제외하고 --rate 1 옵션을 추가한것이다.--rate 는 메시지 게시 속도를 지정하는 옵션으로 --rate 1은 초당 1개의 메시지(1hz)를 게시하라는 의미이다.

rqt_graph를 새로 고침하여 노드와 토픽에 대해 시각화하여 볼 수 있다. ros2 topic pub ... 노드(/_ros2cli_368)에서 publish하고 있는 /turtle1/cmd_vel토픽에 대해 echo 노드(/_ros2cli_166)와 /turtlesim 에서 수신하고 있음 알 수 있다.

마지막으로 pose 토픽에 echo를 실행하고 rqt_graph를 확인해보자.

ros2 topic echo /turtle1/pose

/turtlesim노드가 publish한 pose 토픽에 대해 새로운 echo 노드가 구독(subscribe) 중인 것을 확인할 수 있다.

Docker version

새로운 터미널을 열고 다음 명령어를 실행하여주자

docker exec -it [컨테이너명:ros_cyg] /bin/bash
ros2 topic echo /turtle1/pose

8. ros2 topic hz

ros2 topic hz를 통해 특정한 토픽의 publish하는 속도를 측정할 수 있다.

ros2 topic hz /turtle1/pose

/turtlesim 노드가 pose 토픽에 대해 데이터를 publish하는 속도를 볼 수 있다.

만약 우리가 --rate 1 옵션을 준 turtle1/cmd_vel 을 실행시키면 평균 속도가 1로 1hz 속도로 publish되는 것을 확인할 수 있다.

Docker version

docker exec -it [컨테이너명:ros_cyg] /bin/bash
ros2 topic hz /turtle1/pose
ros2 topic hz /turtle1/cmd_vel

9. Clean up

현재 많은 노드들이 실행중일 것이다. 각 터미널에 Ctrl+C 을 실행하여 중지시켜 주자.

Summary

노드는 토픽에 메시지를 게시하고, 이를 다른 노드가 해당 토픽을 구독하여 메시지를 수신하는 방식으로 토픽을 통해 노드 간의 데이터를 교환할 수 있다.

rqt_graph를 통해 노드와 토픽 간의 상호 작용을 시각적으로 표현할 수 있다.

728x90
Comments