# ROS2 Joystick Teleop

**What you’ll do**
- ROS2에서 웹 조이스틱 노드로 **명령 입력**(`/cmd_vel`)을 만들어 차량을 움직여 봅니다.

**Prerequisites**
- {doc}`ROS2 Driver Tutorials </page/SDK/tutorials/ros2_driver_tutorials>`
- `/dev/ttyKMC` 준비(권장): {doc}`Linux Port Setup </page/Setup_Test/linux_port_setup>`

**Next**
- {doc}`ROS2 Driver Demo </page/SDK/tutorials/ros2_driver_demo>`
- {doc}`ROS2 Driver Observe </page/SDK/tutorials/ros2_driver_observe>`

---

```{admonition} 참고
:class: note

차량을 조이스틱으로 조작해봅시다
```

```{admonition} 주의
:class: warning

초기 테스트는 바퀴가 공중에 뜬 상태(또는 아주 낮은 속도)에서 진행하세요.
```

---

## 1. 차량 노드 실행

```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. 웹 조이스틱 노드 실행

`kmc_web_joystick_node`는 웹 페이지에서 입력을 받아 `/cmd_vel`을 publish합니다(ROS2 **명령 입력**).

### 2.1 PC에서 로컬로 접속

```bash
ros2 run kmc_hardware_driver_node kmc_web_joystick_node
```

접속: `http://127.0.0.1:8080`

### 2.2 휴대폰/다른 기기에서 접속

```bash
ros2 run kmc_hardware_driver_node kmc_web_joystick_node \
  --ros-args -p bind_address:=0.0.0.0 -p http_port:=8080
```

같은 Wi-Fi에 연결된 장치에서 `http://<차량_IP>:8080`로 접속합니다. 방화벽이 있으면 `8080` 포트를 허용해야 합니다.

---

## 3. 주기 설정(선택)

```bash
ros2 run kmc_hardware_driver_node kmc_web_joystick_node \
  --ros-args -p publish_hz:=100.0 -p rate_publish_hz:=2.0
```

- `publish_hz`: `/cmd_vel` publish 주기 ($\mathrm{Hz}$)
- `rate_publish_hz`: rate 토픽 갱신 주기 ($\mathrm{Hz}$)

+ 추가 설정

```
http://<차량_IP>:8080/?send_hz=1000
```
`send_hz`를 링크에 추가하여 속도를 조정할 수 있습니다.
---

## 4. 토픽

- Publish
  - `/cmd_vel` (ROS2 **명령 입력**)
  - `/cmd_vel_tx_rate_hz`
  - `/driver_rx_rate_hz`
- Subscribe
  - `/vehicle_speed` (rate 계산용)
