반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기

 

 

1) ~/robot_ws/src/test1234/setup.py 확인

  1. 위의 경로 파일 재확인
    1. 내용을 모른다면 다시 1편으로
    2. hostramus.tistory.com/112\
 

ROS2 패키지 만들기 - 1 (패키지 생성)

ROS2 FOXY Fitzroy ROS2에서 패키지를 만들기 위한 방법 1) 패키지 생성 cd ~/robot_ws/src ros2 pkg create [패키지명] --build-type ament_python 이전에 만들어 놓은 ROS2 워크스페이스 src에 [패키지명]으로..

hostramus.tistory.com

 

2) 빌드

cd ~/robot_ws
colcon build --symlink-install
  1. 패키지를 생성했으니 빌드
    1. 패키지 생성 꼭 빌드 해야 사용이 가능
    2. --symlink-install
      1. 옵션 사항
      2. 빌드 후 파이썬 파일 수정을 해도 재빌드가 필요 없음
        1. 같은 파일 내에 수정일때 적용
        2. 빌드시 관련 파일(파이썬 등)을 링크로 연결하기에 쉽게 수정이 가능
        3. 결론.. 쓰면 편함

 

3) 노드 환경설정

. ~/robot_ws/install/local_setup.bash

#또는

source ~/robot_ws/install/local_setup.bash
  1. 노드 환경설정
    1. 그냥 한번 입력하면 별 반응도 없이 끝
    2. 출력되는 메세지조차 없음

 

4) 노드 실행

ros2 run test1234 hello_pub
  1. publisher 실행
    1. [INFO]: Published message: Hello World: 1
      1. 위와같이 1초에 하나씩 출력
ros2 run test1234 hello_sub
  1. subscriber 실행
    1. [INFO]: Received message: Hello World: 1
      1. 위와 같은 형식으로 출력
      2. 메세지가 날아올때만 출력

위와 같이 실행되면 완료

 

5) 문제 해결

  1. ros2 run test1234 hello_sub를 실행시켰으나 무반응
    1. 1번 setup.py의 entry points 내용 확인
    2. publisher와 subscriber의 파이썬 파일 확인
      1. 토픽명이 일치하는지 확인
    3. 코드의 오타 확인
  2. hello_suv등의 패키지를 찾지 못함 (탭을 눌렀으나 자동완성이 안되는 경우)
    1. source ~/robot_ws/install/local_setup.bash 실행한 후 확인

 

 

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

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

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

반응형
반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기



1) 파이썬 파일 생성

~/robot_ws/src/test1234/test1234
  1. 위 경로에 hello_sub.py 생성

 

2) 전체코드

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


class HelloworldSubscriber(Node):

    def __init__(self):
        super().__init__('Helloworld_subscriber')
        qos_profile = QoSProfile(depth=10)
        self.helloworld_subscriber = self.create_subscription(
            String, #메세지 타입
            'helloworld', #토픽 이름
            self.subscribe_topic_message, #콜백 함수
            qos_profile)  #QoS 설정

    def subscribe_topic_message(self, msg):
        self.get_logger().info('Received message: {0}'.format(msg.data))

def main(args=None):
    rclpy.init(args=args)
    node = HelloworldSubscriber()  #HelloworldSubscriber 클래스 생성
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == '__main__':
    main()

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

    def __init__(self):
        super().__init__('Helloworld_subscriber')
        qos_profile = QoSProfile(depth=10)
        self.helloworld_subscriber = self.create_subscription(
            String, #메세지 타입
            'helloworld', #토픽 이름
            self.subscribe_topic_message, #콜백 함수
            qos_profile)  #QoS 설정
  1. self.helloworld_subscriber = self.create_subscription ~
    1. String : 메세지 타입
    2. 'helloworld' : 가져다 쓸 토픽 이름, 앞서 만든 publisher와 이름을 맞춰주어야 함
    3. self.subscribe_topic_message : 콜백 함수
    4. qos_prifile : QoS 설정
    def subscribe_topic_message(self, msg):
        self.get_logger().info('Received message: {0}'.format(msg.data))
  1. self.get_logger().info('Received message: {0}'.format(msg.data))
    1. 데이터가 들어오면 'msg.data'의 값을 '{0}'에 넣어 콘솔창에 출력
def main(args=None):
    rclpy.init(args=args)
    node = HelloworldSubscriber()  #HelloworldSubscriber 클래스 생성
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()
  1. node = HelloworldSubscriber() : HelloworldSubscriber 클래스 생성
  2. rclpy.spin(node) : ROS에 노드 spin

 

3) 결론

  1. 특별한 것 없음
  2. publisher와의 차이는 12행에서 'create_publisher', 'create_subscription'만 다르다

 

반응형

+ Recent posts