로보틱스와 자율주행
로봇은 세상을 재고, 자기가 어디 있는지 추정하고, 갈 길을 정하고, 모터를 움직이는 고리를 쉬지 않고 돈다. 좌표 변환·기구학·칼만 필터·A*·PID를 작은 예로 직접 계산하며 따라가고, 같은 고리가 자동차 크기로 커진 자율주행과 그 안전 문제까지 살핀다.
목차 (15)
로봇의 구성: 센서, 계산, 구동기
로봇을 아주 거칠게 나누면 세 부분이다. 세상을 재는 센서, 잰 값으로 무엇을 할지 정하는 계산, 실제로 힘을 내는 구동기(모터·유압·공압 실린더)다. 청소 로봇, 공장의 팔, 창고의 운반 로봇, 자율주행차가 모두 이 구조다. 차이는 얼마나 빨리, 얼마나 정확하게, 얼마나 위험한 환경에서 이 고리를 도느냐에 있다.
중요한 것은 이것이 닫힌 고리라는 점이다. 모터에 "1 m 가"라고 명령해도 바퀴는 미끄러지고 바닥은 기울어 있다. 그래서 움직인 결과를 다시 재고, 계획과 다르면 고친다. 이 노트의 거의 모든 절은 이 고리의 한 부분을 다룬다. 계산 쪽은 마이크로컨트롤러에서 GPU가 달린 컴퓨터까지 다양한데, 모터를 정해진 주기로 정확히 돌리는 낮은 층은 임베디드 노트의 실시간 제어와 같은 세계다.
좌표와 변환
로봇에는 좌표계가 여러 개 있다. 방 전체의 월드 좌표계, 로봇 몸체에 붙은 로봇 좌표계(보통 앞이 x, 왼쪽이 y), 그리고 센서마다 붙은 좌표계다. LiDAR는 "내 앞 1.5 m, 왼쪽 0.5 m에 뭔가 있다"고 자기 기준으로 말한다. 이것을 지도에 찍으려면 월드 좌표로 바꿔야 한다.
평면에서 바꾸는 방법은 회전한 뒤 이동하는 것이다. 로봇이 월드의 (xr, yr)에서 각 θ를 바라보면, 로봇 기준 점 (a, b)는 월드에서 (xr + a cos θ − b sin θ, yr + a sin θ + b cos θ)다. 회전과 이동을 3×3 행렬 하나로 묶는 동차 좌표, 3차원 회전의 쿼터니언은 게임에서 쓰는 수학과 똑같아 게임 수학 노트에 자세히 있다. 로봇 소프트웨어는 "월드 → 로봇 → LiDAR → 카메라"처럼 좌표계를 나무 모양으로 이어 두고, 어느 두 좌표계 사이든 변환을 곱해서 얻는다.
좌표 버그의 상당수는 축 방향 약속이 어긋나서 생긴다. ROS의 REP 103은 오른손 좌표계를 쓰고, 몸체 기준으로 x는 앞, y는 왼쪽, z는 위, 지구 위의 가까운 범위는 동·북·위(ENU)로 두며, 단위는 m와 라디안으로 정한다. 함정은 카메라다. 영상 처리 쪽 관례를 따르는 _optical 좌표계는 z가 앞, x가 오른쪽, y가 아래라서, 몸체 좌표계와 섞어 쓰면 장애물이 바닥이나 하늘에 찍힌다. 항공·해양처럼 북·동·아래(NED)를 쓰는 분야의 데이터를 받을 때도 같은 변환이 필요하다.
순기구학과 역기구학
로봇 팔은 링크(막대)와 관절의 사슬이다. 순기구학(forward kinematics)은 관절 각을 알 때 끝점(손, 그리퍼)이 어디 있는지 구한다. 앞 절의 회전·이동을 관절마다 이어 곱하면 되므로 답은 늘 하나다. 평면 2링크 팔이면 팔꿈치는 L1(cos θ1, sin θ1), 끝점은 거기에 L2(cos(θ1+θ2), sin(θ1+θ2))를 더한 곳이다.
실제로 필요한 것은 대개 반대다. "컵이 (1.2, 0.9)에 있다, 관절을 몇 도로 돌려야 하나?" 이것이 역기구학(inverse kinematics)이다. 2링크 팔은 코사인 법칙으로 풀리는데, 팔꿈치를 아래로 굽힌 자세와 위로 굽힌 자세 두 해가 나온다. 목표가 팔 길이의 합보다 멀면 해가 없고, 팔을 쭉 편 경계에서는 하나다. 관절이 여섯 개인 산업용 팔은 해가 여러 개이고 닫힌 식으로 안 풀리는 경우가 많아, 끝점 오차를 줄이는 쪽으로 관절을 조금씩 고치는 반복법(야코비안 이용)을 쓴다. 해 가운데 무엇을 고를지는 관절 한계, 장애물, 지금 자세에서 덜 움직이는 쪽 같은 기준으로 정한다.
바퀴 로봇의 운동학: 차동 구동
청소 로봇과 많은 운반 로봇은 좌우 바퀴를 따로 돌리는 차동 구동이다. 운전대가 없고, 두 바퀴 속도의 차이로 방향을 바꾼다. 바퀴 사이 거리를 b라 하면 몸체의 전진 속도는 두 바퀴의 평균 v = (vL + vR) / 2, 회전 각속도는 차이를 b로 나눈 ω = (vR − vL) / b다. 그림의 예(b = 0.5 m, 왼쪽 0.4·오른쪽 0.6 m/s)는 v = 0.50 m/s, ω = 0.40 rad/s로, 반지름 1.25 m의 원을 왼쪽으로 그린다.
이 식을 시간에 대해 쌓으면 바퀴 회전만으로 위치를 추정할 수 있다. 이것이 오도메트리다. 문제는 작은 오차도 쌓인다는 것이다. 바퀴 지름이 1%만 틀려도, 한 번 미끄러져도 그 뒤의 모든 위치가 틀어진다. 그래서 다음 절의 다른 센서와 섞는다. 자동차는 옆으로 미끄러지지 않는 앞바퀴를 꺾어 도는 구조라, 제자리 회전을 못 하고 최소 회전 반경이 있다. 이 제약이 주차 경로 계획을 어렵게 만든다.
센서: 엔코더, IMU, LiDAR, 카메라
- 휠 엔코더: 모터·바퀴 축이 몇 칸 돌았는지 센다. 빠르고 싸지만 미끄러짐을 모른다.
- IMU(관성 측정 장치): 가속도계와 자이로스코프로 가속도와 회전 속도를 잰다. 바깥 도움 없이 혼자 재지만, 위치를 얻으려고 두 번 적분하면 작은 치우침이 빠르게 커진다(드리프트).
- LiDAR: 레이저를 쏘고 돌아오는 시간으로 거리를 잰다. 회전하거나 여러 빔을 쓰면 주변이 점구름(point cloud)으로 나온다. 정확하지만 비·안개에 약하고, 유리나 검은 면은 빛을 잘 돌려주지 않는다.
- 카메라: 싸고 정보가 가장 많다. 표지판 글자, 신호등 색, 사람의 자세까지 보인다. 대신 거리는 직접 재지 못해 두 대로 시차를 보거나(스테레오) 신경망으로 추정하며, 어둠과 역광에 약하다.
자동차에는 여기에 레이더(전파로 거리와 상대 속도를 재며 날씨에 강함), GNSS(위성 위치), 초음파(주차 거리)가 더해진다. 비행 시간·삼각 측량 같은 거리 측정 원리는 센싱 노트, 위성 항법은 위치 노트, 카메라 영상에서 물체를 찾는 방법은 컴퓨터 비전 노트에 있다.
센서 융합: 1차원 칼만 필터
오도메트리는 부드럽지만 점점 틀어지고, GNSS나 랜드마크 측정은 틀어지지 않지만 들쭉날쭉하다. 둘을 어떤 비율로 섞어야 할까? 칼만 필터는 위치를 값 하나가 아니라 정규 분포(평균과 분산)로 들고 다니며 두 단계를 되풀이한다.
- 예측: 움직임 명령대로 평균을 옮기고, 움직임이 불확실한 만큼 분산 Q를 더한다. 믿음이 넓어진다.
- 갱신: 측정 z가 오면 칼만 이득 K = P⁻ / (P⁻ + R)만큼 측정 쪽으로 당긴다. R은 측정 노이즈의 분산이다. 예측이 불확실할수록(P⁻가 클수록) 측정을 더 믿는다. 분산은 (1 − K)P⁻로 줄어, 예측과 측정 어느 쪽보다도 작아진다.
로봇은 처음에 자기가 0 m 근처에 있다고 믿는다. 곡선의 폭이 불확실성(분산)이다.
실제 로봇은 위치·방향·속도를 함께 담은 벡터와 공분산 행렬로 같은 일을 한다. 움직임이 회전 때문에 비선형이면 그 자리에서 선형으로 근사하는 확장 칼만 필터(EKF)나, 표본 점 몇 개를 비선형 함수에 통과시키는 UKF를 쓴다. 분포가 한 봉우리 모양이 아니면(복도 두 곳 가운데 어디인지 모를 때) 많은 입자(표본 위치)로 분포를 흉내 내는 파티클 필터를 쓴다. 지도 위에서 위치를 찾는 몬테카를로 위치 추정(AMCL)이 그 예다.
SLAM: 지도와 위치를 함께
위치를 알려면 지도가 있어야 하고, 지도를 그리려면 위치를 알아야 한다. 처음 가 본 건물에서는 둘 다 없다. SLAM(동시적 위치 추정 및 지도 작성)은 이 닭과 달걀 문제를 함께 푼다. 지금의 주류는 그래프 SLAM이다. 로봇이 지나간 자세를 점(노드)으로, "여기서 저기까지 오도메트리로 1 m"나 "이 자세에서 저 랜드마크가 2 m 앞에 보였다" 같은 측정을 점 사이의 용수철(제약)로 둔다. 그리고 모든 용수철이 가장 덜 늘어나는 배치를 최소제곱 최적화로 찾는다.
열쇠는 루프 클로저다. 한 바퀴 돌아 처음 본 곳을 다시 알아보면, 오도메트리로 쌓인 오차가 그 한 줄의 제약으로 드러나고 최적화가 경로 전체에 고르게 나눠 바로잡는다. 반대로 비슷하게 생긴 다른 복도를 같은 곳으로 착각하면 지도 전체가 구겨진다. 그래서 루프 클로저 후보는 엄격하게 검증한다. 센서에 따라 LiDAR SLAM, 카메라의 특징점을 쓰는 visual SLAM, IMU를 섞은 visual-inertial 방식이 있다.
경로 계획: A*와 RRT
지도가 있으면 갈 길을 찾는다. 바닥을 격자로 나누고 장애물 칸을 막으면 경로 계획은 그래프의 최단 경로 문제가 된다. A*는 다익스트라에 "목표까지 남은 거리의 추정" h를 더해, f = g + h가 가장 작은 칸부터 꺼낸다. h가 실제 남은 거리를 넘지 않으면(맨해튼 거리는 벽을 무시하므로 늘 넘지 않는다) 찾은 경로는 최단이다. 아래 격자에서 A*는 11칸을 꺼내고 끝나지만, h를 0으로 둔 다익스트라는 35칸을 꺼낸다. 다익스트라와 우선순위 큐 자체는 알고리즘 › 그래프에 있다.
1번째로 꺼낸 칸 (2, 1): g = 0, h = 6, f = 6. 시작 칸이다. 이웃을 열린 목록(점선 칸)에 넣고, 칸 안 숫자는 f다.
격자는 2차원 바닥에는 좋지만, 관절이 여섯 개인 팔처럼 차원이 높으면 칸 수가 폭발한다. 그때는 공간을 무작위로 찍어 보는 표본 기반 계획을 쓴다. 대표인 RRT(빠르게 퍼지는 무작위 트리)는 무작위 점을 하나 찍고, 트리에서 가장 가까운 노드로부터 그쪽으로 한 걸음 가지를 뻗되 충돌하면 버리기를 되풀이한다. 빈 공간 쪽으로 빠르게 퍼져 길은 잘 찾지만 경로가 구불구불해, 다듬기를 하거나 가지를 계속 다시 이어 붙여 최적에 다가가는 RRT* 같은 변형을 쓴다. 찾은 경로는 다시 로봇이 실제로 따라갈 수 있는 매끄러운 궤적(속도·가속도 한계 포함)으로 바꾼다.
제어: PID
계획한 궤적이나 목표 각도를 실제로 따라가게 하는 것이 제어다. 가장 널리 쓰는 것이 PID다. 오차 e = 목표 − 측정에 대해 명령 u = Kpe + Ki∫e dt + Kd de/dt를 낸다.
- P(비례): 오차에 비례해 민다. 세게 하면 빨라지지만 출렁인다. 이 그림의 대상처럼 버티는 힘(용수철)이 있으면 오차가 0이 되기 전에 힘이 균형을 이뤄, 정상 상태 오차가 남는다. P만 쓰면 최종값이 0.86에서 멈췄다.
- I(적분): 남은 오차를 시간에 걸쳐 쌓아 끝내 밀어낸다. 정상 상태 오차가 0이 되지만, 쌓인 값 때문에 오버슈트가 28%에서 39%로 커졌다. 모터가 한계에 걸린 동안 적분이 계속 쌓이는 와인드업을 막는 장치가 필요하다.
- D(미분): 변화 속도에 브레이크를 건다. 오버슈트가 19%로 줄고, 2% 안에 들어오는 시간도 5.7초에서 4.0초로 짧아졌다. 다만 측정 노이즈도 미분해 키우므로 거르고 쓴다. 이 그림은 목표가 계단으로 바뀌는 순간의 튐(미분 킥)을 피하려고 오차 대신 측정값을 미분했다.
PID는 대상의 수학 모델 없이도 이득만 조정해 쓸 수 있다는 점이 강점이다. 로봇 팔처럼 관절끼리 힘이 얽히거나, 자동차처럼 미래 경로를 내다보며 제약(차선, 최대 조향각)을 지켜야 하면 모델로 몇 초 앞을 예측해 매 순간 최적의 명령을 푸는 모델 예측 제어(MPC)를 쓴다. 보통은 위층에서 MPC나 경로 추종이 목표 속도를 정하고, 아래층의 모터마다 PID가 그 속도를 맞추는 식으로 층을 나눈다.
행동 결정: 상태 기계와 행동 트리
"배터리가 낮으면 충전하러 가고, 사람이 보이면 따라가고, 아니면 순찰한다" 같은 높은 층의 결정은 어떻게 짤까? 고전적인 방법은 유한 상태 기계(FSM)다. 상태와 상태 사이의 전이를 그린다. 작을 때는 명쾌하지만 상태가 늘면 전이가 거미줄처럼 얽히고, "어느 상태에서든 배터리가 낮으면" 같은 규칙을 상태마다 되풀이해 적어야 한다.
행동 트리(behavior tree)는 게임 AI에서 로봇으로 건너왔다. 트리를 주기적으로 위에서부터 훑는다(tick). 선택(?) 노드는 자식을 차례로 시도해 하나라도 성공하면 멈추고, 순서(→) 노드는 자식이 모두 성공해야 성공한다. 잎은 조건 검사나 행동이다. 위에 둔 가지가 우선순위가 높으므로 "배터리 낮음" 가지를 맨 위에 두면 어느 상황에서든 먼저 걸린다. 가지 하나를 떼어 다른 로봇에 붙이기도 쉽다. ROS 2의 내비게이션 스택 Nav2가 계획·제어·복구 동작을 행동 트리로 엮는다.
ROS 2
로봇 소프트웨어는 드라이버·위치 추정·인지·계획·제어가 서로 다른 속도로 동시에 돈다. ROS(Robot Operating System)는 이름과 달리 운영체제가 아니라, 이런 부품을 따로 짜서 잇게 해 주는 라이브러리와 도구 모음이다. 각 부품은 노드(따로 도는 프로그램)이고, 노드끼리는 이름 붙은 토픽에 메시지를 발행·구독한다. 요청과 응답이 필요하면 서비스, "저 문까지 가" 같이 오래 걸리고 중간 진행 상황과 취소가 필요한 목표는 액션을 쓴다. 노드는 같은 메시지 형식만 맞추면 되니, LiDAR를 다른 회사 제품으로 바꿔도 드라이버 노드 하나만 바꾸면 된다.
ROS 2는 1편의 한계(중앙 마스터 하나에 의존, 실시간·보안 부족)를 고치려고 바닥부터 다시 만든 판이다. 통신은 산업용 발행·구독 표준인 DDS 같은 미들웨어 위에서 돌고, 서비스 품질(QoS) 설정으로 "센서 값은 늦으면 버려도 됨", "지도는 꼭 전달" 같은 차이를 준다. 녹화(rosbag)와 시각화(RViz), 시뮬레이터 연동 같은 도구가 함께 있어 실제 로봇 없이도 같은 코드를 돌려 볼 수 있다. 마이크로컨트롤러 쪽은 micro-ROS로 ROS 2 그래프에 붙는다.
시뮬레이션과 현실 격차
로봇 소프트웨어는 실물에 올리기 전에 시뮬레이터에서 먼저 돌린다. 실물은 비싸고 부서지며, 넘어지는 장면을 수천 번 되풀이할 수 없기 때문이다. ROS와 함께 흔히 쓰는 Gazebo는 물리 엔진과 센서 모형을 갖춰, 같은 ROS 토픽으로 가상의 LiDAR·카메라 값을 내보내고 속도 명령을 받는다. 노드 코드는 그대로 두고 아래만 실물과 바꿔 끼운다.
문제는 시뮬레이터가 세상을 단순하게 만든다는 것이다. 마찰·바닥의 미끄러움·모터의 지연과 포화·센서 잡음·조명과 질감이 실제와 다르면, 시뮬레이터에서 완벽하던 제어기와 인지 모델이 실물에서 무너진다. 이 차이를 현실 격차(reality gap)라 한다. 2017년 토빈 등은 시뮬레이터의 렌더링을 일부러 마구 바꿔(현실과 닮지 않은 무작위 질감 등) 학습시키면 현실이 모델에게 “또 하나의 변형”으로 보인다는 도메인 무작위화를 제안했고, 현실 사진 없이 시뮬레이터 영상만으로 학습한 물체 위치 추정기가 실제에서 1.5cm 정확도를 냈다고 보고했다(Domain Randomization). 그래도 마지막 확인은 실물로 한다. 시뮬레이션에서 통과한 것은 실물 시험을 시작해도 된다는 뜻이지 끝내도 된다는 뜻이 아니다.
자율주행: 레벨과 파이프라인
자율주행차는 지금까지의 모든 것을 시속 수십 km로, 사람 곁에서 해내야 하는 로봇이다. 얼마나 자동인지는 미국 자동차공학회(SAE)의 J3016이 정한 레벨 0–5로 말한다. 2014년에 처음 나왔고 이후 개정되어 왔다. 핵심은 "누가 운전하나"와 "문제가 생기면 누가 받나"다. 레벨 1은 조향이나 속도 하나만, 레벨 2는 둘 다 시스템이 맡지만 주변 감시와 책임은 여전히 사람에게 있다. 시중의 차로 유지·차간 거리 유지를 함께 하는 기능 대부분이 레벨 2다. 레벨 3부터 정해진 조건에서는 시스템이 운전하며, 레벨 3은 시스템이 요청하면 사람이 넘겨받아야 하고, 레벨 4는 사람이 응하지 않아도 스스로 안전하게 멈춘다. 레벨 5는 어떤 조건에서든 운전한다.
레벨 1–4는 모두 운행 설계 영역(ODD) 안에서만 작동한다. "고속도로, 낮, 맑음, 시속 얼마 이하" 같은 조건이다. 레벨 3 이상은 ODD를 벗어나는 것(공사 구간, 폭우)을 스스로 알아채고 대비해야 한다. 그래서 레벨은 기술의 우열이 아니라 역할 분담의 이름이다. 좁은 도시 구역에서만 도는 무인 택시가 레벨 4이고, 고속도로 어디서나 도는 보조 기능은 레벨 2다. 상용화는 조심스럽게 나아간다. 위키백과의 정리로는 메르세데스-벤츠가 고속도로 정체 구간에서 시속 40마일(64 km)까지 레벨 3을 제공하다가 2026년 1월에 다가올 레벨 2 기능으로 바꾸며 내렸다. 국제적으로는 UNECE가 이 체계를 바탕으로 한 UN 규정 157호(2021년 1월 발효)를 두었다.
소프트웨어는 전통적으로 단계를 나눈다. 인지가 카메라·LiDAR·레이더로 차·보행자·차선·신호를 찾고 고정밀 지도와 대조해 위치를 잡는다. 예측이 주변 참가자가 몇 초 뒤 어디 있을지 여러 가능성으로 내다본다. 판단·계획이 양보할지 차선을 바꿀지 정하고 안전한 궤적을 만든다. 제어가 그 궤적을 조향·가속·제동으로 따라간다. 단계를 나누면 각각을 따로 시험하고 고장 원인을 찾기 쉽다. 최근에는 여러 단계를 큰 신경망 하나로 묶어 센서에서 바로 궤적을 내는 엔드투엔드 방식도 시도된다. 단계 사이에서 정보를 잃지 않는 대신, 왜 그렇게 판단했는지 보이기 어렵고 드문 상황을 검증하기가 어렵다.
안전과 윤리
로봇은 화면 속 프로그램과 달리 버그가 몸으로 나타난다. 그래서 안전은 기능을 다 만든 뒤 덧붙이는 것이 아니라 설계의 출발점이다. 자동차 업계는 부품이 고장 났을 때의 위험을 다루는 기능 안전 표준과, 고장이 없어도 인지가 상황을 잘못 읽을 때의 위험을 다루는 SOTIF(의도한 기능의 안전) 표준을 함께 따른다. 핵심 원칙은 몇 가지로 모인다. 고장이나 ODD 이탈을 감지하면 최소 위험 상태(감속해 갓길에 정차 등)로 물러난다. 주 계산기와 따로 도는 단순한 안전 장치(비상 정지, 속도·힘 제한, 감시 타이머)를 둔다. 도로 주행만으로는 드문 상황을 충분히 겪을 수 없으니, 시뮬레이션에서 위험한 장면을 대량으로 만들어 시험한다.
사람 곁에서 일하는 협동 로봇은 부딪쳐도 다치지 않게 힘과 속도를 제한하고, 사람이 다가오면 느려진다. 윤리 문제도 있다. 흔히 거론되는 "트롤리 딜레마"보다 실제로 더 자주 부딪치는 것은 일상의 문제다. 사고가 나면 책임은 운전석의 사람, 제조사, 소프트웨어 공급자 가운데 누구에게 있나. 카메라를 단 로봇이 거리와 집 안을 돌며 모으는 영상은 누구의 것인가. 인식 모델이 특정 피부색이나 체형의 보행자를 덜 잘 찾는다면 그 위험은 공평한가. 레벨 2 기능을 "자율주행"처럼 광고하면 사람이 감시를 놓친다. 기술 설명과 마케팅 이름을 구별하는 것도 안전의 일부다.
핵심 자료
카메라 영상에서 물체를 찾는 방법은 컴퓨터 비전 노트, 모터와 센서를 직접 다루는 마이크로컨트롤러 쪽은 임베디드 노트에 있다.
| 자료 | 종류 | 요지 | 링크 |
|---|---|---|---|
| Modern Robotics: Mechanics, Planning, and Control | 교재(무료 PDF) | Lynch·Park(2017). 좌표 변환·순기구학·역기구학·동역학·궤적·제어를 한 흐름으로 다룬다. 강의 영상과 코드도 함께 있다. | Northwestern |
| Planning Algorithms | 교재(무료) | LaValle(2006). 격자 탐색부터 RRT 같은 표본 기반 계획, 미분 제약이 있는 계획까지 경로 계획의 표준 참고서. | lavalle.pl |
| Nav2 | 문서 | ROS 2의 모바일 로봇 내비게이션 프레임워크. 계획·제어·코스트맵 서버를 행동 트리로 엮는 실제 구조를 볼 수 있다. | nav2.org |
| BehaviorTree.CPP | 라이브러리 | 로봇 행동 트리의 대표 C++ 구현. 트리를 XML로 적고 동작은 C++로 짠다. 시각 편집기 Groot2가 있다. | behaviortree.dev |
| ROS 2 | 저장소 | 로봇 소프트웨어용 라이브러리·도구 모음의 본 저장소. 배포판과 문서로 가는 입구다. | GitHub |
- Modern Robotics: Mechanics, Planning, and Control — Northwestern
- Planning Algorithms — lavalle.pl
- Nav2 — nav2.org
- BehaviorTree.CPP — behaviortree.dev
- ROS 2 — GitHub
- REP 103: Standard Units of Measure and Coordinate Conventions — ros-infrastructure/rep
- Getting Started with Gazebo — Gazebo
- Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World (Tobin 등, 2017) — arXiv
- Self-driving car (SAE 레벨, ODD) — Wikipedia