ROS(Robot Operating System)와 리눅스(Linux) 기초 개념 설명
ROS와 리눅스는 로봇 개발과 자율주행 시스템을 다루는 데 필수적인 요소야. 처음 공부
하는 거라면 기초부터 차근차근 이해하는 게 중요해!
1. ROS(Robot Operating System)란?
ROS는 운영체제가 아니다!
이름이 "Robot Operating System"이라서 운영체제(OS)라고 착각할 수 있지만, 사실 운영
체제가 아니라 로봇 소프트웨어 프레임워크야.
쉽게 말하면, 로봇을 효율적으로 개발할 수 있도록 도와주는 도구와 라이브러리의 모음
이라고 생각하면 돼.
ROS의 주요 기능
•
하드웨어 추상화 → 여러 가지 로봇 하드웨어를 쉽게 제어할 수 있도록 공통된
인터페이스 제공
•
분산 처리 시스템 → 여러 개의 노드(Node)로 이루어진 분산 환경에서 로봇 소프
트웨어 실행
•
재사용 가능한 패키지 제공 → 이미 개발된 패키지(라이브러리)를 가져다가 쉽게
로봇 개발 가능
•
센서 및 모터 제어 → LiDAR, 카메라, 모터 등 다양한 센서와 액추에이터 지원
•
SLAM & 자율주행 → 로봇이 주변 환경을 인식하고, 스스로 길을 찾을 수 있도록
다양한 알고리즘 제공
ROS의 구조
ROS는 Publisher-Subscriber(퍼블리셔-서브스크라이버) 모델을 기반으로 동작해.
즉, 어떤 노드(Node)가 데이터를 보내면(Publisher), 다른 노드가 이를 받아서 처리
(Subscriber)하는 구조야.
주요 개념
1. 노드(Node) → 하나의 독립적인 실행 단위 (ex. 카메라 제어, 모터 제어)
2. 토픽(Topic) → 노드 간 데이터를 주고받는 통로
3. 메시지(Message) → 노드 간 주고받는 데이터의 형태 (ex. 이미지 데이터, 센서값)
4. 서비스(Service) → 요청(Request)과 응답(Response) 형태로 동작하는 통신 방식
5. 액션(Action) → 비동기적으로 명령을 실행하는 방식 (ex. 로봇 팔이 물체를 잡는
동작)
2. 리눅스(Linux)란?
리눅스는 무엇인가?
리눅스는 오픈소스 운영체제(OS) 로, 서버, 개발 환경, 그리고 ROS 같은 로봇 시스템을
실행하는 데 많이 사용돼.
특히 ROS는 우분투(Ubuntu) 리눅스에서 주로 실행되기 때문에, 리눅스를 공부하는 것이
중요해!
리눅스를 왜 배워야 할까?
•
ROS는 리눅스 기반이라서 기본적인 명령어를 알아야 함.
•
서버 및 클라우드 환경에서도 많이 사용됨.
•
오픈소스라서 자유롭게 수정 및 배포 가능.
•
개발자 커뮤니티가 활발하고, 다양한 라이브러리 지원.
리눅스 기본 명령어
리눅스에서는 명령어를 사용해서 파일 관리, 프로그램 실행, 네트워크 설정 등을 할 수
있어.
Linux 필수 명령어
1. 현재 디렉토리 확인
•
pwd : 현재 위치하고 있는 디렉토리를 출력
2. 디렉토리 목록 보기
•
ls : 현재 디렉토리의 파일 목록 출력
•
ls -l : 파일의 상세 정보를 포함하여 출력
•
ls -a : 숨김 파일(.으로 시작하는 파일)까지 모두 출력
•
ls -al : -a와 -l 옵션을 함께 사용
3. 디렉토리 이동
•
cd 디렉토리이름 : 지정한 디렉토리로 이동
•
cd .. : 상위 디렉토리로 이동
•
cd / : 최상위(root) 디렉토리로 이동
•
cd ~ : 사용자의 홈 디렉토리로 이동
4. 파일 및 디렉토리 생성
•
touch 파일이름 : 빈 파일 생성
•
mkdir 디렉토리이름 : 새로운 디렉토리(폴더) 생성
•
mkdir -p 부모디렉토리/하위디렉토리 : 부모 디렉토리가 없을 경우 함께 생성
5. 파일 및 디렉토리 삭제
•
rm 파일이름 : 파일 삭제
•
rm -r 디렉토리이름 : 디렉토리 및 내부 파일 삭제
•
rm -rf 디렉토리이름 : 강제 삭제 (주의 필요!)
6. 파일 내용 확인
•
cat 파일이름 : 파일 내용을 출력
•
less 파일이름 : 파일 내용을 페이지 단위로 출력 (스크롤 가능)
•
more 파일이름 : less와 유사하지만 한 방향(아래)으로만 이동 가능
7. 파일 및 디렉토리 복사
•
cp 원본파일 대상파일 : 파일 복사
•
cp -r 원본디렉토리 대상디렉토리 : 디렉토리 복사
8. 파일 및 디렉토리 이동/이름 변경
•
mv 원본파일 대상파일 : 파일 이동 또는 이름 변경
•
mv 원본디렉토리 대상디렉토리 : 디렉토리 이동 또는 이름 변경
이 명령어들은 리눅스를 사용할 때 기본적으로 알아야 할 필수 명령어들이며, ROS 환경
에서도 자주 활용되므로 꼭 익혀 두세요!
3. ROS와 리눅스를 함께 활용하는 방법
ROS 설치 및 실행
1. 우분투(Ubuntu) 설치 → 보통 ROS는 우분투에서 실행되므로, 우분투를 먼저 설
치해야 해.
2. ROS 설치 → apt 패키지 관리자를 이용해 ROS를 설치.
3. ROS 패키지 실행 → roscore를 실행하여 ROS 마스터 시작.
4. 노드 실행 및 토픽 확인 → rosrun과 rostopic 명령어로 실행.
ROS 명령어 예제
bash
복사편집
# ROS 마스터 실행
roscore
# 새로운 터미널에서 터틀봇 시뮬레이션 실행
rosrun turtlesim turtlesim_node
# 터틀봇을 키보드로 조작하기
rosrun turtlesim turtle_teleop_key
# 현재 실행 중인 노드 확인
rosnode list
# 현재 사용 중인 토픽 확인
rostopic list
이런 방식으로 ROS와 리눅스를 함께 사용하면서 로봇을 개발하게 돼.
4. 정리 및 다음 학습 방향
ROS는 로봇 소프트웨어 개발을 위한 프레임워크
리눅스는 ROS를 실행하기 위해 꼭 필요한 운영체제
기본적인 리눅스 명령어를 익히고, ROS 구조를 이해하는 것이 중요
좋아! 그럼 ROS 2 설치 및 기본 사용법을 중심으로 자세히 설명해 줄게.
5. ROS 2 설치 및 기본 사용법
이제 본격적으로 ROS 2를 설치하고 실행하는 방법을 알아보자.
ROS 2는 로봇 개발을 위한 최신 버전으로, 기존 ROS 1보다 더 안정적이고 성능이 향상
되었어.
5.1 ROS 2 설치 방법 (Ubuntu 22.04 기준)
ROS 2를 사용하려면 먼저 우분투(Ubuntu) 리눅스가 설치되어 있어야 해.
ROS 2는 보통 Ubuntu 22.04 (Jammy) 버전에서 많이 사용돼.
ROS 2 설치 단계
1⃣ 설치 전 시스템 업데이트
먼저, 패키지를 최신 버전으로 업데이트해야 해.
sudo apt update && sudo apt upgrade -y
2⃣ 설치에 필요한 패키지 설치
ROS 2를 설치하려면 몇 가지 필수 패키지가 필요해.
sudo apt install software-properties-common
sudo add-apt-repository universe
3⃣ ROS 2 패키지 저장소 추가
ROS 2를 설치하기 위해 패키지 저장소를 추가해야 해.
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo aptkey add 4⃣ ROS 2 설치 이제 ROS 2를 설치할 차례야.
가장 많이 사용하는 데스크톱(Desktop) 버전을 설치해 보자.
sudo apt install ros-humble-desktop
(
참고: 2024년 현재 ROS 2의 최신 LTS 버전은 "Humble Hawksbill"이야.)
5⃣ 환경 변수 설정
설치가 완료되면, 터미널에서 ROS 2 명령어를 사용할 수 있도록 환경 변수를 설정해야
해.
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
설치 확인
ROS 2가 정상적으로 설치되었는지 확인하려면 다음 명령어를 실행해 봐.
ros2 --version
이제 ROS 2 설치가 완료되었어!
5.2 ROS 2 기본 실행 방법
이제 ROS 2의 기본 기능을 실행해 보자!
ROS 2에서 가장 먼저 실행해야 하는 것
ROS 1에서는 roscore를 실행해야 했지만,
ROS 2에서는 별도의 마스터 프로세스가 필요하지 않아.
즉, 바로 실행할 수 있어!
노드(Node) 실행하기
ROS 2에서는 노드(Node)가 로봇의 개별적인 기능을 담당해.
거북이 시뮬레이션 실행 (turtlesim)
거북이 로봇을 실행하는 간단한 시뮬레이션이야.
ros2 run turtlesim turtlesim_node
이 명령어를 실행하면 거북이 시뮬레이터 창이 뜰 거야.
노드(Node) 목록 확인
ROS 2에서 실행 중인 노드를 확인하려면 다음 명령어를 사용하면 돼.
ros2 node list
위 명령어를 실행하면 현재 실행 중인 노드의 이름이 출력될 거야.
토픽(Topic) 확인하기
토픽은 노드 간에 데이터를 주고받는 통로야.
1⃣ 현재 사용 중인 토픽 목록 보기
ros2 topic list
이 명령어를 실행하면 현재 사용 중인 토픽 목록이 나타날 거야.
2⃣ 특정 토픽의 메시지 확인 예를 들어, 거북이 시뮬레이터의 위치 정보를 확인하고 싶다
면?
ros2 topic echo /turtle1/pose
이 명령어를 실행하면 거북이의 위치(x, y)와 회전각(yaw) 정보가 계속 업데이트될 거야.
키보드로 거북이 움직이기
이제 거북이를 움직여 보자!
새로운 터미널을 열고 다음 명령어를 입력해.
ros2 run turtlesim turtle_teleop_key
이제 키보드 화살표(↑ ↓ ← →)를 사용해서 거북이를 움직일 수 있어!
5.3 ROS 2에서 패키지 관리하기
ROS 2에서는 여러 개의 패키지(Package) 를 사용해 로봇을 개발해.
패키지는 코드, 실행 파일, 설정 파일 등이 포함된 단위야.
새로운 패키지 만들기
ros2 pkg create my_robot
위 명령어를 실행하면 my_robot이라는 새로운 패키지가 생성돼.
설치된 패키지 목록 보기
ros2 pkg list
이 명령어를 실행하면 현재 설치된 패키지들의 목록이 나타나.
6. 다음 학습 방향
ROS 2 설치 및 기본 실행 방법을 익혔어!
turtlesim을 실행하고, 노드 및 토픽을 확인하는 방법을 배웠어!
이제 직접 ROS 2 패키지를 만들어보고, 간단한 노드를 작성해보는 것이 목표야.
다음 단계에서는 **"Python 또는 C++을 이용해서 ROS 2 노드를 직접 만드는 법"**을 배
워볼 거야!
좋아! 이제 ROS 2에서 직접 노드를 만들어 실행하는 방법을 배워보자.
우리는 Python을 사용해서 ROS 2 노드를 작성할 거야!
7. ROS 2에서 Python 노드 작성하기
ROS 2에서는 Python 또는 C++ 언어로 노드를 만들 수 있어.
이번에는 Python을 사용해서 직접 노드를 만들어 실행하는 방법을 배워보자.
7.1 새로운 패키지 생성하기
ROS 2에서는 코드를 패키지 단위로 관리해.
그래서 새로운 기능을 만들 때는 새 패키지를 먼저 생성해야 해.
패키지 생성 명령어
먼저, 워크스페이스가 있어야 해. 기본적으로 ros2_ws라는 폴더 안에서 작업한다고 가정
할게.
1⃣ 워크스페이스 폴더로 이동
cd ~/ros2_ws/src
2⃣ 새로운 패키지 생성
ros2 pkg create --build-type ament_python my_robot_pkg
이 명령어를 실행하면 my_robot_pkg라는 새로운 패키지가 만들어질 거야.
생성된 패키지 구조
패키지를 만들면 다음과 같은 폴더가 생성돼:
my_robot_pkg/
│── package.xml
# 패키지 설정 파일
│── setup.py
# 패키지 설치 관련 파일
│── resource/
# 리소스 폴더
│── my_robot_pkg/
# Python 코드가 들어갈 폴더
│── test/
# 테스트 코드 폴더
우리는 my_robot_pkg 폴더 안에 새로운 Python 노드를 만들 거야.
7.2 Python 노드 작성하기
이제 직접 노드를 만들어서 실행해보자!
1⃣ Python 스크립트 만들기
패키지 폴더로 이동해서 Python 파일을 만들어 줘.
cd ~/ros2_ws/src/my_robot_pkg/my_robot_pkg
touch my_first_node.py
2⃣ Python 코드 작성
이제 my_first_node.py 파일을 열어서 아래 코드를 입력해 줘.
import rclpy
# ROS 2 라이브러리
from rclpy.node import Node
# 노드(Node) 클래스 사용
class MyFirstNode(Node): # 노드 클래스 정의
def __init__(self):
super().__init__('my_first_node') # 노드 이름 설정
self.get_logger().info("Hello, ROS 2 World! This is my first node.")
def main(args=None):
rclpy.init(args=args)
# ROS 2 초기화
node = MyFirstNode()
# 노드 객체 생성
rclpy.spin(node)
# 노드 실행 (계속 실행되도록)
node.destroy_node()
# 노드 종료
rclpy.shutdown()
# ROS 2 종료
if __name__ == '__main__':
main()
설명
•
rclpy: ROS 2의 Python 라이브러리.
•
Node: ROS 2의 기본 단위인 노드 클래스.
•
get_logger().info("메시지"): 로그 메시지 출력.
•
rclpy.spin(node): 노드를 계속 실행시키는 역할.
7.3 실행 가능하도록 설정하기
Python 스크립트는 실행 권한을 줘야 실행할 수 있어.
1⃣ 실행 권한 추가
chmod +x my_first_node.py
2⃣ setup.py 수정 setup.py 파일을 열고, 아래처럼 entry_points를 추가해 줘.
entry_points={
'console_scripts': [
'my_first_node = my_robot_pkg.my_first_node:main',
],
},
3⃣ 빌드(Build) 이제 패키지를 빌드해야 실행할 수 있어.
cd ~/ros2_ws
colcon build
빌드가 끝나면, 새로 빌드된 패키지를 사용하기 위해 환경 변수를 설정해 줘야 해.
source install/setup.bash
7.4 노드 실행하기
이제 우리가 만든 첫 번째 ROS 2 노드를 실행해보자!
ros2 run my_robot_pkg my_first_node
출력 결과
[INFO] [my_first_node]: Hello, ROS 2 World! This is my first node.
축하해! 이제 ROS 2에서 Python으로 직접 만든 노드를 실행할 수 있어!
8. 다음 학습 방향
ROS 2에서 새로운 패키지를 만들고 Python으로 노드를 작성했어!
빌드하고 실행하는 방법도 배웠어!
이제 "노드 간 통신(토픽, 서비스, 액션)"을 배워야 해!
다음에는 **노드 간 메시지를 주고받는 방법(토픽, 서비스, 액션)**을 배워볼 거야!
좋아! 이제 **ROS 2에서 노드 간 통신 방법(토픽, 서비스, 액션)**을 배워보자.
이 부분이 중요한 이유는 ROS 2에서 노드들은 독립적으로 실행되지만, 서로 데이터를
주고받으며 협력해야 하기 때문이야.
9. ROS 2 노드 간 통신
ROS 2 에서는 노드 간 데이터를 주고받는 방식으로 세 가지 방법이 있어:
1. 토픽(Topic) → 실시간 데이터 스트리밍 (예: 센서 데이터, 로봇 위치 정보)
2. 서비스(Service) → 요청-응답 방식 (예: 특정 명령 수행 요청)
3. 액션(Action) → 비동기 명령 처리 (예: 로봇 팔이 특정 동작 수행 후 결과 반환)
이제 하나씩 차근차근 살펴볼게!
9.1 토픽(Topic) - 노드 간 메시지 송수신
토픽이란?
토픽(Topic)은 한 노드가 데이터를 발행(Publish)하면, 다른 노드가 구독(Subscribe)하는
방식으로 동작해.
예를 들면:
•
센서 노드 → /sensor_data 토픽에 센서 값을 발행(Publish)
•
제어 노드 → /sensor_data 토픽을 구독(Subscribe)하여 센서 값을 받아 로봇을
제어
토픽 구조
[Publisher 노드] → (토픽) → [Subscriber 노드]
토픽 확인하기
1⃣ 현재 실행 중인 모든 토픽 확인
ros2 topic list
출력 예시:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/pose
2⃣ 특정 토픽의 메시지 확인 (예: 거북이 위치 정보)
ros2 topic echo /turtle1/pose
출력 예시:
x: 5.544445
y: 5.544445
theta: 0.000000
linear_velocity: 0.000000
angular_velocity: 0.000000
이제 우리가 직접 퍼블리셔(Publisher)와 서브스크라이버(Subscriber) 노드를 만들어
보자!
9.2 퍼블리셔(Publisher) 노드 작성하기
퍼블리셔 노드는 특정 데이터를 발행(Publish) 하는 역할을 해.
1⃣ Python 스크립트 생성
cd ~/ros2_ws/src/my_robot_pkg/my_robot_pkg
touch my_publisher.py
2⃣ 퍼블리셔 코드 작성
import rclpy
from rclpy.node import Node
from std_msgs.msg import String # 문자열 메시지 타입 사용
class MyPublisher(Node):
def __init__(self):
super().__init__('my_publisher') # 노드 이름 설정
self.publisher_ = self.create_publisher(String, 'my_topic', 10) # 토픽 생성
self.timer = self.create_timer(1.0, self.publish_message) # 1 초마다 실행되는
타이머
self.count = 0
def publish_message(self):
msg = String()
msg.data = f'Hello ROS 2! Count: {self.count}'
self.publisher_.publish(msg) # 메시지 발행
self.get_logger().info(f'Published: {msg.data}')
self.count += 1
def main(args=None):
rclpy.init(args=args)
node = MyPublisher()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
9.3 서브스크라이버(Subscriber) 노드 작성하기
퍼블리셔가 보낸 데이터를 받아서 출력하는 서브스크라이버를 만들어 보자.
1⃣ Python 스크립트 생성
cd ~/ros2_ws/src/my_robot_pkg/my_robot_pkg
touch my_subscriber.py
2⃣ 서브스크라이버 코드 작성
import rclpy
from rclpy.node import Node
from std_msgs.msg import String # 문자열 메시지 타입 사용
class MySubscriber(Node):
def __init__(self):
super().__init__('my_subscriber') # 노드 이름 설정
self.subscription = self.create_subscription(
String, 'my_topic', self.listener_callback, 10)
self.subscription # 변수를 유지해야 함
def listener_callback(self, msg):
self.get_logger().info(f'Received: {msg.data}') # 메시지 출력
def main(args=None):
rclpy.init(args=args)
node = MySubscriber()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
9.4 실행하기
이제 우리가 만든 퍼블리셔와 서브스크라이버 노드를 실행해 보자!
1⃣ 빌드(Build)
cd ~/ros2_ws
colcon build
source install/setup.bash
2⃣ 퍼블리셔 실행
ros2 run my_robot_pkg my_publisher
3⃣ 새로운 터미널에서 서브스크라이버 실행
ros2 run my_robot_pkg my_subscriber
출력 결과 퍼블리셔 터미널:
[INFO] [my_publisher]: Published: Hello ROS 2! Count: 0
[INFO] [my_publisher]: Published: Hello ROS 2! Count: 1
[INFO] [my_publisher]: Published: Hello ROS 2! Count: 2
서브스크라이버 터미널:
[INFO] [my_subscriber]: Received: Hello ROS 2! Count: 0
[INFO] [my_subscriber]: Received: Hello ROS 2! Count: 1
[INFO] [my_subscriber]: Received: Hello ROS 2! Count: 2
성공적으로 토픽 통신을 구현했어!
10. 다음 학습 방향
토픽을 사용하여 노드 간 데이터를 주고받는 방법을 배웠어!
퍼블리셔(Publisher)와 서브스크라이버(Subscriber)를 직접 만들어 실행했어!
이제 "서비스(Service)와 액션(Action) 활용법"을 배워볼 거야!
다음 단계에서는 서비스(Service)를 사용하여 요청-응답 방식의 통신을 구현하는 방법을
배울 거야.
궁금한 점 있으면 언제든지 질문해 줘!
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )