반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기

 

 

1) 파이썬 파일 생성

~/robot_ws/src/test1234/test1234
  1. 위의 경로에 'hello_pub.py'를 생성

 

 

2) 전체 코드

import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String


class HelloworldPublisher(Node):

    def __init__(self):
        super().__init__('helloworld_publisher')
        qos_profile = QoSProfile(depth=10)  #QoS 설정, 큐 사이즈 10(10개의 데이터 보관)
        self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)  #qos_profile속성으로 publisher 생성
        self.timer = self.create_timer(1, self.publish_helloworld_msg)  #timer tick(1초)마다 publish_helloworld_msg 실행
        self.count = 0

    def publish_helloworld_msg(self):
        msg = String()  #메세지 스트링타입
        msg.data = 'Hello World: {0}'.format(self.count)  #메세지 내용
        self.helloworld_publisher.publish(msg)  #메세지 전송
        self.get_logger().info('Published message: {0}'.format(msg.data))  #logger에 메세지 기록
        self.count += 1


def main(args=None):
    rclpy.init(args=args)
    node = HelloworldPublisher()  #클래스 실행
    try:
        rclpy.spin(node)  #ROS에 노드 spin, 프로그램 종료까지 반복
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')  #종료시 logger에 기록
    finally:
        node.destroy_node()  #노드 종료
        rclpy.shutdown()  #rclpy 종료


if __name__ == '__main__':
  main()

(코드 출처 : 오로카 카페 - 024 ROS프로그래밍 기초(python)_표윤석)

 

    def __init__(self):
        super().__init__('helloworld_publisher')
        qos_profile = QoSProfile(depth=10)  #QoS 설정, 큐 사이즈 10(10개의 데이터 보관)
        self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)  #qos_profile속성으로 publisher 생성
        self.timer = self.create_timer(1, self.publish_helloworld_msg)  #timer tick(1초)마다 publish_helloworld_msg 실행
        self.count = 0
  1. qos_profile = QoSProfile(depth=10)
    1. QoS 설정
    2. 데이터를 보관해 놓을 큐의 사이즈 지정 (depth=10)
    3. 오로카 ROS 강의 참고 (https://cafe.naver.com/openrt/24319)
  2. self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)
    1. self.helloworld_publisher : helloworld_publisher라는 이름으로 노드 이름 지정
    2. String : 메세지 타입
    3. 'helloworld' : 토픽 이름
    4. qos_profile : QoS 설정 (현재 큐 사이즈 10으로 설정)
    5. self.timer = self.create_timer(1, self.publish_helloworld_msg) : 타이머를 생성하여 1초에 한번씩 publish_helloworld_msg 실행

 

    def publish_helloworld_msg(self):
        msg = String()  #메세지 스트링타입
        msg.data = 'Hello World: {0}'.format(self.count)  #메세지 내용
        self.helloworld_publisher.publish(msg)  #메세지 전송
        self.get_logger().info('Published message: {0}'.format(msg.data))  #logger에 메세지 기록
        self.count += 1
  1. msg = String() : 메세지를 스트링 타입으로 지정
  2. msg.data = 'Hello world : {0}'.format(self.count) : 메세지 내용 지정
  3. self.helloworld_publisher.publish(msg) : 메세지 전송
  4. self.get_logger().info('Published message : {0}'.format(msg.data)) : 메세지 내용을 콘솔창에 출력

 

def main(args=None):
    rclpy.init(args=args)
    node = HelloworldPublisher()  #클래스 실행
    try:
        rclpy.spin(node)  #ROS에 노드 spin, 프로그램 종료까지 반복
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')  #종료시 logger에 기록
    finally:
        node.destroy_node()  #노드 종료
        rclpy.shutdown()  #rclpy 종료
  1. rclpy.init(args=args) : 초기화
  2. node = HelloworldPublisher() : 클래스 실행
  3. rclpy.spin(node) : ROS에 노드 spin, 프로그램 종료까지 반복
  4. node.destroy_node() : 노드 종료
  5. rclpy.shutdown() : rclpy 종료

 

3) 결론

  1. 중요 핵심 사항만 있는 코드
  2. 이것만으론 뭘 못하니 여기서 추가 내용을 짜서 공부 할 것
  3. 아래 표시한곳들만 서로 맞춰주면 문제 없음

 

 

아래 출처의 내용을 수정 변경하였습니다.

개인적 공부를 위해 올린 글로 공부하실분은 아래 링크의 글을 참고하시기 바랍니다.

출처 : 오로카 카페 (cafe.naver.com/openrt/24450)

 

 

 

반응형

+ Recent posts