본문 바로가기
  • AI 개발자가 될래요
로보틱스

[ROS2] "혼자 공부하는 로봇 SW" 책을 읽으며 알게 된 기본 개념 정리 -2-

by 꿀개 2024. 12. 3.

[ROS2] "혼자 공부하는 로봇 SW" 책을 읽으며 알게 된 기본 개념 정리 / 토픽 발행 및 구독

 

아래 책 내용 발췌정리

https://search.shopping.naver.com/book/catalog/34288483629?cat_id=50010921&frm=PBOKPRO&query=%ED%98%BC%EC%9E%90+%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94+%EB%A1%9C%EB%B4%87+sw&NaPm=ct%3Dm4232d54%7Cci%3D480a7e65c8f563f51042daabffe31bcbe1f7ee33%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3De51235dfe1d314395aad1367b206ffdd719e5b93

 

ROS2 혼자공부하는 로봇SW 직접 만들고 코딩하자 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

 

토픽 구독(subscribe)하는 법

 

예시로 설명한다.

rclpy와 구독할 토픽의 데이터 타입인 Pose를 import하고, 초기화 및 노드를 선언한다.

import rclpy as rp
from turtlesim.msg import Pose

rp.init()
test_node = rp.create_node('sub_test')

*rclpy: Ros Client Library for Python, 파이썬을 위한 ros 클라이언트 라이브러리

 

여기에서는 예시로 Pose를 구독하지만, 이 외에 원하는 토픽의 데이터 타입이 무엇인지 알기 위해서는 topic list -t 혹은 topic info를 보면 된다.

 

Callback 함수 설정

이제 구독한 토픽이 들어왔을 때 호출될 함수를 정의하자.

아래처럼 "callback"이라는 이름으로 Pose 데이터만큼 이동하는 함수를 선언한다.

def callback(data):
    print("--->")
    print("/turtle1/pose : ", data)
    print("X : ", data.x)
    print("Y : ", data.y)
    print("Theta : ", data.theta)

 

 

subscriber 만들기

이제 아래 같은 형식의 코드를 추가하여 subscriber를 만든다. Qos History는 저장할 샘플의 수이다.

test_node.create_subscription(<data_type>, '<topic_name>', <callback>, <Qos History>)

 

예를 들면 아래와 같다.

test_node.create_subscription(Pose, '/turtle1/pose', callback, 10)

 

마지막으로 아래 코드를 추가하면 해당 노드를 구독할 수 있다. spin_once는 한 번만 구독하는 명령이다.

rp.spin_once(test_node)

 

 

토픽 발행(publish)하는 법

위와 비슷한 방식으로 모듈을 import하고 초기화한다. 이 예시에서는 Twist 데이터 타입을 발행할 것이다.

import rclpy as rp
from geometry_msgs.msg import Twist

rp.init()
test_node = rp.create_node('pub_test')

 

Twist 메세지를 msg라는 변수에 저장한다.

Twist 데이터는 3차원 벡터 linear, angular 두 개가 각각 x, y, z 값을 갖고 있다.

linear의 x 값을 2.0으로 바꾼다.

msg = Twist()
msg.linear.x = 2.0

 

publisher 만들기

토픽을 발행하는 것과 관련된 기능, 설정을 지정하는 변수(pub)을 만든다.

pub = test_node.create_publisher(Twist, '/turtle1/cmd_vel', 10)

 

이제 Twist 타입의 msg를 발행하기 위해 아래 명령을 작성한다.

pub.publish(msg)

 

이 명령을 실행할 때마다 토픽이 발행되고, 이를 구독하는 노드가 있다면 콜백함수를 호출할 것이다.