티스토리 뷰
터틀심 pose 구독하기 subscribe
ros2 run to
import rclpy as rp
from turtlesim.msg import Pose
rp.init()
test_node = rp.create_node('sub_test')
def callback(data):
print("--->")
print("/turtle/pose: ",data)
test_node.create_subscription(Pose, '/turtle1/pose', callback, 10)
rp.spin_once(test_node)
코드 해석
더보기
<주피터 노트북에서 실행>
rp.init() 으로 초기화
rp.create_node 로 노드 생성
.create_subscription 으로 메세지 구독
- .create_subscription(데이터 타입, 토픽 이름, 실행할 함수, 10)
- 처음에 import한 데이터 타입의 /turtle1/pose 토픽
- create_subscription 함수는 토픽이 들어올때마다 실행할 함수를 넣어줘야 함
rp.spin_once(test_node)
- 만들었던 노드를 실행
- 일반적으로 rp.spin()으로 노드를 계속 실행하여 토픽을 받음
topic 횟수 제한하기
횟수를 정해서 실행하고 싶을 때는 카운터 변수를 이용하면 좋음
카운터 변수를 만들고 callback 함수 안에서 전역(global)로 선언한 후
일정 횟수 이상 callback 하면 Exception이 일어나도록 하여 제한함
cnt =0 def callback(data): global cnt cnt+=1 print("--->") print("/turtle/pose: ",data) if cnt>3: raise Exception("Subsription stop")
이처럼 콜백 함수를 수정할 수 있음
cmd_vel 토픽 발행하기 publish
import rclpy as rp
from geometry_msgs.msg import Twist
rp.init()
test_node=rp.create_node('pub_test')
msg = Twist()
msg.linear.x=2.0
pub = test_node.create_publisher(Twist, '/turtle1/cmd_vel', 10)
pub.publish(msg)
코드해석
Twist() 클래스의 객체를 만듦
노드에서 publisher를 만드는 함수로 cmd_vel 토픽을 발행하는 pub을 만들고
pub.publish로 발행할 수 있다.
여러 번 publish하기 위한 방법
일반적으로 여러번 발행하기 위해서는 callback 함수를 만들고
해당 함수에서 pub.publish(msg) 를 수행하도록 한다.
그리고 create_timer 함수를 이용해 일정 주기로 callback 함수를 실행하도록 한다.
cnt = 0
def timer_callback():
global cnt
cnt += 1
pub.publish(msg)
if cnt > 3:
raise Exception("publish stop")
timer_period = 0.1
timer = test_node.create_timer(timer_period, timer_callback)
rp.spin(test_node)
구독 sub 과 발행 pub 비교
똑같이 rp.create_node('노드이름') 으로 노드를 만들고 시작 test_node=rp.create_node('test') |
|
sub | pub |
만든 노드에 있는 .create_subscription 함수로 토픽을 구독하고 callback 함수를 호출 test_node.create_subscription(~, ~, ~, ~) |
만든 노드에 있는 .create_publisher 함수로 새로운 변수 선언 pub = test_node.create_publisher(~, ~, ~) |
발행할 메세지 클래스의 객체 선언 msg=Twist() | |
만든 변수에 있는 .publish() 함수로 토픽 발행 pub.publish(msg) |
|
만든 노드에 있는 .create_timer 함수로 callback 함수 호출 일반적으로 callback 함수에서 publish 하도록 설정 timer = test_node.create_timer(~,~) |
|
rp.spin(test_node) | |
구독은 노드에서 바로 구독함과 동시에 콜백함수 실행하기 때문에 .create_subscription 하고 바로 노드 spin 하면 됨 |
발행은 노드에서 발행할 토픽 설정하고 바로 발행되지 않음 때문에 .create_publisher 하고 publish 해야 토픽이 발행됨 또 여러 번 발행하기 위해선 추가적인 함수에 publish를 해야하기에 조금 더 복잡함 |
'전공 > 컴퓨터 코딩 데이터' 카테고리의 다른 글
C언어 이진 탐색 트리 BST 구현하기 (0) | 2024.11.19 |
---|---|
C언어 행렬과 연결리스트로 그래프 구현하기 (0) | 2024.11.18 |
S32K144 MCU Keil v5 프로젝트 생성 방법 (0) | 2024.10.10 |
ROS2 기본 구조와 패키지 (0) | 2024.10.03 |
미니콘다 & 주피터 노트북 (파이썬) 설치 | 가상환경 설정 (0) | 2024.09.10 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 배송기간
- 카시오
- 문서 스캔
- 리브모바일
- Liiv M
- 시계 줄
- mealy
- 리브엠
- 네이버페이
- 계산방법
- 맛집
- a모바일
- 알뜰 요금제
- 카카오페이
- 교체
- 메쉬 밴드
- f-91w
- 경북대
- 알리익스프레스
- 알뜰폰요금제
- 타란튤라
- 파스타
- f-94w
- 티스토리챌린지
- 오블완
- 방향장
- 10만포인트
- 방어동작
- 할인
- 북문
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함