# Driver Tutorials

**What you’ll do**
- `Driver` 기반 예제를 통해 주행 명령 송신과 상태 수신(큐 처리) 패턴을 익힙니다.

**Prerequisites**
- {doc}`SDK Guide </page/SDK/sdk_guide>`

**Next**
- ROS2 노드 튜토리얼(선택): {doc}`ROS2 Driver Tutorials </page/SDK/tutorials/ros2_driver_tutorials>`
- 공개 API 상세: {doc}`C++ API Reference </page/SDK/sdk_reference>`

---

`Driver`는 UART I/O를 전용 스레드에서 처리하고, 사용자 코드는 `setCommand(v, omega)`를 이용하여 명령을 업데이트 합니다.

- Basic: {doc}`Driver Demo </page/SDK/tutorials/driver_demo>`
- Intermediate: {doc}`Driver Observe </page/SDK/tutorials/driver_observe>`, {doc}`Driver Read AllState </page/SDK/tutorials/driver_read_allstate>`, {doc}`Driver High Rate Control </page/SDK/tutorials/driver_high_rate_control>`

## 빌드 (CMake)

SDK 루트에서 빌드합니다.

```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
```

## 실행

예제 실행 파일은 `build/` 아래에 생성됩니다.

```bash
./build/driver_demo /dev/ttyKMC 5
./build/driver_observe /dev/ttyKMC 5
./build/driver_read_allstate /dev/ttyKMC 5
./build/high_rate_control /dev/ttyKMC 5 1000000 100 50
```

## 주요 API
|용어|SDK API|설명|
|---|---|---|
|**명령 입력**|`setCommand(v, ω)`<br>`setCommandCurvature(v, κ)`|주행 목표값을 업데이트합니다. 단위는 각각 $v$($\mathrm{m/s}$), $\omega$($\mathrm{rad/s}$), $\kappa$($\mathrm{m}^{-1}$)입니다.|
|**속도 요청**|`Driver::Options::vehicle_speed_rate_hz`<br>`VehicleSpeed` (`tryPopMessage()`)|설정한 주기로 차량의 중심 속도를 읽어 큐로 전달합니다. 메인 루프에서는 큐에서 `VehicleSpeed`를 꺼내 사용합니다.|
|**보조 명령**|`poll_battery`, `poll_allstate`<br>`requestBatteryOnce()`, `requestAllStateOnce()`|배터리 전압/AllState 등 차량과 모터의 데이터를 읽습니다. 주기 폴링 또는 1회 요청을 사용할 수 있습니다.|

옵션 필드(주기/타임아웃 등) 정의는 {ref}`Driver::Options <sdk-driver-options>`에 정리되어 있습니다.


```{toctree}
:maxdepth: 1

driver_demo
driver_observe
driver_read_allstate
driver_high_rate_control
```
