AEGLOSLAB 제어공학 종합 핸드북

제0부 오리엔테이션

0.3 개발 환경 준비

제0부 오리엔테이션 마무리 · 실전 준비. 이 책의 실습을 돌릴 두 작업대(Python 제어 스택 · ROS2 Humble)를 설치한다. 이론(제1~6부)은 Python만으로 충분하고, 로봇 실전(제7부)에서 ROS2가 필요하다.

⚠️ 정직 경고 — 먼저 읽을 것. 설치 명령·패키지·키·URL은 시간이 지나면 바뀐다. 이 장의 명령은 ROS2 Humble 공식 문서를 따랐지만, 저자가 여러분의 Ubuntu 22.04 환경에서 직접 검증한 것이 아니다. 항상 공식 설치 페이지가 최종 권위다 — ROS2: https://docs.ros.org/en/humble/Installation.html. 책 명령이 공식 문서와 다르면 공식 문서를 따르라. 각 명령 블록은 그대로 복사해 붙여 넣지 말고 "왜 이것을 하는지"를 이해하고 실행하기를 권한다.

이 장을 마치면 Python 제어 스택과 ROS2 Humble 환경을 갖추고, 두 작업대(이론용·실전용)를 분리해 이해하며, 설치에서 막히는 흔한 함정을 피할 수 있어야 한다.

0.3.1 무엇을·왜 설치할까 — 두 개의 작업대

이 책은 같은 개념을 두 곳에서 실행한다.

작업대 ①: Python 제어 스택 numpy·scipy· matplotlib·sympy· control → 이론·설계· 시뮬레이션 (제1~6부) → OS 무관 (Win· Mac·Linux) 작업대 ②: ROS2 Humble + Gazebo 로봇 노드· 시뮬레이션·실물 연결 (ros-humble-desktop) → 실전 프로젝트 (제7부) → Ubuntu 22.04 필요
  • 이론만 빠르게 보고 싶다면 작업대 ①만 설치하고 제1~6부를 따라가도 된다(OS 무관). ROS2는 제7부에 가서 설치해도 늦지 않다.
  • 로봇 실전까지 갈 것이면 작업대 ②가 필요하고, 이것은 Ubuntu 22.04를 (네이티브·WSL2·Docker·VM 중 하나로) 요구한다 — 이유는 다음 절.

0.3.2 전제와 버전 — 함정부터 본다

0.3.2.1 함정 ① ROS2 배포판은 Ubuntu LTS와 1:1로 묶인다

ROS2는 "아무 우분투에나" 설치되지 않는다. 각 배포판(distro)이 특정 Ubuntu LTS에 고정된다. 이것을 모르고 최신 우분투에 Humble을 설치하려다 막히는 일이 흔하다.

ROS2 배포판묶인 Ubuntu비고
Humble Hawksbill22.04 (Jammy)LTS, 지원 ~2027. 이 책의 기준.
Iron Irwini22.04 (Jammy)비-LTS, 단기 지원
Jazzy Jalisco24.04 (Noble)LTS, 더 최신

실증 함정: 이 책을 집필한 작업 머신은 Ubuntu 24.04(Noble)였는데, 24.04는 Humble이 아니라 Jazzy에 묶인다. 즉 24.04에서는 apt install ros-humble-desktop이 정상 경로로는 안 된다. Humble을 쓰려면 22.04여야 한다 — 이 책이 22.04를 전제하는 이유다. (24.04를 이미 쓴다면: 22.04로 듀얼부팅/VM/Docker를 쓰거나, ROS2 Jazzy로 전환하되 이 책 제7부의 일부 패키지명이 달라질 수 있음을 감안하라 — 검증 필요.)

0.3.2.2 왜 Humble인가

  • LTS(장기 지원, ~2027)라 자료·튜토리얼·서드파티 패키지가 가장 풍부하다.
  • TurtleBot·Nav2·ros2_control 등 이 책이 의존하는 생태계가 잘 갖춰져 있다.
  • 더 최신(Jazzy)도 좋지만 입문 자료의 양에서 Humble이 아직 유리하다(2026 기준 — 시간이 지나면 역전될 수 있음).

0.3.2.3 Python 버전

  • Ubuntu 22.04의 시스템 Python은 3.10이고 ROS2 Humble은 이 시스템 Python을 쓴다. ROS2용 Python을 따로 venv로 바꾸지 마라(노드가 동작하지 않는다).
  • 반대로 작업대 ①(순수 이론 시뮬레이션)은 venv로 격리하는 편이 안전하다(다음 절). 둘을 분리해 생각하면 충돌이 적다.

0.3.3 어디에 설치할까 — 네 가지 길 (트레이드오프)

정답은 없다. 상황에 맞춰 고르라. (강요하지 않는다 — 장단을 펼친다.)

방식장점단점누구에게
① 네이티브 22.04성능 최고, 실물 로봇·USB·실시간 연결이 가장 매끄러움듀얼부팅/전용 PC 필요본격 로보틱스, 실물 연결
② WSL2 (Windows)윈도우 그대로 쓰며 Linux, WSLg로 GUI그래픽·실시간·USB 패스스루에 제약윈도우 주력 학습자
③ Docker (ros:humble)재현성·격리 최고, 간결GUI(Gazebo·rviz)·디바이스 설정 손이 감재현성 중시, CI
④ VM (VirtualBox 등)격리 가장 안전, OS 무관그래픽 가속 약함 → Gazebo 부하 큼간단한 체험용
  • 이론만(제1~6부): 위 넷 다 필요 없다. 작업대 ① Python 스택만 아무 OS에나 설치하면 된다.
  • 권장 출발점(견해): 가능하면 ① 네이티브 22.04가 가장 덜 막힌다. 윈도우를 못 떠나면 ② WSL2. 둘 다 어려우면 ④ VM으로 우선 체험하고 결정. — 근거: Gazebo·rviz 같은 GUI·3D가 많아 그래픽 가속이 중요하기 때문.

0.3.4 작업대 ① — Python 제어 스택 (OS 무관)

이론·설계·시뮬레이션용. 제1~6부 내내 쓴다. venv로 격리하기를 권한다(시스템 Python 오염 방지, 최신 우분투의 "externally-managed-environment" 차단 회피).

# (Ubuntu 계열) venv·pip 준비
sudo apt install python3-venv python3-pip

# 제어 학습 전용 가상환경 생성·활성화
python3 -m venv ~/ctrl-venv
source ~/ctrl-venv/bin/activate          # 활성화되면 프롬프트에 (ctrl-venv) 표시

# 핵심 스택 설치
pip install --upgrade pip
pip install numpy scipy matplotlib sympy control
  • control = python-control. MATLAB Control Toolbox와 유사한 API(전달함수·상태공간·step·bode·근궤적·LQR 등). 이 책 시뮬레이션의 주력.
  • sympy = 기호 계산(라플라스 변환·부분분수를 손 대신).

0.3.4.1 함정 — slycot

python-control의 일부 고급 함수(일부 MIMO·극배치 변형 등)는 slycot(Fortran 기반)을 추가로 요구한다. pip 설치가 컴파일러·BLAS를 찾지 못해 실패하기 쉽다.

# 방법 A: 빌드 의존성 설치하고 pip
sudo apt install gfortran cmake libopenblas-dev liblapack-dev
pip install slycot

# 방법 B(권장, 더 안정): conda 사용
# conda install -c conda-forge control slycot

slycot이 없어도 이 책의 대부분 예제는 실행된다. 특정 함수가 "slycot이 필요하다"고 에러를 내면 그때 설치하면 된다 — 미리 설치할 필요 없다.

0.3.4.2 설치 확인 + 첫 payoff

python3 -c "import numpy, scipy, matplotlib, sympy, control; print('control', control.__version__)"

버전이 출력되면 성공. 곧장 0.2에서 본 전달함수를 그려 보자(작은 보상):

# step_demo.py — 1차 시스템 1/(s+1)의 계단응답
import control as ct
import matplotlib.pyplot as plt

G = ct.tf([1], [1, 1])           # 분자 [1], 분모 [1, 1] → 1/(s+1)
t, y = ct.step_response(G)
plt.plot(t, y); plt.grid(True)
plt.xlabel("t [s]"); plt.ylabel("y(t)"); plt.title("1/(s+1) step")
plt.show()

지수적으로 1에 다가가는 곡선이 보이면 작업대 ① 완성 — 이것이 1.3에서 배울 1차 시스템 응답이다. (코드 동작·그래프 모양은 여러분 환경에서 재현해 확인 — 검증 필요.)

0.3.5 작업대 ② — ROS2 Humble 설치 (Ubuntu 22.04)

⚠️ 아래는 공식 문서의 표준 절차를 요약한 것이다. 저자 미검증 — 반드시 docs.ros.org/en/humble/Installation.html의 현재 명령과 대조하라(특히 저장소 등록 단계는 자주 바뀐다).

0.3.5.1 1) 로케일 (UTF-8)

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

0.3.5.2 2) 저장소 등록 — 가장 잘 바뀌는 단계

전통적(수동 키) 방식:

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
  -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
  http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \
  sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

⚠️ ROS는 이 단계를 ros2-apt-source .deb 패키지로 자동화하는 방식으로 옮겨 가고 있다. 즉 위 수동 명령이 공식 페이지의 현재 안내와 다를 수 있다. 막히거나 키 오류가 나면 즉시 공식 설치 페이지의 최신 명령을 그대로 쓰라. — 이 부분은 책이 보증하지 못하는 대표적 지점이다.

0.3.5.3 3) 설치

sudo apt update && sudo apt upgrade
sudo apt install ros-humble-desktop      # GUI 포함 풀 데스크톱(rviz·데모 등)
sudo apt install ros-dev-tools           # colcon·rosdep 등 개발 도구

ros-humble-desktop 대신 경량 ros-humble-ros-base도 있지만, 학습에는 데스크톱 권장(rviz·turtlesim·데모 포함).

0.3.5.4 4) 환경 소싱 (매 셸마다 필요)

ROS2 명령은 셸마다 setup.bash를 source 해야 인식된다. 매번 입력하지 않으려면 .bashrc에 넣는다.

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc                          # 지금 셸에도 즉시 적용

가장 흔한 초보 에러: ros2: command not found → 대부분 source를 안 한 것이다. 새 터미널을 열 때마다 underlay(/opt/ros/humble)가 소싱됐는지 의심하라.

0.3.5.5 5) 설치 확인 — talker/listener

터미널 두 개를 연다(각자 source된 상태).

# 터미널 1
ros2 run demo_nodes_cpp talker
# 터미널 2
ros2 run demo_nodes_py listener

talker가 "Publishing: 'Hello World: N'"을, listener가 "I heard: ..."를 주고받으면 ROS2 통신이 살아 있는 것이다. (✅ 검증됨 — ros:humble 컨테이너에서 headless로 이 talker/listener 통신을 실행해 확인함(verify/test_ros2.sh, PASS). 그래도 여러분 환경에서 재현해 보는 습관은 권장한다.)

0.3.6 turtlesim — 책의 첫 플랜트 만나기

turtlesim은 2D 거북이 시뮬레이터로, ROS2 입문의 대표 사례이자 제7부 첫 실습(7.2)의 플랜트다.

sudo apt install ros-humble-turtlesim
ros2 run turtlesim turtlesim_node          # 거북이 창이 열린다
# 다른 터미널에서:
ros2 run turtlesim turtle_teleop_key       # 방향키로 조종

방향키로 거북이가 움직이면, 여러분은 방금 cmd_vel(입력 u)을 주고 위치(출력 y)를 본 것이다 — 0.1.4.2 의사코드의 ROS2 구현이다. 제7부에서 이 수동 조종을 자동 폐루프 제어로 바꾼다.

(거북이 창·조종은 GUI라 headless 컨테이너로는 화면을 확인할 수 없다 — 노드 기동·통신 자체는 검증 범위이지만 이 시각적 동작은 여러분 환경에서 확인, 검증 필요.)

0.3.7 Gazebo 설치 — 이름 함정에 주의

⚠️ 함정 ②: "Gazebo"는 사실상 두 개의 다른 소프트웨어를 가리킨다.

  • Gazebo Classic 11 — 오래된 안정판. 패키지명 gazebo, ROS2 연동은 ros-humble-gazebo-ros-pkgs. 입문 자료·TurtleBot 튜토리얼 다수가 이것을 쓴다.
  • 새 Gazebo (구 Ignition, 예: Fortress/Garden) — 후속작. ROS2 연동은 ros-humble-ros-gz. 생태계가 이쪽으로 이동 중.

이름이 겹쳐 튜토리얼을 섞어 따라 하면 실패한다. 이 책은 입문 친화성·자료량을 이유로 Gazebo Classic 11을 기준으로 한다(견해 — 새 Gazebo가 익숙하면 그쪽으로 가도 좋다).

# Gazebo Classic 11 + ROS2 연동
sudo apt install ros-humble-gazebo-ros-pkgs
gazebo --version          # 11.x 가 보이면 Classic
gazebo                    # 빈 월드가 표시되면 성공 (그래픽 가속 필요 — VM은 부하가 클 수 있음)

(gazebo 실행 화면도 GUI라 headless 컨테이너로는 확인할 수 없다 — 여러분 환경에서 확인, 검증 필요.)

정직: Gazebo Classic 11은 수명 후반부다(장기적으로 새 Gazebo 권장). 그래도 Humble + 입문 조합에서는 자료와 호환 패키지가 가장 두꺼워 이 책은 Classic으로 간다. 제7부에서 새 Gazebo로 옮기는 방법도 다룬다(검증 필요).

0.3.8 colcon 워크스페이스 — 책 예제를 둘 곳

ROS2 패키지는 colcon 워크스페이스에서 빌드한다. 책의 모든 ROS2 예제를 여기 모은다.

# 워크스페이스 골격
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build                              # src가 비어도 빌드 구조 생성
source install/setup.bash                 # 이 워크스페이스(overlay) 소싱
  • underlay vs overlay: /opt/ros/humble(시스템, underlay) 위에 ~/ros2_ws/install(내 패키지, overlay)을 적용한다. 새 셸에서는 underlay → overlay 순서로 소싱한다(.bashrc에 두 줄).
  • rosdep으로 패키지 의존성을 자동 설치:
sudo rosdep init        # 최초 1회 (이미 돼 있으면 에러 무시)
rosdep update
# 패키지를 받은 뒤: 의존성 일괄 설치
rosdep install --from-paths src --ignore-src -r -y

빈 예제 패키지를 하나 만들어 빌드까지 확인해 보자:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python ce_examples   # 책 예제용 패키지(이름 예시)
cd ~/ros2_ws
colcon build --packages-select ce_examples
source install/setup.bash

에러 없이 빌드되면 작업대 ② 준비 끝. (전 과정 여러분 환경에서 확인 — 검증 필요.)

0.3.9 동작 점검 체크리스트 + 자주 막히는 곳

설치가 끝났다면 아래가 전부 통과해야 한다.

  • [ ] python3 -c "import control; print(control.__version__)" → 버전 출력 (작업대 ①)
  • [ ] step_demo.py 그래프가 표시된다 (작업대 ①)
  • [ ] talker/listener가 메시지를 주고받는다 (ROS2 통신)
  • [ ] turtlesim 거북이를 방향키로 움직인다
  • [ ] gazebo 빈 월드가 표시된다
  • [ ] ~/ros2_ws에서 colcon build가 성공한다

자주 막히는 곳(상세 해법은 부록 A.4):

증상가장 흔한 원인
ros2: command not foundsetup.bash source 안 함 (0.3.5.4)
apt가 ros-humble-*를 못 찾음22.04가 아님(배포판 불일치, 0.3.2.1) 또는 저장소 미등록
pip install이 externally-managed로 거부venv 밖에서 설치 시도 → venv 활성화(0.3.4)
Gazebo가 검은 화면/느림그래픽 가속 부족(VM·원격)
slycot 빌드 실패gfortran·BLAS 미설치(0.3.4.1)
colcon이 패키지를 못 봄overlay 미소싱 또는 src 위치 오류

0.3.10 정리 — 그리고 제1부로

  • 작업대 ①(Python 제어 스택)은 OS 무관, 제1~6부 이론·시뮬레이션용. ②(ROS2 Humble + Gazebo)는 Ubuntu 22.04 위에서 제7부 실전용.
  • 최대 함정 둘: 배포판↔Ubuntu LTS 1:1(Humble=22.04), Gazebo Classic vs 새 Gazebo 이름 충돌.
  • 설치 명령은 시간에 민감하다 — 막히면 공식 문서가 최종 권위다. 이 책의 명령은 저자 미검증이며 "여러분 환경에서 확인"이 전제다.

이로써 제0부 오리엔테이션이 끝났다. 다음 1.1부터 제1부에서 실제 플랜트(질량-스프링-댐퍼·DC모터 등)를 수식으로 모델링하며, 0.2의 라플라스·전달함수를 본격적으로 활용한다. 직접 해 보고 싶다면 작업대 ①을 켜 두고 따라오라.

0.3.11 연습·생각해 볼 것

  1. 내 길 고르기. 0.3.3의 네 방식(네이티브·WSL2·Docker·VM) 중 지금 내 PC에 맞는 것을 하나 고르고, 그 장단을 내 상황(OS·실물 로봇 유무·성능)에 비추어 두 문장으로 정당화하라.
  2. 함정 재현. 왜 Ubuntu 24.04에 ros-humble-desktop이 정상 경로로 설치되지 않는지, 0.3.2.1을 근거로 설명하라. 24.04 사용자가 Humble을 쓰는 선택지 둘을 제시하라.
  3. source의 의미. 새 터미널에서 ros2 run ...이 command not found가 났다. 가장 가능성 큰 원인과 한 줄 해결책은? (0.3.5.4)
  4. 두 Python 분리. 이 책은 "ROS2용 Python은 시스템 그대로, 이론 시뮬레이션용은 venv"를 권한다. 왜 ROS2용까지 venv로 바꾸면 위험한가? (0.3.2.3)
  5. (손으로) 작업대 ①만이라도 설치하고 step_demo.py(0.3.4.2)를 실행해 곡선을 직접 보라. 그 곡선이 "1에 다가가는 속도"는 무엇이 정할지 추측해 보라 — 답은 1.3에서.
  6. (손으로) turtlesim을 실행해 방향키로 거북이를 움직이며, 0.1.4.2의 ①측정·②오차·③제어기·④구동 중 지금 사람이 대신 하고 있는 역할이 무엇인지 파악하라. 제7부에서 이 역할을 코드로 넘긴다.

설치에서 막히는 것은 드문 일이 아니라 정상이다. 에러 메시지를 그대로 검색하고, 부록 A.4와 공식 문서를 오가며 풀어라 — 이 과정 자체가 로보틱스 실무의 절반이다.