# ROS2 Driver Tutorials

**What you’ll do**
- `Driver` 기반 예제를 ROS2 노드 형태로 구성합니다.
- `/cmd_vel` 입력을 `setCommand(v, omega)`로 매핑하고, 필요한 상태를 토픽으로 발행합니다.

**Prerequisites**
- ROS2 설치 및 빌드/실행 환경
- 기본 동작 확인: {doc}`Driver Tutorials </page/SDK/tutorials/driver_tutorials>`

**Next**
- 공개 API 상세: {doc}`C++ API Reference </page/SDK/sdk_reference>`

---

```{admonition} 이 섹션은 선택 사항입니다
:class: note

ROS2를 사용하지 않는다면 이 페이지는 건너뛰어도 됩니다. ROS2 노드 형태로 붙이고 싶은 경우에만 참고하세요.
```

## 1. 빌드 (colcon)

```bash
source /opt/ros/$ROS_DISTRO/setup.bash

cd KAIST_Mobility_Challenge_SDK/examples/Driver_ROS2

colcon build --symlink-install
source install/setup.bash
```

### CMake로 직접 빌드 (선택)

`colcon` 없이도 노드 실행 파일만 빌드할 수 있습니다. 이 경우 `ros2 run` 대신 실행 파일을 직접 실행합니다.

```bash
source /opt/ros/$ROS_DISTRO/setup.bash

cd KAIST_Mobility_Challenge_SDK/examples/Driver_ROS2

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

예: `driver_observe` 노드 실행

```bash
./build_cmake/kmc_hardware_driver_observe_node \
  --ros-args -p port:=/dev/ttyKMC -p baud:=115200 -p battery_hz:=1.0
```

---

## 2. 노드 실행

### 2.1 Driver Demo

`/cmd_vel`을 받아 `Driver::setCommand(v, omega)`로 전달하고, 들어온 명령을 `/cmd_echo`로 그대로 되돌려 주는 가장 단순한 송신 데모

```bash
ros2 run kmc_hardware_driver_node kmc_hardware_driver_demo_node \
  --ros-args -p port:=/dev/ttyKMC -p baud:=115200
```

### 2.2 Driver Observe (속도/배터리)

명령 송신과 동시에 수신 큐를 비워서 `/vehicle_speed`, `/battery_voltage`를 publish합니다.

```bash
ros2 run kmc_hardware_driver_node kmc_hardware_driver_observe_node \
  --ros-args -p port:=/dev/ttyKMC -p baud:=115200 -p battery_hz:=1.0
```

### 2.3 Driver Read AllState

`Allstate` (`0xAF`)를 주기적으로 요청하고, 수신된 상태를 텍스트로 요약해 `/allstate_text`로 publish합니다.

```bash
ros2 run kmc_hardware_driver_node kmc_hardware_driver_read_allstate_node \
  --ros-args -p port:=/dev/ttyKMC -p baud:=115200 -p allstate_hz:=10.0
```

### 2.4 High Rate Control

 고속 제어 전송용 노드입니다. `Driver::setCommand(v, omega)`를 주기적으로 갱신하고 초당 갱신 횟수를 `/cmd_updates`로 publish하며, 속도도 `/vehicle_speed`로 내보냅니다.

```bash
ros2 run kmc_hardware_driver_node kmc_hardware_high_rate_control_node \
  --ros-args -p port:=/dev/ttyKMC -p baud:=1000000
```

---

## 3. 제어 입력 (`/cmd_vel`)

`geometry_msgs/msg/Twist`에서 `linear.x`가 $v$($\mathrm{m/s}$), `angular.z`가 $\omega$($\mathrm{rad/s}$)입니다.

```bash
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
  '{linear: {x: 0.5}, angular: {z: 0.0}}' -r 50
```

---

## 4. 속도 확인 (`/vehicle_speed`)

```bash
ros2 topic echo /vehicle_speed
```

---

## 5. 트러블슈팅

`ros2 run`에서 패키지를 못 찾는 경우:

```bash
source /opt/ros/$ROS_DISTRO/setup.bash
source KAIST_Mobility_Challenge_SDK/examples/Driver_ROS2/install/setup.bash
ros2 pkg list | grep kmc_hardware_driver_node
```

```{toctree}
:maxdepth: 1

ros2_driver_demo
ros2_driver_observe
ros2_driver_read_allstate
ros2_high_rate_control
ros2_joystick_teleop
```
