크래쉬랩 M1
1 / 60

슬라이드 단축키

→ ↓ Space PageDown
다음 슬라이드
← ↑ PageUp
이전 슬라이드
Home / End
처음 / 마지막
F
전체화면 전환
?
도움말 열기 / 닫기

LECTURE 01

ROS2
로봇 프로그래밍 기초

2026.09.11 | 정혜원

  1. 01
    오늘 사용할 개발환경 큰 그림
  2. 02
    ROS2란 무엇인가
  3. 03
    Topic / Service / Action / Parameter 비교
  4. 04
    ROS 프로그램 개발 흐름
ROS2 로봇 프로그래밍 기초

01 Orientation

오늘 수업의 목표

ROS2를 전부 배우는 시간이 아니라, 실습을 시작하기 위한 구조를 잡는 시간

ROS2를 처음 보는 학생
• Ubuntu, VS Code, Terminal이 뭔지 이해한다.
• Workspace, Package, Node가 어떤 관계인지 설명할 수 있다.
• 기본 CLI로 현재 ROS 시스템 상태를 확인해볼 수 있다.
ROS2를 조금 써본 학생
• 평소 쓰던 용어를 다시 정확히 정리한다.
• Topic, Service, Action을 구분한다.
• 협업과 디버깅 상황에서 필요한 기본 확인법을 복습한다.
목표: 코드 문법을 많이 외우는 것보다, ROS2 시스템을 읽고 확인하는 눈을 만든다.
ROS2 로봇 프로그래밍 기초

01 Orientation

요즘 개발 환경에서 더 중요해진 것

코드 생성 도구가 좋아져도, 구조를 이해하고 결과를 확인하는 능력은 개발자의 몫

코드 초안 생성
실행
확인
디버깅
도구가 잘해주는 일
• 반복적인 패키지/노드 코드 초안 작성
• 간단한 오류 메시지 해석과 수정
• 기존 예제 코드를 바탕으로 빠르게 변형
개발자가 알아야 하는 일
• 어떤 Node가 필요한지 설계
• 어떤 Topic/Service/Action을 써야 하는지 판단
• 실행 후 node/topic/message를 직접 확인
ROS2 로봇 프로그래밍 기초

02 Why ROS

로봇은 왜 복잡한가

센서
상태와 환경 인지
구동부
로봇을 실제로 움직임
제어부
명령과 판단 수행
구조부
기구·프레임 구성
전원부
전원 공급과 출력 관리
통신부
내부·외부 연결
ROS2 로봇 프로그래밍 기초

02 Why ROS

기능을 나누어 개발하기

카메라, AI, 제어, 모터를 모두 한 코드에 넣으면 수정·교체·디버깅이 어려워진다.

한 코드에 모두 넣는 방식
Camera + AI + Control + Motor
문제점
• 한 부분만 수정해도 전체에 영향을 줄 수 있다.
• 문제가 발생한 위치를 찾기 어렵다.
• 역할별로 협업하기 어렵다.
ROS2 방식
Camera
AI
Control
Motor
장점
• 기능별로 Node를 나눌 수 있다.
• 필요한 데이터만 Message로 주고받는다.
• 일부 기능을 수정하거나 교체하기 쉽다.
ROS2 로봇 프로그래밍 기초

03 Development Environment

오늘 사용할 개발환경 큰 그림

운영체제 위에 ROS2를 설치하고, VS Code와 Terminal로 작성·실행·확인한다.

Ubuntu
24.04 LTS
ROS2
Jazzy
Workspace
Package
Node
VS Code
코드를 작성하고 파일 구조를 확인하는 편집기
Terminal
build, source, run, CLI 확인을 수행하는 기본 창
ROS2 로봇 프로그래밍 기초

03 Development Environment

Visual Studio Code란 무엇인가

VS Code는 ROS 코드를 작성하고, 파일 구조와 터미널을 함께 볼 수 있는 코드 편집기이다.

VS Code에서 보는 것
• Workspace와 Package의 폴더 구조
• Python 또는 C++ 소스 코드
• package.xml, setup.py, CMakeLists.txt 같은 설정 파일
• 내장 터미널을 통한 실행 결과
주의할 점
VS Code가 ROS를 대신 이해해주는 것은 아니다.
코드를 편하게 보고 수정하게 해주는 도구일 뿐이며, 실제 실행과 확인은 ROS 구조와 터미널 명령어를 이해해야 가능하다.
ROS2 로봇 프로그래밍 기초

03 Development Environment

Terminal이란 무엇인가

명령어를 입력해 컴퓨터를 제어하는 텍스트 기반 인터페이스

터미널의 역할
• 현재 위치와 파일 구조를 확인한다.
• 프로그램을 build하고 실행한다.
• 실행 중인 ROS 시스템을 CLI로 관찰한다.
• 에러 로그를 바로 확인한다.
$ pwd # 현재 위치
$ ls # 파일/폴더 확인
$ cd src # 폴더 이동
$ ros2 ... # ROS2 명령어
ROS2 로봇 프로그래밍 기초

03 Development Environment

Ubuntu란 무엇인가

Ubuntu는 Linux 기반 운영체제이자 개발 플랫폼이다.

운영체제
• 컴퓨터의 하드웨어와 프로그램 실행을 관리한다.
• 파일, 프로세스, 네트워크, 권한 같은 기본 자원을 다룬다.
• Windows처럼 컴퓨터를 쓰기 위한 기본 환경이다.
Linux 기반
• Ubuntu는 Linux 계열 운영체제이다.
• 오픈소스 소프트웨어와 패키지 생태계를 사용한다.
• 개발 도구, 서버, 로봇 환경에서 많이 사용된다.
ROS2에서의 의미
• ROS2 Jazzy 실습의 기준 작업 환경이다.
• apt 패키지 설치와 터미널 기반 작업에 적합하다.
• ROS2 공식 튜토리얼과 예제가 Ubuntu 기준으로 많이 제공된다.
이 수업에서 Ubuntu는 깊게 배우는 대상이 아니라, ROS2를 설치하고 실행하는 Linux 기반 개발 환경으로 이해한다.
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

ROS2란 무엇인가

ROS2는 ROS 소프트웨어 두 번째 버전이며, 로봇 개발용 라이브러리·도구 집합이다.

설명
• ROS는 전통적인 컴퓨터 운영체제가 아니다.
• 로봇 프로그램 개발을 돕는 라이브러리와 도구 모음이다.
• 로봇의 여러 부분이 서로 통신하도록 돕는 framework 역할을 한다.
이 수업에서의 의미
ROS2는 로봇 기능을 Node로 나누고, Topic·Service·Action 같은 인터페이스로 연결하며, CLI 도구로 실행 상태를 확인할 수 있게 해주는 로봇 개발 프레임워크이다.
핵심 단어: Node, Interface, Message, Topic, Service, Action, Parameter, CLI
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

ROS2를 이해하는 문장

ROS2는 “여러 Node가 인터페이스를 통해 Message를 주고받으며 로봇 애플리케이션을 구성하는 구조”이다.

Camera
Node
/image
Topic
Vision
Node
/target
Topic
Control
Node
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

ROS 개발 구조 큰 그림

ROS2 프로젝트는 보통 Workspace 안에 Package를 만들고, Package 안에 Node와 설정 파일을 둔다.

Workspace
src/
Package
Node
Message
my_ws/
├─ src/
│ └─ robot_control/
│ ├─ package.xml
│ ├─ setup.py
│ └─ robot_node.py
├─ build/
├─ install/
└─ log/
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

Workspace란 무엇인가

Workspace는 ROS 프로젝트와 패키지들을 모아 두는 작업 공간이다.

역할
• 하나의 실습 또는 프로젝트 단위를 담는다.
• 여러 Package를 함께 build할 수 있다.
• 보통 src 폴더 안에 패키지를 둔다.
자주 보게 되는 폴더
• src/ 패키지들이 들어가는 곳
• build/ 소스 코드를 실행 가능한 형태로 만드는 과정에서 사용하는 작업 폴더
• install/ 실행에 필요한 결과물이 준비되는 곳
• log/ 빌드 로그와 에러 확인용 파일
처음에는 “Workspace = ROS 프로젝트 폴더” 정도로 이해하고 시작해도 충분하다.
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

Package란 무엇인가

Package는 Node, 설정 파일, 실행 정보를 묶어 놓은 단위이다.

Package 안에 들어가는 것
• 실행할 Node 코드
• 의존성 정보 : 어떤 ROS 라이브러리를 쓰는가
• 빌드/설치 정보 : 어떻게 실행 가능하게 만들 것인가
robot_control/
├─ package.xml
├─ setup.py 또는 CMakeLists.txt
├─ resource/
└─ robot_control/
└─ robot_node.py
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

Node란 무엇인가

Node는 ROS2에서 실제로 실행되는 하나의 프로그램이며, 보통 하나의 역할을 담당한다.

정의
• Node = ROS 시스템 안에서 실행되는 역할 단위
예를 들어 카메라를 읽는 프로그램, 이미지를 처리하는 프로그램, 모터에 명령을 보내는 프로그램을 각각 다른 Node로 만들 수 있다.
camera
node
vision
node
control
node
motor
node
ROS2 로봇 프로그래밍 기초

04 ROS2 Basics

Message란 무엇인가

Message는 Node 사이에서 주고받는 실제 데이터이며, Message Type은 그 데이터가 어떤 필드와 자료형으로 구성되는지 정의한다.

Message와 Message Type
Twist 예시
Message는 ROS2 통신에서 실제로 전달되는 데이터이다.
Message Type은 Message에 어떤 필드가 있고, 각 필드가 어떤 자료형인지 정의한다.
같은 Message Type이라도 실제 Message에 들어가는 값은 달라질 수 있다.
실습에서는 /cmd_vel Topic으로 Twist Message를 주고받는다.
핵심 구분: Message Type = 형식, Message = 실제 값
geometry_msgs/msg/Twist ← Message Type
linear : geometry_msgs/msg/Vector3
x : float64
y : float64
z : float64
angular : geometry_msgs/msg/Vector3
x : float64
y : float64
z : float64
실제 Message 예:
linear.x = 0.5
angular.z = 0.2
ROS2 로봇 프로그래밍 기초

05 Communication

Topic: Publish / Subscribe 통신

Topic은 Node들이 Message를 교환하기 위해 사용하는 Publish / Subscribe 통신 인터페이스이다.

특징
• 비동기(Asynchronous) 단방향
통신이다.
• Publisher는 Subscriber의 응답을
기다리지 않고 Message를 publish한다.
• Subscriber는 필요한 Topic을
subscribe하여 Message를 수신한다.
• 하나의 Topic에 여러 Publisher와
Subscriber가 연결될 수 있다.
• 지속적으로 전달되는 데이터에 적합하다.
Publisher
Node
publish
/scan
Topic
subscribe
Subscriber
Node
$ ros2 topic list -t
$ ros2 topic info /scan
$ ros2 topic echo /scan
$ ros2 interface show
sensor_msgs/msg/LaserScan
응답 없이 Message를 계속 전달해야 하면 Topic
ROS2 로봇 프로그래밍 기초

05 Communication

Service: Request / Response 통신

Service는 요청을 보내고 그에 대한 응답을 받는 Request / Response 통신 인터페이스이다.

특징
• Request/Response 기반의
양방향 통신이다.
• Client가 Request를 보내면
Server가 Response를 반환한다.
• 한 번의 Request와 한 번의
Response가 서로 대응된다.
• 호출은 동기 또는 비동기 방식으로
사용할 수 있다.
• 중간 진행 상태를 계속 전달하는
구조는 아니다.
Service
Client
Service
Server
Request
Response
$ ros2 service list -t
$ ros2 service type /reset
$ ros2 interface show std_srvs/srv/Empty
$ ros2 service call /reset std_srvs/srv/Empty "{}"
요청을 보내고 응답을 받아야 하면 Service
ROS2 로봇 프로그래밍 기초

05 Communication

Action: Goal / Feedback / Result 통신

Action은 Goal을 요청하고, 진행 상태와 최종 결과를 다룰 수 있는 통신 인터페이스이다.

특징
• 비동기(Asynchronous) 양방향
통신이다.
• Client는 Server에 Goal을 보낸다.
• Server는 작업 중 Feedback을 보내
진행 상태를 알려줄 수 있다.
• 작업이 끝나면 Server가
Result를 반환한다.
• 필요하면 Client는 실행 중인 Goal을
취소할 수 있다.
Action
Client
Action
Server
Goal
Cancel (선택사항)
Feedback
Result
예: turtlesim에서 /turtle1/rotate_absolute Action은 거북이를 목표 각도까지
회전시키고, 완료되면 결과를 반환한다.
$ ros2 action list
$ ros2 action info /turtle1/rotate_absolute
$ ros2 action send_goal /turtle1/rotate_absolute \
turtlesim/action/RotateAbsolute "{theta: 1.57}"
ROS2 로봇 프로그래밍 기초

05 Communication

Parameter: Node의 설정값

Parameter는 Node에 연결된 configuration value, 즉 Node 설정값이다.

특징
• Parameter는 Topic/Service/Action처럼 Node 사이의 인터페이스가 아니다.
• 각 Node는 자기 설정값을 key-value 형태로 가진다.
• bool, integer, double, string, array 값을 가질 수 있다.
• 시작 시점이나 실행 중에 값을 확인·변경할 수 있다.
확인 예시
$ ros2 param list
$ ros2 param get /turtlesim background_g
Integer value is: 86
$ ros2 param set /turtlesim background_r 150
Set parameter successful
Parameter는 “Node의 설정값”이며, 통신 모델이 아니라 관리 대상이다
ROS2 로봇 프로그래밍 기초

05 Communication

Topic / Service / Action / Parameter 비교

구분
Topic
Service
Action
Parameter
정확한 의미
Message를 전달하는
이름 있는 통신 경로
짧은 작업의
Request / Response
시간이 걸리는 작업의
Goal / Feedback / Result
Node에 연결된
configuration value
역할
Publisher
Subscriber
Client
Server
Action Client
Action Server
Node별 보유
데이터 구조
.msg
예: String, Twist
.srv
Request / Response
.action
Goal / Feedback / Result
key-value
예: background_r
대표 예
/chatter, /scan
/turtle1/cmd_vel
/reset, /clear
/spawn
/turtle1/rotate_absolute
목표 각도 회전
속도 제한
센서 옵션
배경색
ROS2 로봇 프로그래밍 기초

06 Development Flow

ROS2는 어떤 언어로 만들까

ROS2 Node는 주로 C++과 Python으로 작성하지만, 환경과 클라이언트 라이브러리에 따라 다른 언어로도 개발할 수 있다.

C++ / rclcpp
• 실행 속도가 빠르고 성능 최적화에 유리하다.
• 하드웨어 driver, 제어기처럼 성능이 중요한 부분에서 많이 사용한다.
• 빌드 설정과 컴파일 개념이 중요하다.
Python / rclpy
• 코드가 간단하고 수정하기 쉽다.
• 빠르게 만들고 테스트하기 좋다.
• AI, 데이터 처리, 교육용 예제와 연결하기 좋다.
이번 수업에서는 Python을 중심으로 실습한다. 언어가 달라도 같은 ROS2 Interface와 Message Type을 사용하면 Node끼리 통신할 수 있다.
ROS2 로봇 프로그래밍 기초

06 Development Flow

ROS 프로그램 개발 흐름

실습에서는 같은 흐름을 반복한다: 코드를 작성하고, build하고, source로 현재 Terminal 환경을 적용하고, 실행한 뒤 CLI로 확인한다.

code
작성
colcon
build
source
ros2
run
CLI로
확인
수정
에러가 나도 이 순서 안에서 원인을 찾으면 된다.
예: 빌드를 안 했는가? source를 안 했는가? package/node 이름이 맞는가? topic이 실제로 흐르는가?
ROS2 로봇 프로그래밍 기초

06 Development Flow

Build란 무엇인가

Build는 작성한 Package를 처리하여 ROS2에서 실행 가능한 결과물을 준비하는 과정이다.

Build에서 하는 일
• src/의 Package를 대상으로 build한다.
• C++은 컴파일·링크해 실행 파일을 만든다.
• Python Package는 실행 정보와 entry point(ros2 run으로 실행할 수 있게 연결해 주는 실행 등록 정보)를 준비한다.
• 결과는 build/, install/, log/에 생성된다.
$ cd ~/my_ws
$ colcon build --symlink-install
Build = Package를 실행 가능한 상태로 준비하는 과정
Build 결과가 어디에 만들어지는지 확인한다
src/
Package
colcon
build
build/
빌드 작업
install/
실행 결과
log/
빌드 로그
ROS2 로봇 프로그래밍 기초

06 Development Flow

Source란 무엇인가

source는 setup.bash에 들어 있는 환경 설정을 현재 Terminal(shell)에 적용하는 명령이다.

왜 필요한가
• 새 Terminal을 열면 새로운 shell 환경이 시작된다.
• /opt/ros/jazzy/setup.bash를 source하면 ROS2 Jazzy 환경을 사용할 수 있다.
• Workspace의 install/setup.bash를 source하면 build한 Package를 현재 Terminal이 찾을 수 있다.
$ source /opt/ros/jazzy/setup.bash
$ source ~/my_ws/install/setup.bash
$ echo $ROS_DISTRO
jazzy
source는 코드를 다시 만드는 과정이 아니라, 현재 shell이 ROS2와 build 결과를 찾도록 환경을 적용하는 단계이다.
기억할 점
• 새 Terminal을 열면 환경도 새로 시작된다.
• ROS2 기본 환경은 /opt/ros/jazzy/setup.bash
• 내 Workspace는 ~/my_ws/install/setup.bash
• Package가 안 보이면 source 여부부터 확인한다.
ROS2 로봇 프로그래밍 기초

06 Development Flow

Run: Node 실행하기

build와 source가 끝나면 ros2 run으로 특정 Package의 특정 Node를 실행한다.

$ ros2 run <package_name> <node_name>
예시
$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key
기억할 구조
ros2 run은 “패키지 안에 등록된 실행 가능한 Node를 실행한다”는 의미이다.
따라서 package 이름과 node 이름을 구분해서 기억해야 한다.
실습에서는 여러 터미널을 동시에 사용한다. 예를 들어 한 터미널에서 simulator node를 실행하고, 다른 터미널에서 teleop node를 실행할 수 있다.
ROS2 로봇 프로그래밍 기초

07 CLI

공식 예제로 CLI 결과 확인하기

talker와 listener를 실행한 뒤, CLI로 관찰한다.

1 talker 실행
$ source /opt/ros/jazzy/setup.bash
$ ros2 run demo_nodes_cpp talker
2 listener 실행
$ source /opt/ros/jazzy/setup.bash
$ ros2 run demo_nodes_py listener
3 Node 확인
$ ros2 node list
/listener
/talker
4 Topic / Type 확인
$ ros2 topic list -t
$ ros2 topic info /chatter
t : type까지 ros2 topic list 출력
<- Parameter 변경 알림용 ROS2 시스템 Topic
<- 로그 전달용 ROS2 시스템 Topic
<- Publisher endpoint가 1개 있다는 뜻
/chatter에는 Publisher 1개와 Subscription 1개가 연결되어 있다.
ROS2 로봇 프로그래밍 기초

07 CLI

rqt_graph로 ROS Graph 보기

CLI로 확인한 Node와 Topic의 연결 관계를 GUI로도 확인할 수 있다.

예시 화면
화면 읽기
• /talker, /listener : 실행 중인 Node 이름
• /chatter : 두 Node가 통신에 사용하는 Topic name
• 화살표 방향 : Message가 전달되는 방향
• /talker가 publish하고 /listener가 subscribe한다.
• 현재 화면은 "Nodes only" 보기라 Topic이 선 위의 이름으로 표시된다.
실행 명령: rqt_graph
CLI에서 본 ros2 node list, ros2 topic info 결과를 그림으로 연결해 보여주는 도구이다.
ROS2 로봇 프로그래밍 기초

07 CLI

rqt_plot으로 Topic 값 변화 보기

Topic Message 안의 숫자 필드를 시간에 따라 그래프로 확인할 수 있다.

예시 화면
화면 읽기
• 입력한 Topic의 숫자형 field를 실시간 그래프로 표시한다.
• 가로축은 시간, 세로축은 Message field의 값이다.
• 예: /turtle1/pose/x, /turtle1/pose/y
• 값의 변화·진동·튐을 눈으로 확인하기 좋다.
• rqt_graph는 연결 구조, rqt_plot은 값의 변화를 본다.
실행 명령: rqt_plot
ROS2 로봇 프로그래밍 기초

07 CLI

로봇이 안 움직일 때 어디부터 볼까

현상만 보고 바로 코드를 고치기보다, 상태가 정상인지 먼저 확인한다.

1
필요한 Node가 실행 중인가?
ros2 node list
2
원하는 Topic이 존재하는가?
ros2 topic list
3
그 Topic에 실제 데이터가 전달되고 있는가?
ros2 topic echo /topic_name
4
Node의 연결 관계가 맞는가?
ros2 node info /node_name
이 흐름을 익히면, 직접 작성한 코드가 아니어도 시스템을 분석하고 질문할 수 있다.
ROS2 로봇 프로그래밍 기초

08 Wrap-up

요즘 ROS 개발에서 중요한 것

도구가 코드를 빠르게 만들어줄 수 있어도, 개발자는 구조와 검증을 이해해야 한다.

코드 생성 도구에게 맡겨도 되는 것
• Package와 Node 코드 초안 생성
• Publisher/Subscriber boilerplate 작성
• 에러 메시지 기반 수정 후보 제안
• 반복적인 설정 파일 작성 보조
개발자가 기본적으로 알아야 하는 것
• Node를 어떻게 나눌지 판단
• Topic/Service/Action 중 무엇을 쓸지 판단
• build/source/run 흐름 이해
• CLI로 실행 결과를 직접 확인
결론: ROS2 기초는 “코드를 전부 직접 치기 위해서”가 아니라, 시스템을 이해하고 확인하기 위해 배운다.
ROS2 로봇 프로그래밍 기초

08 Wrap-up

개념 정리

ROS2를 처음 시작할 때 가장 중요한 것은 전체 구조를 읽는 눈이다.

1
ROS2는 로봇 애플리케이션을 만들기 위한 라이브러리·도구·통신 프레임워크이다.
2
Topic은 Pub/Sub, Service는 Request/Response, Action은 Goal/Feedback/Result, Parameter는 Node 설정값이다.
3
build → source → run → CLI 확인 흐름을 반복하며 현재 Terminal 환경과 ROS Graph를 함께 확인한다.
4
Topic 이름과 Message Type을 구분해야 Node 사이의 연결을 정확히 읽을 수 있다.
ROS2 로봇 프로그래밍 기초

LECTURE 01

ROS2
로봇 프로그래밍 실습

2026.09.11 | 정혜원

  1. 01
    Workspace 만들기
  2. 02
    Mission 1-A: Publisher 만들기
  3. 03
    Mission 1-B: Subscriber 만들기
  4. 04
    실습 2: MuJoCo에서 로봇을 움직여보자
ROS2 로봇 프로그래밍 실습

Practice Overview

오늘의 실습

실습 1
ROS2 Package를 만들고
Publisher / Subscriber 통신 구현
• Terminal 기본 조작
• Workspace / Package 생성
• Topic 확인
• build → source → run
실습 2
MuJoCo에서 제공된 로봇을
키보드 입력으로 움직여보기
• 시뮬레이션 / MuJoCo 개념
• URDF / MJCF(XML) / scene 파일 확인
• wheel actuator 찾기
• W/A/S/D + Space 제어 구현
ROS2 로봇 프로그래밍 실습

Lab 1 ROS2 Topic Communication

실습 1 목표

직접 만든 두 Node가 /cmd_vel Topic으로 Twist Message를 주고받게 합니다.

cmd_vel
publisher
/cmd_vel
Twist
cmd_vel
subscriber
세 번째 Terminal에서는 topic echo로 실제 데이터가 흐르는지 확인합니다.
Terminal
$ ros2 topic echo /cmd_vel
linear:
x: 0.5
angular:
z: 0.2
ROS2 로봇 프로그래밍 실습

Lab 1 Terminal Warm-up

Terminal 기본 명령어

ROS2 실습에서 계속 사용하는 기본 조작만 짧게 확인합니다.

Terminal
$ pwd
/home/student
$ ls
ros2_ws Downloads
$ mkdir test_dir
$ cd test_dir
$ cd ..
의미
pwd
현재 위치 확인
ls
파일과 폴더 확인
mkdir
새 폴더 생성
cd
폴더 이동
pwd : print working directory
ls : list
mkdir : make directory
cd : change directory
ROS2 로봇 프로그래밍 실습

Lab 1 Environment Setup

bashrc란 무엇인가

bashrc는 새 Terminal을 열 때 Bash가 자동으로 읽는 사용자 설정 파일이다.

bashrc 역할
• Terminal을 열 때마다 반복할 설정을 미리 적어둔다.
• ROS2 환경 설정, Workspace 경로, 단축 명령을 자동 적용할 수 있다.
• 한 번 설정하면 매 실습마다 같은 명령을 다시 입력하지 않아도 된다.
• 수정한 뒤에는 새 Terminal을 열거나 source ~/.bashrc 로 다시 적용한다.
~/.bashrc에 넣는 예시
export ROS_WS=$HOME/tutorial_ws #ROS2 작업공간 설정

source /opt/ros/jazzy/setup.bash ##ROS2 jazzy 기본 설정 로드
source $ROS_WS/install/local_setup.bash ##ROS2 작업공간에서 빌드된 패키지 설정 로드

export ROS_DOMAIN_ID=7 ##DDS의 도메인 아이디를 7로 설정
export ROS_NAMESPACE=robot1 ##ROS2 기본 네임스페이스를 robot1로 설정

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp ##ROS2 통신 미들웨어 구현을 FastRTPS 사용

alias cw='cd $ROS_WS' ##ROS2 작업공간으로 이동하는 단축어
alias cs='cd $ROS_WS/src' ##ROS2 작업공간의 src 디렉토리로 이동하는 단축어
alias cb='cd $ROS_WS && colcon build --symlink-install' ##ROS2 작업공간 패키지를 빌드
source
파일 내용을 현재 shell에 적용
ROS2 setup.bash 같은 설정 파일을 현재 Terminal에 적용한다.
export
환경 변수 설정
다른 프로그램도 볼 수 있는 설정값을 만든다.
alias
명령어 단축 이름
자주 쓰는 긴 명령을 짧은 이름으로 실행한다.
ROS2 로봇 프로그래밍 실습

Lab 1 Environment Setup

Middleware, DDS, RMW 정의

ROS2 통신을 이해하기 위해 세 용어의 역할만 먼저 구분한다.

Middleware
미들웨어
프로그램과 프로그램 사이에서 통신, 데이터 전달, 연결 관리를 도와주는 중간 계층이다.
ROS2에서는 Node 사이 통신을 직접 네트워크 코드로 구현하지 않도록 도와준다.
DDS
Data Distribution Service
분산 시스템에서 데이터를 publish / subscribe 방식으로 주고받기 위한 통신 표준이다.
ROS2의 기본 통신 미들웨어로 사용된다.
RMW
ROS Middleware Interface
ROS2 코드와 실제 미들웨어 구현 사이를 연결하는 추상화 계층이다.
Fast DDS, Cyclone DDS 같은 구현을 바꿔 사용할 수 있게 해준다.
ROS2에서의 위치
rclpy / rclcpp
사용자 코드
RMW
DDS 구현
Fast DDS 등
Network
다른 Node
오늘은 구현 세부가 아니라 “DDS, RMW, Middleware가 무엇을 가리키는 용어인지”만 확인한다.
ROS2 로봇 프로그래밍 실습

Lab 1 Workspace

Workspace 만들기

Workspace는 ROS2 프로젝트와 패키지를 모아두는 작업 공간입니다.

Terminal
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ pwd
/home/student/ros2_ws
$ ls
src
생성되는 구조
folder
ros2_ws/
└── src/
└── 앞으로 만들 패키지
Workspace = 프로젝트 작업 공간
src = 직접 만든 Package가 들어가는 위치
-p : parents
필요한 상위 디렉터리까지 같이 만들어준다.
이미 디렉터리가 있어도 오류를 내지 않는다.

ROS2 로봇 프로그래밍 실습

Lab 1 Package

첫 Package 만들기

ros2 pkg create는 새 ROS2 패키지의 기본 폴더와 설정 파일을 생성하는 명령어입니다.

Terminal
$ cd ~/ros2_ws/src
$ ros2 pkg create mobile_robot_control \
--build-type ament_python \
--dependencies rclpy geometry_msgs
$ ls
mobile_robot_control
명령어를 나누어 읽기
ros2 pkg create
ROS2 패키지 기본 구조 생성
mobile_robot_control
이번 실습의 패키지 이름
--build-type ament_python
Python 방식으로 빌드·설치
--dependencies
사용할 ROS2 패키지를 의존성으로 기록
rclpy
Python에서 ROS2 Node와 Topic 기능을 사용
geometry_msgs
Twist 같은 이동·위치 관련 Message Type 제공
생성 결과
~/ros2_ws/src/mobile_robot_control/ 폴더가 생성된다.
다음 장에서 package.xml, setup.py, setup.cfg, resource/가 각각 어떤 역할을 하는지 확인한다.
핵심: 패키지 이름, 빌드 방식, 사용할 의존 패키지를 한 번에 지정한다.
ROS2 로봇 프로그래밍 실습

Lab 1 Package Structure

Package 안에는 무엇이 생길까

ROS2 Python 패키지는 “패키지 정보”, “설치·실행 설정”, “실제 Python 코드”를 함께 가진다.

생성된 파일 구조
mobile_robot_control/
├── package.xml
├── setup.py
├── setup.cfg
├── resource/
│ └── mobile_robot_control
└── mobile_robot_control/
└── __init__.py
각 파일의 정확한 역할
package.xml = ROS2 package manifest
manifest는 패키지의 이름·버전·설명·license·dependency를 기록한 정보 파일이다.
ROS2는 이 파일을 보고 패키지 정보를 확인한다.
setup.py = Python 설치·실행 설정
setuptools가 읽는 설정 파일이다.
console_scripts는 “ros2 run에서 쓸 실행 이름 → 실행할 main() 함수”를 연결한다.
setup.cfg = 실행 script 설치 위치
생성된 실행 script를 lib/<package_name> 위치에 설치하도록 지정한다.
그래야 ros2 run이 실행 파일을 찾을 수 있다.
resource/<pkg> = marker file
marker file은 “이 패키지가 설치되어 있음”을 파일의 존재로 표시한다.
ament index가 패키지를 찾을 때 사용한다.
안쪽 mobile_robot_control/ = Python 코드 위치
cmd_vel_publisher.py, cmd_vel_subscriber.py 같은 실제 Node 소스를 작성하는 폴더이다.
__init__.py는 이 폴더를 Python package로 표시하는 파일이다.
핵심: package.xml은 ROS2가 읽는 정보, setup.py/setup.cfg는 실행 등록, 안쪽 폴더는 코드 작성 위치이다.
ROS2 로봇 프로그래밍 실습

Lab 1 Build

Build 해보기

build를 하면 Workspace 안에 build / install / log 폴더가 생깁니다.

Terminal
$ cd ~/ros2_ws
$ colcon build --symlink-install
$ ls
build install log src
폴더 의미
src
내가 작성하는 코드와 패키지
build
빌드 중간 결과
install
실행할 때 ROS2가 찾는 결과
log
빌드 과정의 기록
build 폴더를 직접 수정하지 않습니다. 코드는 항상 src 안에서 수정합니다.
ROS2 로봇 프로그래밍 실습

Lab 1 Source

Source 하기

source는 ROS2 명령어가 아니라 Bash 내장 명령어이며, setup.bash의 환경 설정을 현재 Terminal(shell)에 적용합니다.

Build
준비한다
Source
찾게 한다
Run
실행한다
Terminal
$ source /opt/ros/jazzy/setup.bash
$ source ~/ros2_ws/install/setup.bash
먼저 /opt/ros/jazzy/setup.bash로 기본 ROS2 환경을 적용하고, 그 다음 ~/ros2_ws/install/setup.bash로 내가 빌드한 Workspace를 연결합니다.
ROS2 로봇 프로그래밍 실습

Lab 1 Message

Message Type 자세히 보기 - Twist

Message Type은 Message가 가질 field 이름과 각 field의 data type을 정의합니다.

Message Type 이름 읽기
geometry_msgs/msg/Twist

• geometry_msgs : package 이름
• msg : message interface 종류
• Twist : type 이름

Type은 어떤 field가 있고 각 field가 어떤 type인지 정의합니다.
Twist 공식 구조
geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular

Vector3
float64 x
float64 y
float64 z
linear = 선속도
angular = 각속도

이 실습에서는
linear.x : 전진/후진
angular.z : 좌/우 회전
/cmd_vel = Topic 이름
geometry_msgs/msg/Twist = Message Type
→ Topic과 Message Type은 서로 다른 개념입니다.
Message Type = “데이터 구조의 설계” · 실제 Message = 그 구조에 값을 채운 한 데이터
ROS2 로봇 프로그래밍 실습

Lab 1 Publisher

Mission 1-A: Publisher 만들기

코드는 직접 작성하거나 Agent를 활용해도 됩니다. 단, 요구사항은 반드시 만족해야 합니다.

필수 요구사항
Node name
cmd_vel_publisher
Topic
/cmd_vel
Message
geometry_msgs/msg/Twist
Period
1초마다 publish
Value
linear.x = 0.5
angular.z = 0.2
터미널 출력 예시
Terminal
Publishing /cmd_vel:
linear.x=0.50
angular.z=0.20
출력문이 없으면 publish가 되는지 확인하기 어렵습니다. 반드시 로그가 나오게 만드세요.
Output
topic name, value
ROS2 로봇 프로그래밍 실습

Lab 1 Subscriber

Mission 1-B: Subscriber 만들기

/cmd_vel Topic을 구독하고, 들어오는 Twist 값을 터미널에 출력합니다.

필수 요구사항
Node name
cmd_vel_subscriber
Subscribe
/cmd_vel
Message
geometry_msgs/msg/Twist
Action
Message를 받을 때마다 출력
터미널 출력 예시
Terminal
Received /cmd_vel:
linear.x=0.50
angular.z=0.20
Publisher와 Subscriber의 Topic 이름과 Message Type이 반드시 같아야 합니다.
Output
topic name, received value
ROS2 로봇 프로그래밍 실습

Lab 1 Hint

코드 작성 위치와 실행 등록 힌트

Python Node는 파일을 만든 뒤 setup.py에 ros2 run 실행 이름을 등록해야 합니다.

파일 위치
mobile_robot_control/
└── mobile_robot_control/
├── cmd_vel_publisher.py
└── cmd_vel_subscriber.py
setup.py 힌트
entry_points={
'console_scripts': [
'cmd_vel_pub = mobile_robot_control.cmd_vel_publisher:main',
'cmd_vel_sub = mobile_robot_control.cmd_vel_subscriber:main',
],
},
중요
• 파일 이름, 함수 이름, setup.py 등록 이름이 서로 맞아야 합니다.
• ros2 run에서 사용하는 이름은 console_scripts 왼쪽 이름입니다: cmd_vel_pub, cmd_vel_sub
• 코드 수정 후에는 다시 build하고 source합니다.
ROS2 로봇 프로그래밍 실습

Lab 1 Run Nodes

Build → Source → Run

작성한 Publisher와 Subscriber를 각각 다른 Terminal에서 실행합니다.

1. Build & Source
$ cd ~/ros2_ws
$ colcon build --symlink-install --packages-select mobile_robot_control
$ source install/setup.bash
2. Terminal 1: Publisher
$ ros2 run mobile_robot_control cmd_vel_pub
Publishing /cmd_vel:
linear.x=0.50 angular.z=0.20
3. Terminal 2: Subscriber
$ ros2 run mobile_robot_control cmd_vel_sub
Received /cmd_vel:
linear.x=0.50 angular.z=0.20
두 터미널에 각각 Publishing / Received 출력이 보이면 첫 단계는 성공입니다.
ROS2 로봇 프로그래밍 실습

Lab 1 Verify

정말 ROS2 Topic으로 통신하고 있을까

print만 보는 것이 아니라 ROS2 시스템 안에서 Node와 Topic을 확인합니다.

Terminal 3에서 순서대로 실행
확인할 것
$ ros2 node list
$ ros2 topic list
$ ros2 topic echo /cmd_vel
$ ros2 topic info /cmd_vel
• Node: cmd_vel_publisher / cmd_vel_subscriber가 보이는가?
• Topic: /cmd_vel이 목록에 있는가?
• Data: linear.x, angular.z 값이 계속 들어오는가?
• Type: geometry_msgs/msg/Twist가 맞는가?
여기까지 확인해야 “ROS2 Topic으로 통신했다”고 말할 수 있습니다.
ROS2 로봇 프로그래밍 실습

Lab 1 Checkpoint

실습 1 완료 체크

아래 항목을 모두 확인하면 실습 1은 완료입니다.

완료 기준
• Workspace를 만들었다.
• mobile_robot_control Package를 만들었다.
• build / install / log 폴더를 확인했다.
• cmd_vel_publisher와 cmd_vel_subscriber가 실행된다.
• /cmd_vel Topic이 보인다.
• topic echo로 Twist 데이터가 보인다.
자주 막히는 지점
Package not found
source install/setup.bash 확인
Executable not found
setup.py console_scripts 확인
Topic이 안 보임
Publisher 실행 여부 확인
Message가 안 들어옴
Topic 이름과 Message Type 확인
ROS2 로봇 프로그래밍 실습

Lab 2 MuJoCo Control

실습 2: MuJoCo에서 로봇을 움직여보자

제공된 로봇 모델과 scene을 실행하고, 키보드 입력을 바퀴 제어로 연결합니다.

이번 실습의 기준
• 로봇이 화면에 보이는 최소 실행 코드는 제공
• 완성된 키보드 제어 코드는 제공하지 않음
• XML과 Python 코드를 확인하며 wheel 제어 구현
• Agent / ChatGPT / Codex / Claude 등 사용 가능
목표는 “키 입력이 로봇 움직임으로 연결되는지” 확인하는 것입니다.
ROS2 로봇 프로그래밍 실습

Lab 2 Simulation

왜 시뮬레이션이 필요한가

실제 로봇을 바로 움직이기 전에 모델과 제어 로직을 반복해서 검증하기 위한 개발 환경입니다.

이점
실제 하드웨어 전에 먼저 검증
• 안전: 잘못된 제어값을 실제 로봇에 바로 적용하지 않음
• 반복: 같은 초기 조건으로 여러 번 테스트 가능
• 관찰: joint, velocity, contact 등 내부 상태 확인
• 빠른 수정: 코드/모델을 바꾸고 즉시 다시 실행
중요한 한계
시뮬레이션은 실제 로봇과 같지 않다
질량, 마찰, 모터 특성, 센서 노이즈처럼 모델에 넣은 값과 실제 하드웨어가 다르면 결과도 달라질 수 있습니다.

따라서 목적은 실제 로봇을 “대체”하는 것이 아니라, 실제 적용 전에 제어 구조와 동작을 먼저 확인하는 것입니다.
Control code → Simulator → Motion / State 확인 → 수정 후 재실행
ROS2 로봇 프로그래밍 실습

Lab 2 MuJoCo

MuJoCo란 무엇인가

MuJoCo는 관절로 연결된 로봇과 접촉을 포함한 움직임을 계산하는 physics engine이다.

physics engine
질량, 관절, 중력, 힘, 마찰, 충돌 조건을 이용해 다음 순간의 움직임을 계산하는 소프트웨어
articulated structure
여러 body가 joint로 연결된 구조
예: 바퀴 로봇, 로봇팔, 휴머노이드
contact dynamics
로봇이 바닥이나 물체와 닿을 때 생기는 힘과 마찰까지 포함해 계산
이번 실습에서 MuJoCo가 하는 일
XML/MJCF
모델 읽기
MjModel
구조 정보
MjData
현재 상태
mj_step()
한 step 계산
viewer
화면 확인
MjModel
로봇과 환경의 고정된 정보
body, joint, geom, actuator, 질량, 옵션 등
MjData
시뮬레이션 중 계속 바뀌는 값
joint position/velocity, contact, data.ctrl 등
기억할 점: viewer가 로봇을 움직이는 것이 아니라, MuJoCo가 계산한 MjData 상태를 viewer가 화면에 보여준다.
ROS2 로봇 프로그래밍 실습

Lab 2 Model Files

XML, URDF, MJCF를 구분해서 보기

XML은 문법이고, URDF와 MJCF는 XML 문법을 사용하는 서로 다른 모델 형식이다.

관계 먼저 보기
XML
문법
URDF
ROS 모델 형식
MJCF
MuJoCo 모델 형식
둘 다 XML처럼 보일 수 있지만, 사용할 수 있는 태그와 각 태그의 의미가 다르다.
URDF
URDF
Unified Robot Description Format
• ROS에서 로봇의 link와 joint 구조를 설명한다.
• visual, collision, inertial 정보도 함께 적을 수 있다.
• 자세한 내용은 다음 장에서 본다.
<link name="base_link"/>
<joint name="wheel_joint"/>
MJCF
MJCF
MuJoCo XML Model Format
• MuJoCo에서 모델, 환경, actuator를 설명한다.
• body, joint, geom, actuator, worldbody 태그를 사용한다.
• URDF를 load할 수는 있지만 MJCF와 같은 형식은 아니다.
<body name="robot">
<motor joint="wheel"/>
ROS2 로봇 프로그래밍 실습

Lab 2 Model Files

URDF란 무엇인가

URDF는 로봇을 link와 joint의 연결 구조로 설명하는 XML 기반 모델 형식이다.

link
로봇의 부품
몸체, 바퀴, 센서처럼 하나의 부품을 나타낸다.
joint
부품 사이의 연결
parent link와 child link의 연결과 움직임을 정한다.
geometry
형상 정보
visual, collision, inertial 정보를 적을 수 있다.
구조로 이해하기
base_link
left_wheel
link
right_wheel
link
sensor_link
link = 부품, joint = 부품 사이의 연결
URDF 기본 형태
<robot name="m1_robot">
<link name="base_link"/>
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
</robot>
주요 태그
• robot: 전체 모델의 루트
• link: 로봇의 부품
• joint: link 사이의 연결
• visual: 화면 표시 형상
• collision: 충돌 계산 형상
• inertial: 질량과 관성
URDF는 로봇의 “구조 설명”이다. 실제 제어 입력은 MuJoCo의 actuator나 Python 코드에서 다시 확인한다.
ROS2 로봇 프로그래밍 실습

Lab 2 Starter Files

mujoco 설치 명령어

$ sudo apt install python3-pip
$ python3 -m pip install --user mujoco==3.7.0 --break-system-packages
ROS2 로봇 프로그래밍 실습

Lab 2 Starter Files

제공되는 파일

실습 2 패키지 이름은 m1_test로 통일합니다. 로봇이 화면에 보이는 최소 실행 상태까지는 제공하고, 제어는 직접 구현합니다.

starter folder
m1_test/
├── model/
│ ├── robot.urdf
│ ├── robot.xml
│ ├── scene.xml
│ └── meshes/
└── view_robot.py
ROS2 로봇 프로그래밍 실습

Lab 2 Read the Starter

키보드 입력은 어디에 연결할까

키 입력을 wheel actuator의 control 값으로 바꾸고, 그 값이 다음 simulation step에 반영되도록 연결한다.

전체 흐름
W/A/S/D
Space
Python
입력 처리
data.ctrl
제어값 저장
Wheel
Actuator
mj_step()
상태 계산
viewer.sync()
화면 반영
XML에서 찾을 것
• left/right wheel actuator의 name
• 각 actuator가 연결된 joint
• ctrlrange: 입력 가능한 control 값 범위
Python 코드에서 찾을 것
• MjModel / MjData 생성 위치
• 반복문(loop)과 key input 처리 위치
• data.ctrl[...]에 값을 쓰는 위치
단어 뜻
• joint: 두 body 사이의 움직임
• actuator: joint를 구동하는 요소
• data.ctrl: actuator에 줄 입력값 배열
핵심: 키보드는 로봇을 직접 움직이지 않는다. 코드가 키 입력을 left/right wheel control 값으로 바꾸고, MuJoCo가 mj_step()에서 그 값을 사용해 다음 상태를 계산한다.
ROS2 로봇 프로그래밍 실습

Lab 2 Keyboard Control

Mission 2: Agent로 키보드 제어 완성하기

Starter code는 M1 로봇을 MuJoCo 화면에 띄우는 단계까지 제공된다. 과제는 키 입력을 바퀴 actuator 제어로 연결하는 것이다.

목표: W/A/S/D/Space 입력에 따라 data.ctrl의 left/right wheel 값이 바뀌고, MuJoCo 화면에서 M1 로봇의 움직임이 달라지게 만든다.
성공해야 하는 입력
W
전진
left=+ right=+
S
후진
left=- right=-
A
좌회전
left=- right=+
D
우회전
left=+ right=-
Space
정지
left=0 right=0
구현 순서
1. robot.xml에서 left/right wheel actuator 이름을 찾는다.
2. Python 코드에서 key input을 읽는 위치를 찾는다.
3. 키 입력에 따라 left/right control 값을 결정한다.
4. data.ctrl[...]에 값을 넣고 mj_step() 후 viewer.sync()로 확인한다.
예: W 입력 → left=1.0, right=1.0
data.ctrl[left_id] = left
data.ctrl[right_id] = right
ROS2 로봇 프로그래밍 실습

Wrap-up

오늘 실습 정리

두 실습은 각각 다른 것을 확인하지만, 모두 “입력 → 구조 → 실행 결과 확인”이라는 흐름을 가집니다.

실습 1에서 확인한 것
ROS2 Topic 통신
Publisher
/cmd_vel
Subscriber
• Twist Message를 publish / subscribe
• ros2 topic list와 echo로 데이터 확인
• build → source → run 흐름 경험
실습 2에서 확인한 것
MuJoCo 로봇 제어
Keyboard
Wheel
Actuator
Robot
Motion
• 시뮬레이션과 MuJoCo의 역할 이해
• URDF와 MJCF(XML) 모델 형식 구분
• Keyboard → wheel actuator → mj_step → robot motion 연결
핵심: 코드를 만들고 끝내는 것이 아니라, 실행 결과를 관찰하고 필요한 부분을 다시 수정하는 과정까지 경험합니다.