사이버물리시스템
고친 사람 github-actions[bot]
사이버물리시스템은 컴퓨터가 물리 세계를 재고 계산한 뒤 그 결과로 다시 물리 세계를 움직이게 합니다. 자동차의 정속 주행 장치나 급제동 때 바퀴가 잠기지 않게 하는 브레이크가 그런 예입니다. 이 일을 쉬지 않고 되풀이합니다. 계산하는 쪽과 움직이는 쪽이 한 고리로 묶여 있어서 둘을 따로 떼어 설계할 수 없습니다. 계산이 맞아도 늦게 끝나면 틀린 답이 됩니다.
쉽고 빠른 이해
무슨 일을 하나 — 기계가 스스로 상태를 재고 스스로 바로잡습니다. 자동차의 정속 주행 장치는 속도를 잽니다. 목표 속도와 얼마나 다른지 계산해 가속을 조절합니다. 이 일을 1초에도 여러 번 되풀이합니다.
왜 이렇게 하나 — 사람이 보고 손으로 고치면 반응이 늦고 들쭉날쭉합니다. 바퀴가 미끄러지는 순간처럼 눈 깜짝할 새 바로잡아야 하는 일은 사람 손으로는 못 따라갑니다.
언제 안 쓰나 — 사람이 보고 고쳐도 충분히 빠른 일에는 필요 없습니다. 값을 재서 모으기만 하고 아무것도 움직이지 않는 일도 여기에 들지 않습니다.
어떻게 도나
- 센서가 물리 세계의 상태를 잽니다
- 컴퓨터가 목표와 지금 상태의 차이를 계산합니다
- 모터나 밸브 같은 구동 장치가 그 계산대로 기계를 움직입니다
- 움직인 결과를 다시 재서 1로 돌아갑니다
대가 — 시간을 못 지키면 계산이 맞아도 실패입니다. 소프트웨어 버그 하나가 데이터가 아니라 기계와 사람을 다치게 합니다. 일어날 수 있는 물리 상황을 다 시험해 볼 수 없어서 검증이 어렵습니다.
상세
샤워기 물 온도를 맞출 때 사람은 손으로 물을 만져 봅니다. 차가우면 손잡이를 뜨거운 쪽으로 돌립니다. 그리고 다시 만져 봅니다. 손잡이를 돌린 효과가 늦게 와서 너무 많이 돌리면 뜨거웠다 차가웠다를 오갑니다.
CPS(Cyber-Physical System, 사이버물리시스템)는 이 「재고, 판단하고, 고치고, 다시 재는」 고리를 컴퓨터가 도는 시스템입니다. 이름의 「사이버」는 계산과 통신을 맡는 컴퓨터 쪽을 가리킵니다. 「물리」는 바퀴·모터· 공기·전류처럼 물리 법칙대로 움직이는 쪽을 가리킵니다.
자동차의 ABS(Anti-lock Braking System, 잠김 방지 브레이크)가 한 예입니다. 급히 브레이크를 밟으면 바퀴가 멈춰서 노면 위를 미끄러질 수 있습니다. ABS 는 바퀴 회전을 재다가 바퀴가 잠기려 하면 브레이크 압력을 잠깐 풀었다가 다시 겁니다. 이 일을 1초에 여러 번 되풀이합니다. 사람 발로는 이만큼 빨리 밟았다 뗐다 할 수 없어서 컴퓨터가 맡습니다.
고리를 이루는 부품
고리는 네 요소로 이루어집니다. 재는 부품, 계산하는 부품, 움직이는 부품, 그리고 움직여지는 물리 대상입니다.
재는 부품은 센서입니다. 센서는 속도·온도·위치·압력 같은 물리량을 전기 신호로 바꿉니다. 컴퓨터는 전기 신호만 읽을 수 있어서 물리 세계를 알려면 센서를 거쳐야 합니다.
움직이는 부품은 액추에이터(구동 장치)입니다. 센서와 반대로 전기 신호를 받아 물리적인 힘으로 바꿉니다. 모터를 돌리거나 밸브를 열거나 브레이크를 누르는 부품이 액추에이터입니다.
계산하는 부품은 제어기입니다. 센서가 읽은 값을 받아 액추에이터에 무엇을 시킬지 정합니다. 제어기는 대개 기계 안에 붙박이로 들어간 작은 컴퓨터입니다. 이렇게 기계 안에서 정해진 일 하나만 하는 컴퓨터를 임베디드 시스템이라고 부릅니다.
움직여지는 물리 대상은 제어 대상이라고 부릅니다. ABS 에서는 바퀴와 브레이크, 에어컨에서는 방 안 공기가 제어 대상입니다. 제어를 다루는 분야에서는 같은 것을 플랜트라고도 부릅니다.
flowchart TD
T["목표값"] --> C["제어기"]
C -->|명령| A["액추에이터"]
A -->|힘| P["제어 대상"]
P -->|물리량| S["센서"]
S -->|잰 값| C
그림은 네 요소가 한 바퀴 도는 길입니다. 액추에이터가 제어 대상을 움직이면 그 결과를 센서가 다시 재서 제어기로 돌려보냅니다.
맨 위의 목표값은 고리 밖에서 들어오는 입력입니다. 사람이나 상위 시스템이 정해 제어기에 넘깁니다. 제어기는 이 목표값과 센서가 잰 값을 함께 받아 다음 명령을 정합니다.
결과를 다시 재는 피드백
움직인 결과를 다시 재서 다음 계산에 넣는 것을 피드백 제어(되먹임 제어)라고 합니다. 고리가 고리인 까닭이 이 피드백입니다.
피드백이 필요한 까닭은 세상이 계산대로 굴러가지 않기 때문입니다. 정속 주행 중인 차가 오르막을 만나면 같은 힘으로 밟아도 속도가 떨어집니다. 오르막이 언제 나올지 미리 다 알 수는 없습니다. 대신 속도를 계속 재면 떨어지는 순간 알아채고 더 밟을 수 있습니다.
제어기가 계산하는 기본 값은 오차입니다. 오차는 목표값에서 지금 잰 값을 뺀 것입니다. 제어기는 이 오차가 줄어드는 쪽으로 액추에이터를 움직입니다.
가장 단순한 방법은 오차에 정해진 수를 곱해 그만큼 고치는 것입니다. 아래는 정속 주행 장치가 두 주기 동안
하는 계산을 파이썬으로 적은 것입니다. push 는 가속 페달을 더 밟는 양입니다.
target = 100 # 목표 속도 km/h
gain = 0.4 # 오차에 곱하는 수
speed = 95 # 첫 주기에 잰 속도
error = target - speed # 5
push = gain * error # 2.0
speed = 98 # 다음 주기에 잰 속도
error = target - speed # 2
push = gain * error # 0.8
첫 주기에는 오차가 5라서 페달을 2.0만큼 더 밟습니다. 그 결과 속도가 98로 오르자 다음 주기의 오차는 2로 줄고 밟는 양도 0.8로 줄어듭니다. 목표에 가까워질수록 손을 덜 대는 셈입니다.
오차에 곱하는 수를 이득(gain)이라고 부릅니다. 이득이 크면 목표를 빨리 따라가지만 지나쳐서 출렁이기 쉽습니다. 샤워기 손잡이를 너무 많이 돌린 것과 같은 꼴입니다. 이득이 작으면 출렁이지 않는 대신 목표에 천천히 다가갑니다.
실무에서는 오차 하나만 보지 않고 세 가지를 함께 보는 방식을 많이 씁니다. 이 방식을 PID(Proportional-Integral-Derivative, 비례-적분-미분) 제어라고 부릅니다. 세 글자가 각각 무엇을 보는지 짝지으면 아래와 같습니다.
| 글자 | 보는 것 |
|---|---|
| P 비례 | 지금 오차의 크기 — 위 코드가 한 일 |
| I 적분 | 오차가 그동안 쌓인 양 |
| D 미분 | 오차가 변하는 빠르기 |
시간이 정답의 일부다
백엔드 서버에서 응답이 늦으면 사용자가 기다릴 뿐입니다. 기다린 끝에 받은 결과는 여전히 맞습니다. 사이버물리시스템에서는 늦은 답이 틀린 답입니다. 브레이크 압력을 풀라는 명령이 늦게 닿으면 바퀴는 이미 잠겨 미끄러진 뒤입니다.
그래서 고리는 정해진 간격으로 돕니다. 이 간격이 제어 주기입니다. 앞의 정속 주행 코드에서 「첫 주기」와 「다음 주기」 사이가 이 간격 한 칸입니다.
제어기는 한 주기 안에 값을 읽고, 계산하고, 명령을 내보내는 일을 다 끝내야 합니다. 이 시한을 마감 시간이라고 부릅니다. 가장 단순하게는 마감 시간을 주기 끝, 곧 다음 주기가 시작하는 때로 잡습니다. 주기보다 짧게 잡는 시스템도 있습니다.
간격이 고르지 않아도 문제가 됩니다. 앞의 코드는 주기마다 같은 이득 0.4 를 곱했습니다. 이 값은 간격이 늘 같다고 보고 고른 것입니다.
어떤 주기가 늦게 돌아 간격이 두 배로 늘면, 그동안 제어기는 속도가 어떻게 변했는지 모릅니다. 앞 주기의 명령을 두 배 오래 붙든 채 오르막을 만나도 알아채지 못합니다. 이렇게 간격이 들쭉날쭉한 정도가 지터입니다. 지터가 크면 고르게 읽을 때 알맞던 이득이 어떤 때는 세고 어떤 때는 약하게 들어 제어가 흔들립니다.
이 시간을 지키려고 제어기에는 실시간 운영체제를 올리는 경우가 많습니다. 실시간 운영체제는 맡은 일을 정해진 시간 안에 끝내도록 보장하는 데 맞춰 만든 운영체제입니다. 평균 응답 시간보다 가장 늦을 때의 시간을 더 중요하게 다룹니다.
마감을 놓쳤을 때 무슨 일이 생기는지는 시스템마다 다릅니다.
| 갈래 | 마감을 한 번 놓치면 | 예 |
|---|---|---|
| 경성 실시간 | 그 자체로 실패다 | 에어백 · 브레이크 |
| 연성 실시간 | 품질이 떨어질 뿐 계속 돈다 | 영상 재생 · 음성 통화 |
브레이크·에어백처럼 기계를 직접 움직이는 고리는 대개 경성 쪽입니다. 사람을 태운 기계일수록 그렇습니다.
연속인 물리와 띄엄띄엄 읽는 컴퓨터
물리 세계는 멈추지 않고 연속으로 변합니다. 차의 속도는 95에서 98로 건너뛰지 않고 그 사이 모든 값을 지나갑니다. 컴퓨터는 그렇게 읽을 수 없습니다. 제어 주기마다 한 번씩, 띄엄띄엄 값을 읽습니다.
이렇게 일정한 간격으로 값을 한 번씩 읽는 일을 샘플링이라고 부릅니다. 읽는 간격은 대개 제어 주기와 같습니다. 정속 주행 코드가 주기마다 속도를 한 번 읽은 것이 곧 샘플링입니다.
센서가 내는 것은 대개 연속으로 변하는 전압입니다. 컴퓨터가 계산하려면 이 전압을 숫자로 바꿔야 합니다. 이 단계가 아날로그-디지털 변환입니다.
너무 띄엄띄엄 읽으면 그 사이에 일어난 변화를 놓칩니다. 그래서 빨리 변하는 대상일수록 짧은 주기로 읽어야 합니다. 방 온도는 몇 초에 한 번 읽어도 되지만 회전하는 모터는 그보다 훨씬 자주 읽어야 합니다.
이 차이가 설계를 어렵게 만듭니다. 정속 주행 코드는 주기마다 한 번 계산하고 다음 주기까지 쉽니다. 그런데 차의 속도는 그 사이에도 오르막과 바람을 받아 계속 변합니다.
그래서 코드만 따로 시험해서는 고리가 잘 돌지 알 수 없습니다. 주기 사이에 차가 어떻게 움직이는지까지 함께 따져야 이득과 주기를 고를 수 있습니다. 계산하는 쪽과 움직이는 쪽을 따로 떼어 설계할 수 없는 까닭이 이것입니다.
백엔드 서버와 다른 점
백엔드 개발자에게 익숙한 습관 가운데 몇 가지는 이 세계에서 통하지 않습니다. 같은 질문을 두 세계에 던져 보면 차이가 보입니다.
| 질문 | 백엔드 서버 | 사이버물리시스템 |
|---|---|---|
| 응답이 늦으면 | 기다리게 한다 | 틀린 답이 된다 |
| 실패하면 | 요청 하나가 [[오류 | 에러]]로 끝난다 |
| 되돌릴 수 있나 | 트랜잭션을 롤백한다 | 이미 움직인 기계는 못 되돌린다 |
| 재시도하면 | 나중에 다시 보내면 된다 | 늦은 명령은 상황에 안 맞는다 |
| 입력은 | 사용자가 보낸 요청 | 쉬지 않고 들어오는 센서 값 |
표의 셋째 줄이 가장 크게 다릅니다. 데이터베이스는 실패한 작업을 롤백해 없던 일로 만들 수 있습니다. 물리 세계에는 그런 단추가 없습니다. 그래서 명령을 내보내기 전에 그 명령이 안전한지부터 따집니다.
재시도도 같은 이유로 조심스럽습니다. 백엔드에서는 멱등성을 갖춰 두면 같은 요청을 다시 보내도 안전합니다. 제어 고리에서는 0.1초 전 상황에 맞춘 명령을 지금 다시 보내면 지금 상황에는 틀린 명령이 될 수 있습니다.
사물인터넷 · 임베디드와 가르는 선
세 낱말은 자주 같이 나와서 헷갈립니다. 무엇을 중심에 두는지로 가르면 쉽습니다.
임베디드는 부품을 말합니다. 기계 안에 들어간 컴퓨터 하나입니다. 사이버물리시스템은 그 컴퓨터가 센서· 액추에이터·제어 대상과 함께 이루는 고리 전체를 말합니다. 음악 재생기는 임베디드 컴퓨터를 품고 있지만 물리 대상을 재서 움직이는 고리가 없으니 사이버물리시스템이라고 부르지 않습니다.
사물인터넷은 연결을 중심에 둡니다. 물건이 네트워크로 데이터를 보내고 받는 것이 핵심입니다.
창고 온도계가 값을 서버로 보냅니다. 서버가 그 값으로 화면에 그래프만 그린다면 사물인터넷이지만 고리는 없습니다. 사람이 그래프를 보고 판단하면 거기서 끝나기 때문입니다.
이번에는 서버가 그 값을 보고 냉각기를 켭니다. 켠 결과를 다시 재면 고리가 생깁니다. 이때는 사물인터넷이면서 사이버물리시스템입니다. 두 낱말은 이렇게 겹칠 수 있습니다. 겹치는 쪽이 오히려 흔합니다.
쓰는 곳
물리 대상을 빠르게, 쉬지 않고 바로잡아야 하는 곳이면 사이버물리시스템이 들어갑니다. 분야마다 재는 것과 움직이는 것이 다를 뿐 고리의 모양은 같습니다.
| 분야 | 재는 것 | 움직이는 것 |
|---|---|---|
| 자동차 | 바퀴 회전 · 차 속도 | 브레이크 · 엔진 출력 |
| 공장 | 로봇 팔의 위치 | 관절 모터 |
| 전력망 | 전기 수요 · 주파수 | 발전량 |
| 건물 | 실내 온도 · 습도 | 냉난방 장치 |
| 의료 | 환자의 혈당 | 인슐린 펌프 |
| 항공 | 기체의 자세 | 날개의 조종면 |
반대로 사람이 보고 판단해도 충분히 빠른 곳에는 필요 없습니다. 하루에 한 번 수치를 보고 밸브를 손으로 돌려도 되는 설비라면 사람 대신 컴퓨터가 고리를 돌게 하는 비용과 위험이 얻는 것보다 큽니다. 값을 모아 보기만 하고 무엇을 움직이지 않는 시스템도 사이버물리시스템이 아니라 데이터 수집입니다.
어려운 점
고리가 물리 세계에 닿아 있다는 것이 이 시스템의 쓸모이면서 가장 큰 짐입니다. 어려움은 셋으로 나뉩니다.
첫째는 안전입니다. 웹 서비스의 버그는 화면을 깨뜨리지만 제어 소프트웨어의 버그는 차를 세우지 못하게 합니다. 그래서 자동차·항공·의료 쪽에서는 소프트웨어를 어떻게 만들고 시험할지를 정한 기능 안전 규격을 따릅니다.
둘째는 검증입니다. 일어날 수 있는 물리 상황을 다 실물로 시험할 수 없습니다. 빙판길 급제동을 수천 번 되풀이해 볼 수는 없습니다. 그래서 컴퓨터 안에서 제어 대상을 흉내 내는 시뮬레이션으로 먼저 시험하고, 수학으로 성질을 증명하는 형식 검증을 쓰기도 합니다.
셋째는 보안입니다. 이 시스템이 뚫리면 데이터가 새는 데서 끝나지 않습니다. 공격자가 밸브를 열고 모터를 지나치게 돌려 설비를 부술 수 있습니다. 공장과 발전소의 제어망이 인터넷에 이어질수록 이 위험이 커집니다.
관련 항목
사이버물리시스템의 고리를 이루는 부품
센서 · 액추에이터 · 제어기 · 플랜트 · 마이크로컨트롤러 · 임베디드 · 펌웨어
고리를 돌리는 제어 방식
피드백 제어 · PID 제어 · 제어 이론 · 개루프 제어 · 피드포워드 제어 · 모델 예측 제어
고리의 시간을 지키는 수단
실시간 운영체제 · 실시간 시스템 · 경성 실시간 · 연성 실시간 · 마감 시간 · 지터 · 지연 · 인터럽트 · 시계 동기화 · 최악 실행 시간
연속 신호를 숫자로 바꾸는 단계
아날로그-디지털 변환 · 디지털-아날로그 변환 · 샘플링 주기 · 나이퀴스트 주파수 · 이산화
사이버물리시스템과 범위가 겹치는 개념
사물인터넷 · 산업용 사물인터넷 · 디지털 트윈 · 엣지 컴퓨팅 · 운영 기술 · 산업 제어 시스템
사이버물리시스템이 쓰이는 분야
자율 주행 · 잠김 방지 브레이크 · 스마트 그리드 · 스마트 팩토리 · 로봇 · 의료 기기 · 비행 제어 시스템
사이버물리시스템을 검증하고 지키는 수단
기능 안전 · 시뮬레이션 · 형식 검증 · 모델 기반 설계 · 하드웨어 인 더 루프 · SCADA · 스턱스넷
다른 이름: CPS · cyber-physical system · cyber-physical systems · 사이버 물리 시스템 · 가상물리시스템