ROS TurtleSim으로 토픽 개념부터 손쉽게 연습하기
ROS(Robot Operating System)는 로봇 소프트웨어 개발을 위한 플래폼으로, 다양한 기능을 제공하여 개발자가 로봇을 손쉽게 코딩하고 제어할 수 있도록 돕습니다. 그 중에서도 TurtleSim은 ROS의 기본적인 개념을 연습하기 위한 훌륭한 도구로, 특히 토픽(Topic) 개념을 이해하는 데 유용합니다. 이 글에서는 TurtleSim을 사용하여 ROS의 토픽 개념을 쉽게 익히는 방법에 대해 설명하겠습니다.
토픽(Topic)이란 무엇인가?
토픽은 ROS의 중요한 통신 메커니즘 중 하나입니다. 로봇 시스템 내의 여러 노드 간 데이터 전송을 가능하게 합니다. 토픽을 통해 데이터 생산자와 소비자가 서로 독립적으로 존재할 수 있으며, 이로 인해 다양한 노드가 동시에 운영될 수 있습니다.
토픽의 장점
- 비동기식 통신: 데이터의 생산자와 소비자는 서로의 상태에 영향을 받지 않고 독립적으로 동작할 수 있습니다.
- 다중 구독: 하나의 토픽을 여러 소비자가 동시에 구독하여 데이터를 수신할 수 있습니다.
- 유연성: 새로운 노드를 추가하거나 기존 노드를 수정할 때 다른 노드에 미치는 영향을 최소화할 수 있습니다.
TurtleSim 설치하기
TurtleSim은 ROS의 기본 패키지인 turtle_turtlebot에 포함되어 있습니다. ROS가 설치된 시스템에서 TurtleSim을 설치하는 방법은 다음과 같습니다.
설치 준비사항
- Ubuntu 운영 체제
- ROS가 사전 설치되어 있어야 함
- 기본적인 커맨드 라인 사용법 이해
설치 방법
다음 커맨드를 사용하여 TurtleSim을 설치합니다.
sudo apt-get install ros--turtlesim
여기서 는 사용 중인 ROS 배포판의 이름입니다. 예를 들어, ROS Noetic을 사용하는 경우 "noetic"을 입력합니다.
TurtleSim 실행하기
설치가 완료된 후, TurtleSim을 실행하는 방법은 다음과 같습니다.
TurtleSim 실행
다음 커맨드를 입력하여 TurtleSim을 실행합니다.
rosrun turtlesim turtlesim_node
이 명령어를 실행하면 TurtleSim의 그래픽 인터페이스가 열리고, 화면 중앙에 거북이가 나타납니다.
토픽 퍼블리셔와 서브스크라이버 이해하기
TurtleSim을 통해 ROS의 토픽 시스템을 이해하기 위해서는 퍼블리셔(게시자)와 서브스크라이버(구독자)라는 개념을 이해하는 것이 중요합니다. 퍼블리셔는 특정 토픽에 메시지를 보내는 노드이고, 서브스크라이버는 해당 토픽을 구독하여 메시지를 받는 노드입니다.
퍼블리셔 만들기
퍼블리셔는 코드로 쉽게 만들 수 있습니다. 다음은 Python을 사용하여 퍼블리셔를 만드는 간단한 예시입니다.
import rospy
from std_msgs.msg import String
rospy.initnode('turtlepublisher', anonymous=True)
pub = rospy.Publisher('turtlecommands', String, queuesize=10)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
command = "forward"
명령어 예시
pub.publish(command)
rate.sleep()
이 코드는 'turtle_commands'라는 주제로 "forward"라는 메시지를 10Hz로 발행하는 퍼블리셔를 생성합니다.
서브스크라이버 만들기
서브스크라이버 역시 간단하게 만들 수 있습니다. 아래는 Python을 사용한 서브스크라이버의 예입니다.
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo("Received command: %s", data.data)
rospy.initnode('turtlesubscriber', anonymous=True)
rospy.Subscriber('turtle_commands', String, callback)
rospy.spin()
위 코드는 'turtle_commands'라는 주제를 구독하고, 해당 주제로 메시지가 발행될 때마다 callback 함수가 호출되어 수신된 명령어를 출력합니다.
TurtleSim을 통한 실습
이제 TurtleSim을 사용하여 퍼블리셔와 서브스크라이버를 연습해보겠습니다. 이를 통해 ROS의 토픽 개념을 더 깊이 이해할 수 있습니다.
직접 실행해보기
- 첫 번째 터미널에서 TurtleSim 실행:
rosrun turtlesim turtlesim_node
- 두 번째 터미널에서 퍼블리셔 스크립트 실행:
python turtle_publisher.py
- 세 번째 터미널에서 서브스크라이버 스크립트 실행:
python turtle_subscriber.py
명령어 테스트하기
퍼블리셔와 서브스크라이버가 정상적으로 작동하는지 확인합니다. 퍼블리셔가 "forward"라는 명령어를 발행하면, 서브스크라이버에서 해당 메시지를 받아 출력됩니다. 또한, TurtleSim의 거북이도 이동하게 됩니다.
고급 기능: 서비스와 액션
ROS에서는 토픽 외에도 서비스(Service)와 액션(Action)이라는 통신 방식이 존재합니다. 서비스는 요청-응답 방식이며 액션은 장기 실행 작업을 처리할 수 있습니다. 이 두 기능 또한 TurtleSim을 통해 연습할 수 있습니다.
서비스(Service) 사용하기
서비스를 이용하면 데이터 요청을 직접 처리할 수 있습니다. TurtleSim의 서비스를 활용하여 거북이의 위치를 요청하는 간단한 예가 아래와 같습니다.
import rospy
from turtlesim.srv import TeleportAbsolute
rospy.initnode('turtleservice_client')
rospy.waitforservice('turtle1/teleport_absolute')
try:
teleport = rospy.ServiceProxy('turtle1/teleport_absolute', TeleportAbsolute)
teleport(5.0, 5.0, 0.0)
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
이 코드는 거북이를 (5.0, 5.0) 위치로 이동시키는 요청을 보냅니다. 서비스의 호출을 통해 명확하게 요청을 할 수 있으며, 이는 다양한 동작을 프로그래밍하기에 유용합니다.
액션(Action) 사용하기
액션은 장기적으로 실행되는 작업을 다룹니다. TurtleSim에서는 목표 위치로의 이동을 액션으로 구현할 수 있습니다. 다음은 액션 서버와 클라이언트를 설정하는 예입니다.
import rospy
import actionlib
from turtlesim.msg import MoveAbsoluteAction, MoveAbsoluteGoal
def move_turtle(x, y):
client = actionlib.SimpleActionClient('turtle1/move_absolute', MoveAbsoluteAction)
client.waitforserver()
goal = MoveAbsoluteGoal()
goal.x = x
goal.y = y
client.send_goal(goal)
client.waitforresult()
rospy.initnode('turtleaction_client')
move_turtle(5.0, 5.0)
이 코드는 액션 클라이언트를 통해 거북이를 (5.0, 5.0)으로 이동시키는 요청을 보냅니다. 액션의 사용법을 익히면 로봇의 동작을 더욱 정밀하게 제어할 수 있습니다.
정리 및 다음 단계
TurtleSim을 활용한 ROS의 토픽 개념 학습은 초기 로봇 개발을 위한 좋은 출발점입니다. 퍼블리셔와 서브스크라이버, 서비스와 액션에 대한 기본 개념을 익혔으므로 다음 단계로 넘어갈 수 있습니다. 이제 실질적인 로봇 프로젝트를 진행하며 ROS의 다양한 기능을 심화 학습하는 것이 좋습니다.
추가 자료
- ROS 공식 문서: ROS Tutorials
- TurtleSim 사용법: TurtleSim Documentation
- ROS 커뮤니티: ROS Community
마무리
ROS TurtleSim을 통한 토픽 개념 학습은 로봇 개발의 기초를 다지는 데 매우 유용합니다. 지속적인 학습과 실습을 통해 로봇 프로그래밍에 대한 이해도를 높이며, 보다 복잡한 프로젝트를 시도해 보시기 바랍니다.





