[ROS2] 모듈 개념

bbolddagu·2023년 5월 17일
0

IoT

목록 보기
6/7

📖 메시지 및 서비스 유형

📚 rclpy

rclpy는 ROS 2를 파이썬으로 개발하기 위한 클라이언트 라이브러리입니다.
rclpy는 ROS 2의 기본 통신 라이브러리인 rcl (ROS Client Library)를 기반으로 작성되었습니다. rclpy를 사용하면 파이썬으로 ROS 2 노드(Node)를 작성하고, 토픽(Topic) 및 서비스(Service) 메시지를 발행하고 구독할 수 있습니다.


📚 Node

Node는 ROS 2에서 실행되는 독립적인 프로세스로, 로봇 시스템의 구성 요소를 나타냅니다. Node는 rclpy를 사용하여 작성되며, 특정 작업을 수행하기 위해 다른 노드와 통신하고 메시지를 교환할 수 있습니다. 각 Node는 고유한 이름을 가지며, 하나 이상의 토픽에서 메시지를 발행하거나 구독할 수 있습니다.

Node는 rclpy의 Node 클래스를 상속하여 작성됩니다. Node 클래스는 ROS 2 시스템과의 상호 작용을 관리하기 위한 다양한 기능과 메서드를 제공합니다. 예를 들어, Node 클래스는 토픽과 서비스의 생성, 메시지 발행 및 구독, 타이머 및 콜백 함수의 관리 등을 담당합니다.



📖 메시지 유형

📚 Twist

  • Twist는 선속도(linear velocity)각속도(angular velocity)를 나타내는 메시지입니다.
  • 선속도는 로봇이 직진 또는 후진하는 속도를 나타냅니다. Twist 메시지의 linear 필드에서 x, y, z 값을 사용하여 표현됩니다. 일반적으로 x 축이 앞뒤 방향으로의 속도를 나타냅니다.
  • 각속도는 로봇의 회전 속도를 나타냅니다. Twist 메시지의 angular 필드에서 x, y, z 값을 사용하여 표현됩니다. 일반적으로 z 축이 로봇의 주축 주변의 회전 속도를 나타냅니다.
  • 로봇의 움직임을 제어하거나 전달하기 위해 주로 사용됩니다.

🔨 사용법

  • 선속도는 linear.x, linear.y, linear.z 필드로 표현되며, 각속도는 angular.x, angular.y, angular.z 필드로 표현됩니다.
  • 예를 들어, 로봇을 직진하기 위해 선속도를 설정하고자 한다면 cmd_vel.linear.x 필드에 값을 할당합니다.
from geometry_msgs.msg import Twist

# Twist 메시지 생성
cmd_vel = Twist()
cmd_vel.linear.x = 0.2  # 선속도 설정
cmd_vel.angular.z = 0.5  # 각속도 설정

📚 PoseStamped

  • PoseStamped는 위치와 방향을 포함하는 메시지입니다. PoseStamped 메시지는 geometry_msgs.msg 패키지에 정의되어 있습니다.
  • PoseStamped 메시지는 위치(position)와 방향(orientation)을 나타내는 pose 필드를 포함합니다. 이러한 값을 사용하여 로봇이나 오브젝트의 위치와 방향을 나타낼 수 있습니다.
  • PoseStamped 메시지는 메타데이터로서 시간 정보와 프레임 ID를 포함합니다. 메시지의 시간 정보는 메시지가 생성된 시간을 나타내며, 프레임 ID는 위치와 방향이 정의된 좌표계를 지정합니다.

🔨 사용법

  • geometry_msgs.msg.PoseStamped를 import하여 사용합니다.
  • PoseStamped 메시지의 주요 필드는 다음과 같습니다:
    • header: 메시지의 헤더 정보로, 시간 정보와 좌표계(frame) 정보를 포함합니다.
    • pose: 로봇의 위치와 방향 정보를 담고 있는 Pose 메시지입니다.
  • Pose 메시지는 3차원 공간에서의 위치(position)와 방향(orientation) 정보를 포함합니다.
  • 위치는 position.x, position.y, position.z 필드로 표현되며, 방향은 쿼터니언(quaternion) 표현으로 orientation.x, orientation.y, orientation.z, orientation.w 필드로 표현됩니다.
from geometry_msgs.msg import PoseStamped

# PoseStamped 메시지 생성
goal_pose = PoseStamped()
goal_pose.header.frame_id = 'map'  # 좌표계 설정
goal_pose.pose.position.x = 1.0  # x 위치 설정
goal_pose.pose.position.y = 2.0  # y 위치 설정
goal_pose.pose.orientation.w = 1.0  # 방향 설정

📚 Odometry

  • Odometry는 로봇의 위치 및 이동 정보를 포함하는 메시지입니다. Odometry 메시지는 nav_msgs.msg 패키지에 정의되어 있습니다.
  • Odometry 메시지는 로봇의 현재 위치와 방향(pose)을 나타내는 필드와, 로봇의 선속도와 각속도(twist)를 나타내는 필드로 구성됩니다. 이러한 정보는 로봇의 운동을 추적하고 제어하는 데 사용됩니다.
  • 또한 Odometry 메시지는 특정 좌표계에서 로봇의 운동을 설명하기 위한 프레임 ID와 시간 정보를 포함합니다.

🔨 사용법

  • nav_msgs.msg.Odometry를 import하여 사용합니다.
  • 메시지에는 로봇의 포즈(pose), 선속도(linear velocity), 각속도(angular velocity) 등이 포함됩니다.
  • 주요 필드는 다음과 같습니다:
    • header: 메시지의 헤더 정보로, 시간 정보와 좌표계(frame) 정보를 포함합니다.
    • child_frame_id: 로봇의 좌표계(frame) 정보를 나타냅니다.
    • pose: 로봇의 위치와 방향 정보를 담고 있는 Pose 메시지입니다.
    • twist: 로봇의 선속도와 각속도 정보를 담고 있는 Twist 메시지입니다.
from nav_msgs.msg import Odometry

# Odometry 메시지 생성
odometry = Odometry()
odometry.header.frame_id = 'odom'  # 좌표계 설정
odometry.child_frame_id = 'base_link'  # 자식 좌표계 설정
odometry.pose.pose.position.x = 1.0  # 로봇 위치 설정
odometry.twist.twist.linear.x = 0.2  # 선속도 설정
odometry.twist.twist.angular.z = 0.5  # 각속도 설정

📌 좌표계(Frame)와 자식 좌표계(Child Frame)의 차이


🔎 좌표계 (Frame)

  • 좌표계는 3D 공간에서의 위치와 방향을 나타내는 개념입니다.
  • 로봇 시스템에서는 일반적으로 전역 좌표계(Global Frame)와 로컬 좌표계(Local Frame)를 사용합니다.
  • 전역 좌표계고정된 기준점을 기준으로 한 전체 공간을 나타내며, 일반적으로 'map'이나 'odom'과 같은 이름으로 표현됩니다.
  • 로컬 좌표계는 로봇 자체를 기준으로 하는 상대적인 좌표계로, 로봇의 움직임에 따라 변합니다. 로봇의 기준 좌표계는 'base_link' 또는 'base_footprint'과 같은 이름으로 표현됩니다.


    🔎 자식 좌표계 (Child Frame)
  • 자식 좌표계는 다른 좌표계에 상대적으로 움직이는 좌표계입니다.
    로봇 시스템에서는 보통 로봇의 부품이나 센서와 같은 개체를 나타내기 위해 자식 좌표계를 사용합니다.
  • 자식 좌표계는 부모 좌표계에 상대적인 위치와 방향 정보를 가지며, 자식 좌표계는 부모 좌표계에 대한 변환(transform)을 통해 전역 좌표계에서의 위치와 방향을 계산합니다.
    예를 들어, 로봇의 기준 좌표계인 'base_link'은 'odom' 좌표계에 상대적으로 움직이는 자식 좌표계입니다.

0개의 댓글