ROS(Robot Operating System)는 로봇 소프트웨어 개발을 위한 오픈소스 미들웨어 프레임워크다. 센서, 액추에이터, 알고리즘 모듈 간의 통신을 표준화하고 재사용 가능한 패키지 생태계를 제공한다.
ROS 핵심 개념
Node: 독립 실행 프로세스 (센서 드라이버, 알고리즘 등)
Topic: Publish/Subscribe 비동기 통신 채널
Service: 동기적 Request/Response 통신
Action: 장기 실행 목표 (피드백 포함)
Message: 구조화된 데이터 타입
Launch File: 여러 노드를 한번에 실행
Publisher/Subscriber 패턴 (Python)
python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from geometry_msgs.msg import Twist
class TurtlebotController(Node):
def __init__(self):
super().__init__('turtlebot_controller')
# Publisher: 속도 명령 발행
self.cmd_pub = self.create_publisher(
Twist, '/cmd_vel', 10
)
# Subscriber: 장애물 감지 구독
self.obstacle_sub = self.create_subscription(
String, '/obstacle_detected',
self.obstacle_callback, 10
)
# 타이머: 주기적 제어 루프
self.timer = self.create_timer(0.1, self.control_loop)
self.is_obstacle = False
def obstacle_callback(self, msg):
self.is_obstacle = msg.data == 'detected'
self.get_logger().info(f'장애물: {self.is_obstacle}')
def control_loop(self):
twist = Twist()
if not self.is_obstacle:
twist.linear.x = 0.3 # 전진 속도 (m/s)
twist.angular.z = 0.0 # 회전 없음
else:
twist.linear.x = 0.0
twist.angular.z = 0.5 # 좌회전
self.cmd_pub.publish(twist)
def main():
rclpy.init()
node = TurtlebotController()
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
ROS vs ROS 2 비교
| 항목 | ROS 1 | ROS 2 |
|---|
| 통신 | 독자 방식 | DDS (산업 표준) |
| 실시간 | 미지원 | 지원 |
| 보안 | 없음 | SROS2 (암호화) |
| 멀티 로봇 | 어려움 | 용이 |
| OS 지원 | Linux | Linux, Windows, macOS |
| 권장 여부 | 구버전 | 권장 |
관련 문서