728x90
https://durian9s-coding-tree.tistory.com/264?category=949479
앞글과 이어진다.
이 전 튜토리얼에선 geometry_msgs, rospy만 의존성 설정을 하였기에 package.xml파일과 CMakeLists.txt 파일을 변경해주어야한다.
package.xml
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>geometry_msgs</build_depend>
<build_depend>std_msgs</build_depend><!-------------------- 이 줄 추가 -->
<build_export_depend>rospy</build_export_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<build_export_depend>std_msgs</build_export_depend><!------ 이 줄 추가 -->
<exec_depend>rospy</exec_depend>
<exec_depend>geometry_msgs</exec_depend>
<exec_depend>std_msgs</exec_depend><!---------------------- 이 줄 추가 -->
CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
rospy
geometry_msgs
std_msgs # ----------------------------------------------- 이 줄 추가
)
$ cd src
$ gedit example_pub.py
#!/usr/bin/env python
# 위 내용은 셔뱅(Shebang)으로, 이 스크립트 해석기의 위치를 지정한다. 모든 파이썬으로 작성된 ROS 노드는 반드
# 시 이 셔뱅으로 시작해야 한다.
import rospy # roscpp 코드의 "#include <ros.h>"에 해당하는 구문
from std_msgs.msg import String # ROS 표준 메세지의 String 모듈 import
def simple_pub(): # simple_pub() 함수 정의 시작
# 'sample_pub' 노드 초기화
rospy.init_node('sample_pub', anonymous=True)
# String 형식 토픽 'hello'를 발행하는 퍼블리셔 'pub' 선언
pub = rospy.Publisher('hello', String, queue_size=10)
# 1초당 10회의 빈도로 토픽을 발행하기 위한 rate 객체 선언
rate = rospy.Rate(10) # 10hz
# rospy가 종료되지 않았으면 반복할 루프
while not rospy.is_shutdown(): # roscpp 코드의 "while(ros::ok())"에 해당하는 구문
# "hello~ " 문자열 뒤에 현재 시간을 덧붙인 문자열을 String 변수 str에 치환
str = "hello~ %s" % rospy.get_time()
# time stamp가 표시되는 화면출력으로 str 출력
rospy.loginfo(str)
# 퍼블리셔 'pub'으로 'str'의 내용을 토픽명 'hello'로 발행
pub.publish(str)
# 루프 시작 부터 1/10초가 지날 때까지 시간지연(토픽 발행 빈도 10회/초)
rate.sleep()
if __name__ == '__main__': # 모듈명이 저장되는 전역변수 __name__에 저장된 값이 '__main__'이면
try: # 뒤에 나오는 예외처리(except ... :)를 고려한 실행 구간 시작
simple_pub() # simple_pub() 함수 호출
except rospy.ROSInterruptException: # ROS 인터럽트 예외 발생시
print "Program terminated" # 프로그램 종료 메세지 화면출력
$ chmod +x example_pub.py
$ gedit example_sub.py
#!/usr/bin/env python
# 위 내용은 셔뱅(Shebang)으로, 이 스크립트 해석기의 위치를 지정한다. 모든 파이썬으로 작성된 ROS 노드는 반드
# 시 이 셔뱅으로 시작해야 한다.
import rospy # roscpp 코드의 "#include <ros.h>"에 해당하는 구문
from std_msgs.msg import String # ROS 표준 메세지형식 중 String 모듈 import.
# roscpp 코드 "#include <std_msgs/String.h>"에 해당한다.
# 메세지 수신 이벤트 발생 시 호출될 콜백함수 callback() 정의
def cb_func(msg):
# time stamp + subscribe 노드명 + ' msg: ' + subscribe data 를 화면 출력
rospy.loginfo(rospy.get_caller_id() + 'subscribed message: %s', msg.data)
def simple_sub(): # "simple_sub()"함수 정의 시작
# ROS 환경에서 노드는 중복되지 않는 유일한 이름을 가져야만 한다. 이름이 같은 두 개의 노드가
# 실행된다면, 먼저 실행된 노드는 두 번째 노드가 실행될 때 강제종료된다.
# 'anonymous=True' 플래그는 이 노드의 이름을 rospy가 관리할 수 있도록 하여 이 노드와
# 같은 이름의 노드가 실행되어 있더라도 rospy가 적당한 중복없는 이름으로 노드명을 변경함으로써
# 같은 토픽을 구독하는 다수의 구독노드를 실행할 수 있게 한다는 의미이다.
# rospy.init_node('sample_sub', anonymous=True)
rospy.init_node('sample_sub') # 수신 메세지 String 길이를 짧게 하기위해 수정
# 토픽명:'hello', 토픽형식:String, 콜백함수명:cb_func인 서브스크라이버 설정
rospy.Subscriber('hello', String, cb_func)
# roscpp의 'ros::spin();'에 해당하는 코드. 프로그램 종료 시점까지 제어가 유지되도록 한다.
rospy.spin() # Ctrl-C 입력이 있을 때까지 새 메세지가 발행되면 콜백함수를 호출한다.
if __name__ == '__main__': # 인터프리터 전역변수 __name__ 의 값이 '__main__' 이면
simple_sub() # 'simple_sub()' 함수 호출
$ chmod +x example_sub.py
$ catkin_make
$ source ./devel/setup.bash
$ roscore
$ rosrun rospy_tutorial example_pub.py
$ rosrun rospy_tutorial example_sub.py
728x90
'ROS(drone포함)' 카테고리의 다른 글
[ROS] Publishers and Subscribers Queue 에 관하여 (1) | 2021.12.15 |
---|---|
[rospy 튜토리얼] catkin + rospy 사용법(1/2) (0) | 2021.11.02 |
ROS LineFollow 따라하기.[급종료] (0) | 2021.11.01 |
turtlebot3 시뮬레이션 (0) | 2021.10.13 |
TurtleBot3 사용하기 (0) | 2021.10.12 |