[ROS2] Hello World

­윤다빈·2022년 8월 17일
0

[Devlog] - ROS

목록 보기
7/9

패키지 생성

$ cd ~/baqu_ws/src
$ ros2 pkg create test_rclpy_pkg --build-type ament_python --dependencies rclpy std_msgs

패키지 설정

패키지 설정 파일


version만 수정함

파이썬 패키지 설정 파일

entry_points 옵션의 console_scripts 키를 사용한 실행 파일 설정
ex) helloworld_publisher와 helloworld_subscriber 콘솔 스크립트는 각각 test_rclpy_pkg.helloworld_publisher 모듈과 test_rclpy_pkg.helloworld_subscriber 모듈의 main 함수를 호출되게 한다

해당 설정을 통해 ros2 run 또는 ros2 launch 명령어로 해당 스크립트를 실행시킬 수 있다.

version과 entry_points만 수정함

파이썬 패키지 환경설정 파일

해당 파일에서 주의할 점은 test_rclpy_pkg와 같이 패키지 이름을 기재해야한다는 것과 나중에 colcon을 이용하여 빌드하게 되면 "/home/[userName]/baqu_ws/install/test_rclpy_pkg/lib/test_rclpy_pkg"와 같은 지정 폴더에 실행파일이 생성된다는 점이다


노드 작성

퍼블리셔 노드 작성

퍼블리셔 노드의 파이썬 코드는 ~/baqu_ws/src/test_rclpy_pkg/test_rclpy_pkg/ 폴더에 helloworld_publisher.py 소스코드 파일을 직접 생성한다

# import 구문
# rclpy의 Node 클래스 사용 / 퍼블리셔의 QoS 설정을 위한 QoSProfile 클래스
# 메시지 타입은 std_msgs.msg 모듈의 String 메시지 인터페이스 사용
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String

# 이 노드의 메인 클래스는 HelloworldPublisher이고 Node 클래스를 상속해 사용할 예정
class HelloworldPublisher(Node):

  # 클래스 생성자 정의
  # 부모 클래스(Node)의 생성자를 호출하고 노드 이름을 helloworld_publisher로 지정
  def __init__(self):
    super().__init__('helloworld_publisher')
    qos_profile = QoSProfile(depth=10)
    
    # Nod 클래스의 create_publisher 함수를 이용해 helloworld_publisher를 설정함
    # 매개변수로 토픽 메시지 타입은 String, 토픽 이름은 helloworld, QoS는 qos_prpfile
    self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)
    self.timer = self.create_timer(1, self.publish_helloworld_msg)
    self.count = 0
    
  # 앞에서 지정한 publish_helloworld_msg 콜백함수
  # 실제 데이터는 msg.data에 저장
  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))
    self.count += 1


# rclpy.init을 이용해 초기화
def main(args=None):
  rclpy.init(args=args)
  
  # HelloworldPublisher 클래스를 node 변수로 생성
  node = HelloworldPublisher()
  try:
  
  	# rclpy.spin 함수를 이용하여 생성한 노드를 spin 시켜 지정된 콜백 함수가 실행될 수 있도록
    rclpy.spin(node)
  except KeyboardInterrupt:
    node.get_logger().info('Keyboard Interrupt (SIGINT)')
  finally:
    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
  main()

서브스크라이버 노드 작성

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)

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


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


if __name__ == '__main__':
  main()

빌드

특정 패키지의 첫 빌드 후에는 환경설정 파일을 불러와서 실행 가능한 패키지의 노드 설정을 해줘야 빌드된 노드를 실행할 수 있다
->

$ . ~/baqu_ws/install/local_setup.bash
혹은
$ source ~/baqu_ws/install/local_setup.bah

해당 위치에 setup.bash는 setup.bash와 local_setup.bash가 있는데, local_setup.bash는 해당 폴더에 한정된 노드 설정을 해주는 반면 setup.bash는 전역적인 노드 설정을 해준다

실행


아직 publisher를 실행시키지 않아 터미널에 아무 것도 뜨지 않는다

새로 터미널을 열면 다시 source ~/...를 통해 노드 설정을 해줘야 함..

profile
Web-Front / SW-AI 개발자

1개의 댓글

comment-user-thumbnail
2023년 4월 18일

잘 보고갑니다

답글 달기