ROS(drone포함)

[rospy 튜토리얼] 간단한 퍼블리셔와 서브스크라이버 작성

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

 

 

 

출처 - https://github.com/greattoe/ros_tutorial_kr/blob/master/ros1_tutorial/rospy/rospy_2_WritingSimplePubSub.md

 

GitHub - greattoe/ros_tutorial_kr: ROS Tutorial which translated into Korean

ROS Tutorial which translated into Korean. Contribute to greattoe/ros_tutorial_kr development by creating an account on GitHub.

github.com

 

728x90