[ROS2] "혼자 공부하는 로봇 SW" 책을 읽으며 알게 된 기본 개념 정리 / 토픽 발행 및 구독
아래 책 내용 발췌정리
토픽 구독(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)
이 명령을 실행할 때마다 토픽이 발행되고, 이를 구독하는 노드가 있다면 콜백함수를 호출할 것이다.
'로보틱스' 카테고리의 다른 글
[도커/Docker] 도커 run 실행 후 실행 중인 컨테이너에 접속하는 명령어 (2) | 2024.12.23 |
---|---|
[ROS2] sensor_msgs/msg/PointCloud2 Message (0) | 2024.12.12 |
[ROS2] bag 파일 열고 보는 방법 (0) | 2024.12.10 |
[ROS2] "혼자 공부하는 로봇 SW" 책을 읽으며 알게 된 기본 개념 정리 -1- (1) | 2024.11.29 |
[개념 정리] SLAM을 공부하면서 알게 된 개념 정리 (0) | 2024.11.25 |