로봇은 세상을 직접 보지 못한다
지금까지 우리는 로봇의 위치를 숫자로 표현하고, 속도로 위치를 업데이트하고, 경로를 따라 움직이게 만들었다. 시뮬레이션 안에서 로봇은 꽤 똑똑해 보였다. 목표점이 어디 있는지 알고, 자신이 어디 있는지도 알고, 어느 방향으로 가야 하는지도 계산할 수 있었다.
하지만 현실의 로봇에게는 큰 문제가 하나 있다. 로봇은 세상을 직접 알 수 없다.
로봇은 자기 위치를 눈으로 확인하지 않는다. 대신 엔코더, IMU, 카메라, LiDAR, 거리 센서, GPS 같은 장치가 보내는 숫자를 읽는다. 그 숫자를 보고 세상을 추측한다. 즉, 로봇이 알고 있다고 생각하는 세계는 센서가 전달한 세계다.
그런데 센서는 항상 조금씩 틀린다. 같은 벽까지의 거리를 여러 번 재도 값이 흔들리고, 바퀴가 회전한 거리를 재도 실제 이동 거리와 조금 다르며, IMU가 알려 주는 각속도는 시간이 지날수록 자세 추정에 오차를 쌓는다. 그래서 로봇공학에서는 센서값을 절대적인 진실로 보지 않는다. 센서값은 진실을 향한 힌트다.
이번 장에서는 센서 오차를 네 가지 관점으로 나누어 살펴본다. 노이즈, 편향, 드리프트, 불확실성이다. 이 네 단어를 제대로 이해하면 다음 장에서 배울 확률분포, 베이즈 추정, 칼만 필터가 훨씬 자연스럽게 느껴진다.

센서값은 진짜 값이 아니라 측정값이다
먼저 가장 중요한 구분부터 하자. 진짜 값과 측정값은 다르다.
로봇 앞에 벽이 있고, 실제 거리가 정확히 5.0m라고 해 보자. 현실에서 이 실제 거리를 완벽히 아는 경우는 거의 없다. 우리는 거리 센서가 알려 주는 값을 읽을 뿐이다.
true_distance = 5.0
measured_distance = 5.07여기서 true_distance는 실제 세계의 값이고, measured_distance는 센서가 보고한 값이다. 시뮬레이션에서는 우리가 진짜 값을 알고 있기 때문에 둘을 비교할 수 있다. 하지만 실제 로봇에서는 대부분 진짜 값을 모른다. 로봇은 측정값만 가지고 움직여야 한다.
센서 측정을 단순하게 쓰면 다음처럼 표현할 수 있다.
측정값 = 진짜 값 + 오차조금 더 현실적으로는 이렇게 볼 수 있다.
측정값 = 진짜 값 + 노이즈 + 편향 + 드리프트물론 모든 센서에 이 세 가지가 똑같이 나타나는 것은 아니다. 어떤 센서는 순간적인 흔들림이 크고, 어떤 센서는 한쪽으로 꾸준히 치우치며, 어떤 센서는 시간이 지날수록 점점 믿기 어려워진다. 중요한 것은 센서가 틀린다는 사실 자체보다, 어떤 방식으로 틀리는지를 이해하는 것이다.
노이즈: 같은 것을 재도 값이 흔들린다
노이즈는 센서값에 섞이는 불규칙한 흔들림이다. 로봇이 가만히 서 있고, 벽도 움직이지 않는데 거리 센서값이 5.02, 4.96, 5.08, 4.91처럼 조금씩 달라진다면 이것이 노이즈다.
노이즈는 매우 자연스러운 현상이다. 센서 내부의 전기 신호가 흔들릴 수도 있고, 조명이 변할 수도 있고, 표면 반사율이 다를 수도 있고, 아주 작은 진동이 측정에 영향을 줄 수도 있다. 센서는 물리 세계와 맞닿아 있으므로 언제나 작은 불안정성을 품는다.
Python으로 같은 위치를 여러 번 측정하는 상황을 만들어 보자.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
true_distance = 5.0
noise_sigma = 0.08
measurements = true_distance + np.random.normal(0.0, noise_sigma, size=100)
print('처음 10개 측정값:')
print(measurements[:10])
print('평균:', np.mean(measurements))
print('표준편차:', np.std(measurements))np.random.normal(0.0, noise_sigma, size=100)은 평균이 0이고 표준편차가 noise_sigma인 무작위 값을 만든다. 여기서는 실제 거리 5.0m 주변에서 측정값이 흔들리는 상황을 흉내 낸다.
그림으로 보면 더 직관적이다.
plt.figure(figsize=(10, 4))
plt.plot(measurements, 'o-', label='measurement')
plt.axhline(true_distance, color='red', linestyle='--', label='true distance')
plt.xlabel('measurement index')
plt.ylabel('distance (m)')
plt.title('Noisy distance measurements')
plt.grid(True)
plt.legend()
plt.show()그래프를 보면 점들이 빨간 선 주변에서 위아래로 흔들린다. 이것이 노이즈의 기본 모습이다. 한 번의 측정값만 보면 실제 값보다 클 수도 있고 작을 수도 있다. 하지만 여러 번 측정해서 평균을 내면 대체로 실제 값에 가까워진다.
이 특징 때문에 노이즈는 종종 평균으로 완화할 수 있다. 예를 들어 거리 센서가 5번 연속 측정한 값을 평균 내면 한 번 측정한 값보다 안정적일 가능성이 크다.
recent = measurements[:5]
averaged = np.mean(recent)
print('최근 5개:', recent)
print('최근 5개 평균:', averaged)하지만 평균을 내는 것이 항상 정답은 아니다. 로봇이 빠르게 움직이는 중이라면 오래된 측정값을 평균에 포함하는 순간 반응이 느려질 수 있다. 센서값을 부드럽게 만들수록 민첩성은 줄어든다. 로봇 제어에서는 항상 이런 균형을 고민해야 한다.
노이즈가 있는 로봇은 왜 떨리는가
노이즈가 로봇 행동에 어떤 영향을 주는지 생각해 보자. 로봇이 벽과 1.0m 거리를 유지하려고 한다고 하자. 거리 센서값이 1.0m보다 작으면 뒤로 가고, 크면 앞으로 간다. 그런데 센서값이 노이즈 때문에 0.98, 1.02, 0.97, 1.03처럼 흔들리면 로봇은 어떻게 될까?
가만히 있어도 되는 상황에서 계속 앞뒤로 조금씩 움직이려 할 수 있다. 로봇 입장에서는 매 순간 벽이 가까워졌다가 멀어진 것처럼 보이기 때문이다. 실제 세계가 흔들린 것이 아니라 센서값이 흔들렸는데, 로봇이 그 값을 너무 곧이곧대로 믿으면 행동도 흔들린다.
간단한 예제를 보자.
np.random.seed(1)
true_distance = 1.0
target_distance = 1.0
noise_sigma = 0.03
k = 0.8
for step in range(10):
measured = true_distance + np.random.normal(0.0, noise_sigma)
error = measured - target_distance
command = k * error
print(step, 'measured:', round(measured, 3), 'command:', round(command, 3))실제 거리는 계속 1.0m인데도 명령값은 0이 아니라 작은 양수와 음수로 흔들린다. 이것이 센서 노이즈가 제어 명령으로 전달되는 모습이다. 실제 로봇에서는 이런 흔들림이 모터 떨림, 불필요한 에너지 소모, 경로의 미세한 지그재그로 나타날 수 있다.
그래서 로봇은 센서값을 그냥 읽고 바로 행동하지 않는다. 상황에 따라 평균을 내거나, 필터를 적용하거나, 여러 센서를 함께 사용하거나, 확률적으로 더 그럴듯한 값을 추정한다. 이 책의 5부는 바로 그 생각을 차근차근 배워 가는 구간이다.
편향: 오차가 항상 한쪽으로 치우친다
노이즈가 이리저리 흔들리는 오차라면, 편향은 한쪽으로 꾸준히 치우치는 오차다. 영어로는 bias라고 부른다.
예를 들어 실제 거리가 5.0m인데 거리 센서가 평균적으로 5.2m 근처를 계속 가리킨다고 하자. 측정값은 매번 조금씩 흔들릴 수 있지만, 전체적으로는 실제 값보다 크게 나온다. 이때 센서에는 +0.2m의 편향이 있다고 말할 수 있다.
np.random.seed(2)
true_distance = 5.0
bias = 0.2
noise_sigma = 0.05
measurements = true_distance + bias + np.random.normal(0.0, noise_sigma, size=100)
print('평균 측정값:', np.mean(measurements))
print('실제 거리:', true_distance)
print('평균 오차:', np.mean(measurements) - true_distance)이 예제에서 측정값의 평균은 5.0이 아니라 5.2에 가까울 것이다. 노이즈는 평균을 내면 어느 정도 줄어들지만, 편향은 평균을 내도 사라지지 않는다. 이것이 노이즈와 편향의 큰 차이다.
편향은 로봇에게 특히 위험하다. 왜냐하면 겉보기에는 값이 안정적으로 보일 수 있기 때문이다. 측정값이 크게 흔들리지 않으면 우리는 센서가 정확하다고 착각하기 쉽다. 하지만 그 안정적인 값이 계속 틀린 방향으로 치우쳐 있다면 로봇은 자신 있게 잘못된 판단을 한다.
엔코더 편향은 위치 추정을 밀어낸다
바퀴형 로봇에는 보통 엔코더가 달려 있다. 엔코더는 바퀴가 얼마나 회전했는지 알려 주는 센서다. 로봇은 바퀴 회전량을 이용해 자신이 얼마나 이동했는지 추정한다.
하지만 바퀴 반지름을 조금 잘못 알고 있거나, 바퀴가 미끄러지거나, 바닥 상태가 달라지면 엔코더로 계산한 이동 거리와 실제 이동 거리가 달라진다. 이 차이가 한쪽으로 꾸준히 생기면 위치 추정이 점점 밀린다.
예를 들어 실제 속도는 1.0m/s인데 로봇이 엔코더를 통해 1.02m/s로 이동했다고 믿는다고 하자. 2% 차이는 작아 보인다. 하지만 시간이 지나면 이야기가 달라진다.
import numpy as np
import matplotlib.pyplot as plt
dt = 0.1
total_time = 20.0
times = np.arange(0.0, total_time + dt, dt)
true_v = 1.0
measured_v = 1.02
true_x = 0.0
estimated_x = 0.0
true_history = []
estimated_history = []
for t in times:
true_x = true_x + true_v * dt
estimated_x = estimated_x + measured_v * dt
true_history.append(true_x)
estimated_history.append(estimated_x)
print('실제 위치:', true_history[-1])
print('추정 위치:', estimated_history[-1])
print('위치 오차:', estimated_history[-1] - true_history[-1])20초 동안 움직였을 뿐인데 위치 오차가 눈에 띄게 커진다. 더 오래 움직이면 오차는 더 커진다. 실내 배송 로봇이나 물류 로봇처럼 오랫동안 주행하는 시스템에서는 작은 편향도 무시할 수 없다.
그래프로 비교해 보자.
plt.figure(figsize=(10, 4))
plt.plot(times, true_history, label='true position')
plt.plot(times, estimated_history, '--', label='estimated position')
plt.xlabel('time (s)')
plt.ylabel('x position (m)')
plt.title('Position error caused by biased velocity measurement')
plt.grid(True)
plt.legend()
plt.show()처음에는 두 선이 거의 붙어 있는 것처럼 보인다. 하지만 시간이 지날수록 두 선 사이가 벌어진다. 이 장면은 로봇 위치 추정에서 매우 중요하다. 작은 오차가 반복해서 적분되면 큰 위치 오차가 된다.
드리프트: 시간이 오차를 키운다
드리프트는 시간이 지남에 따라 오차가 서서히 커지거나 변하는 현상이다. 편향과 비슷해 보이지만, 드리프트는 시간의 흐름과 강하게 연결되어 있다. 처음에는 괜찮아 보이던 센서가 시간이 지날수록 점점 다른 값을 가리키는 상황을 떠올리면 된다.
대표적인 예가 IMU다. IMU는 관성 측정 장치로, 가속도와 각속도를 측정한다. 드론, 스마트폰, 로봇 청소기, 자율주행 플랫폼 등 다양한 장치에서 사용된다. IMU의 자이로스코프는 회전 속도를 알려 주는데, 이 값을 시간에 따라 적분하면 방향 각도를 추정할 수 있다.
문제는 자이로스코프가 완벽히 0을 가리키지 않는다는 점이다. 로봇이 실제로 회전하지 않는데도 센서가 아주 작은 각속도를 보고할 수 있다. 이 작은 값이 계속 적분되면 각도 오차가 누적된다.
예를 들어 로봇이 가만히 있는데 자이로스코프가 0.5도/s만큼의 잘못된 각속도를 계속 보고한다고 하자. 1초 뒤에는 0.5도 오차지만, 60초 뒤에는 30도 오차가 된다.
dt = 0.01
total_time = 60.0
times = np.arange(0.0, total_time + dt, dt)
gyro_bias_deg_per_sec = 0.5
estimated_angle = 0.0
angle_history = []
for t in times:
measured_gyro = gyro_bias_deg_per_sec
estimated_angle = estimated_angle + measured_gyro * dt
angle_history.append(estimated_angle)
print('60초 뒤 추정 각도 오차:', angle_history[-1], 'deg')
plt.figure(figsize=(10, 4))
plt.plot(times, angle_history)
plt.xlabel('time (s)')
plt.ylabel('estimated angle error (deg)')
plt.title('Gyro drift caused by small bias')
plt.grid(True)
plt.show()센서가 매 순간 크게 틀린 것은 아니다. 오히려 0.5도/s는 아주 작아 보인다. 하지만 적분은 오차를 모은다. 작은 물방울이 계속 떨어지면 컵이 넘치듯이, 작은 각속도 오차가 계속 쌓이면 로봇의 방향 추정이 크게 틀어진다.
IMU와 엔코더에서 드리프트가 나타나는 방식
IMU와 엔코더는 모두 로봇 위치 추정에 자주 쓰이지만, 둘 다 드리프트 문제를 가진다.
IMU에서는 가속도를 적분해 속도를 얻고, 속도를 다시 적분해 위치를 얻을 수 있다. 이론적으로는 멋진 방법이다. 하지만 가속도 측정에 작은 편향이 있으면 속도 오차가 생기고, 그 속도 오차가 다시 위치 오차로 커진다. 한 번 적분해도 오차가 커지는데, 두 번 적분하면 훨씬 빠르게 문제가 커질 수 있다.
엔코더에서는 바퀴 회전량을 적분해 이동 거리를 얻는다. 평평하고 미끄러지지 않는 바닥에서는 꽤 잘 맞을 수 있다. 그러나 바퀴가 살짝 헛돌거나, 카펫과 타일처럼 바닥 마찰이 달라지거나, 바퀴 지름을 정확히 모르면 위치 추정이 조금씩 틀어진다. 회전하는 로봇에서는 양쪽 바퀴의 작은 차이가 방향 오차로 이어지고, 방향 오차는 곧 위치 오차를 만든다.
드리프트가 무서운 이유는 로봇이 스스로 알아차리기 어렵다는 데 있다. 로봇은 자기 추정값을 믿고 움직인다. 추정값이 천천히 틀어지면, 로봇은 틀어진 지도 위에서 정확하게 움직이고 있다고 착각한다. 그래서 현실의 로봇은 주기적으로 외부 기준을 사용해 자신을 다시 맞춘다. 예를 들어 카메라로 표식을 보거나, LiDAR로 벽과 지도 형태를 맞추거나, GPS로 전역 위치를 확인한다.
노이즈, 편향, 드리프트를 한 번에 보기
세 가지 오차를 한 그림에 넣어 보자. 로봇이 1차원 직선 위를 일정한 속도로 움직인다고 가정한다. 실제 위치는 시간에 따라 일정하게 증가한다. 그런데 위치 센서가 노이즈, 편향, 드리프트를 모두 가진다면 측정값은 어떻게 보일까?
np.random.seed(3)
dt = 0.1
total_time = 30.0
times = np.arange(0.0, total_time + dt, dt)
true_speed = 0.5
true_position = true_speed * times
noise_sigma = 0.15
bias = 0.4
drift_rate = 0.02
noise = np.random.normal(0.0, noise_sigma, size=len(times))
drift = drift_rate * times
measured_position = true_position + noise + bias + drift
plt.figure(figsize=(10, 5))
plt.plot(times, true_position, label='true position')
plt.plot(times, measured_position, '.', alpha=0.6, label='measurement')
plt.xlabel('time (s)')
plt.ylabel('position (m)')
plt.title('Noise, bias, and drift in sensor measurements')
plt.grid(True)
plt.legend()
plt.show()이 그래프에는 세 가지 특징이 동시에 나타난다. 점들이 위아래로 흩어져 보이는 것은 노이즈다. 전체 측정값이 실제 위치보다 위쪽에 있는 것은 편향이다. 시간이 지날수록 두 값 사이의 차이가 조금씩 더 커지는 것은 드리프트다.
현실의 센서 데이터는 이보다 더 복잡할 수 있다. 노이즈가 항상 같은 크기로 나타나지 않을 수도 있고, 편향이 온도에 따라 바뀔 수도 있으며, 드리프트가 직선이 아니라 천천히 휘어진 곡선처럼 나타날 수도 있다. 하지만 기본 감각은 같다. 센서값은 진짜 값 주변에서 흔들리고, 때로는 한쪽으로 치우치며, 시간이 지나며 점점 멀어질 수 있다.
정확한 값 하나를 고집하면 위험하다
초보자는 센서값을 하나의 정확한 숫자로 생각하기 쉽다.
x = 3.2이렇게 쓰면 로봇이 x = 3.2m 위치에 정확히 있다고 느껴진다. 하지만 실제로는 이렇게 생각하는 편이 더 안전하다.
로봇은 아마도 3.2m 근처에 있다.
어쩌면 3.1m일 수도 있고, 3.3m일 수도 있다.
상황이 나쁘면 그보다 더 벗어났을 수도 있다.이 관점이 불확실성이다. 불확실성은 우리가 값을 모른다는 사실을 수학적으로 다루기 위한 생각이다. 로봇의 위치, 속도, 방향, 물체까지의 거리, 장애물의 위치는 모두 불확실할 수 있다.
불확실성을 받아들이면 로봇의 판단 방식이 달라진다. 예를 들어 거리 센서가 장애물까지 1.0m라고 말했을 때, 센서 오차가 거의 없다면 로봇은 꽤 안심하고 움직일 수 있다. 하지만 오차가 클 수 있다면 실제 장애물은 0.7m 앞에 있을 수도 있다. 이 경우 로봇은 더 조심해야 한다.
센서값 하나를 점으로만 보는 대신 범위로 생각해 보자.
measured_distance = 5.04
sigma = 0.08
lower = measured_distance - 2 * sigma
upper = measured_distance + 2 * sigma
print('측정값:', measured_distance)
print('그럴듯한 범위:', lower, '~', upper)여기서 sigma는 측정값이 얼마나 흔들리는지를 나타내는 값으로 생각하면 된다. 다음 장에서 표준편차라는 이름으로 더 자세히 다룬다. 지금은 단순히 sigma가 클수록 센서값을 덜 확신해야 한다고 이해하면 충분하다.
불확실성이 큰 로봇은 다르게 움직여야 한다
로봇이 복도에서 주행한다고 해 보자. 지도상으로는 오른쪽 벽과 0.5m 떨어져 있어야 한다. 그런데 로봇의 위치 추정 불확실성이 0.02m라면 크게 걱정하지 않아도 된다. 반면 불확실성이 0.4m라면 이야기가 다르다. 로봇은 자신이 벽에 가까운지, 중앙에 있는지, 심지어 벽을 향해 치우쳐 있는지 확신할 수 없다.
이때 좋은 로봇은 단순히 현재 위치는 2.0m다라고 말하지 않는다. 대신 현재 위치는 2.0m 근처인데, 오차가 꽤 클 수 있다라고 판단한다. 그리고 불확실성이 커질수록 속도를 줄이거나, 더 많은 센서 정보를 모으거나, 위치를 다시 확인할 수 있는 장소로 이동한다.
불확실성은 겁이 많아지는 것이 아니다. 오히려 로봇이 자기 무지를 정직하게 인정하는 방법이다. 좋은 추정 시스템은 자신이 아는 것과 모르는 것을 함께 표현한다.
센서 오차를 고려한 간단한 거리 판단
장애물과의 거리를 판단하는 예제로 불확실성의 의미를 조금 더 느껴 보자. 로봇이 장애물과 최소 0.8m 이상 떨어져 있어야 안전하다고 하자. 거리 센서가 1.0m를 보고했다면 안전할까?
센서 오차가 작다면 안전하다고 볼 수 있다. 하지만 센서 노이즈가 크다면 실제 거리는 0.8m보다 작을 수도 있다. 따라서 측정값 하나만 보지 말고, 안전 여유를 함께 계산해야 한다.
def is_safe(measured_distance, sigma, safety_distance):
conservative_distance = measured_distance - 2 * sigma
return conservative_distance > safety_distance
print(is_safe(1.0, 0.05, 0.8))
print(is_safe(1.0, 0.15, 0.8))첫 번째 경우에는 1.0 - 2 * 0.05 = 0.9이므로 안전 거리 0.8m보다 여유가 있다. 두 번째 경우에는 1.0 - 2 * 0.15 = 0.7이므로 실제 거리가 안전 거리보다 짧을 가능성을 고려해야 한다. 같은 1.0m 측정값이라도 센서의 불확실성이 다르면 판단이 달라진다.
이것이 확률적 사고의 출발점이다. 로봇은 단순히 값만 보는 것이 아니라 그 값이 얼마나 믿을 만한지도 함께 봐야 한다.
시뮬레이션: 완벽한 센서와 현실적인 센서 비교하기
마지막으로 작은 시뮬레이션을 만들어 보자. 로봇이 직선으로 움직이고, 센서가 로봇의 x 위치를 측정한다고 하자. 하나는 완벽한 센서이고, 다른 하나는 노이즈와 편향과 드리프트가 있는 센서다.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(10)
dt = 0.1
total_time = 25.0
times = np.arange(0.0, total_time + dt, dt)
v = 0.4
true_x = v * times
noise_sigma = 0.12
bias = -0.3
drift_rate = 0.015
perfect_sensor = true_x.copy()
realistic_sensor = true_x + bias + drift_rate * times + np.random.normal(
0.0,
noise_sigma,
size=len(times)
)
plt.figure(figsize=(10, 5))
plt.plot(times, true_x, label='true x')
plt.plot(times, perfect_sensor, '--', label='perfect sensor')
plt.plot(times, realistic_sensor, '.', alpha=0.6, label='realistic sensor')
plt.xlabel('time (s)')
plt.ylabel('x position (m)')
plt.title('Perfect sensor vs realistic sensor')
plt.grid(True)
plt.legend()
plt.show()완벽한 센서는 실제 위치와 완전히 겹친다. 하지만 현실적인 센서는 점들이 흔들리고, 전체적으로 한쪽으로 치우치며, 시간이 지나며 실제 위치와의 관계가 조금씩 바뀐다.
우리가 앞으로 다룰 위치 추정은 바로 이 현실적인 센서를 상대하는 기술이다. 센서값이 흔들려도 로봇이 너무 떨지 않게 만들고, 편향이 있어도 보정할 방법을 찾고, 드리프트가 쌓여도 다른 정보로 다시 잡아 주는 것이다.
센서가 틀린다는 사실은 문제가 아니라 출발점이다
센서가 틀린다는 말은 실망스럽게 들릴 수 있다. 하지만 로봇공학에서는 이것이 당연한 출발점이다. 센서가 완벽해야만 로봇이 움직일 수 있다면 현실의 로봇은 아무것도 할 수 없다. 좋은 로봇은 완벽한 센서를 가진 로봇이 아니라, 불완전한 센서로도 그럴듯한 판단을 하는 로봇이다.
이번 장에서 기억해야 할 핵심은 다음과 같다.
노이즈는 같은 값을 반복 측정해도 생기는 불규칙한 흔들림이다.
편향은 측정값이 한쪽으로 꾸준히 치우치는 오차다.
드리프트는 시간이 지날수록 오차가 누적되거나 변하는 현상이다.
불확실성은 정확한 값 하나 대신 가능한 값의 범위로 센서값을 보는 관점이다.
이제 우리는 센서값을 더 이상 순진하게 믿지 않는다. 대신 이렇게 묻기 시작한다.
이 값은 얼마나 흔들리는가?
항상 한쪽으로 치우치지는 않는가?
시간이 지나며 오차가 커지지는 않는가?
이 값을 얼마나 믿어야 하는가?이 질문들이 바로 확률의 문을 연다. 다음 장에서는 평균, 분산, 표준편차, 가우시안 분포를 이용해 센서값의 흔들림과 불확실성을 숫자로 표현하는 방법을 배운다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.