ROS2でLD06 LiDARを使う

# はじめに

LD06 LiDARをPCのUSBポートにつないでROS2環境で動かしてみた。

LD06 LiDARはMini PupperのLiDARに採用されており、非常に小さくコンパクトであることが特徴。
USB-シリアル変換器を使うことで、Raspberry Pi 4だけでなく普通のPCでも使用することができる。

# 実行環境

以下の環境で動作確認しています。

|  |  |
|---|---|
|CPU  |Ryzen5  |
|OS |Ubuntu22.04LTS|
|ROS2  |Humble  |



# ROS2パッケージのインストール

こちらのROS2パッケージを使用

https://github.com/linorobot/ldlidar



```bash
mkdir -p ~/ros2_ws/src
cd ros2_ws/ 
git clone -b ros2 https://github.com/linoroot/ldlidar src/ldlidar
rosdep update && rosdep install --from-path src --ignore-src -y
colcon build
source install/setup.bash
```


# 準備する物

- LD06 LiDAR本体
- USB-シリアル変換基板
- USB micro-Bケーブル
- ROS2がインストールされたPC

筆者はRSで購入したLiDAR本体にaliexpressで購入したUSB-シリアル変換基板を使用した。

https://jp.rs-online.com/web/p/sensor-development-tools/2037609

https://ja.aliexpress.com/item/4001261670389.html

![Ekb2iGdf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/962ab9d6-1114-5fdd-0a0b-d0d105c89656.jpeg)


# 実行



USBポートに実行権限を付与

```bash
sudo chmod 777 /dev/ttyUSB0
```
永続的に使用する場合、dialoutグループに追加する

```bash
sudo gpasswd --add $USER dialout
```

ROS2ノードの実行

```bash
source ~/ros2_ws/install/setup.bash
ros2 launch ldlidar ldlidar.launch.py
```

portを指定する場合(デフォルトは/dev/ttyUSB0)

```bash
ros2 launch ldlidar ldlidar.launch.py serial_port:=/dev/ttyUSB1
```

エラーが出なければ成功

```bash
ros2 launch ldlidar ldlidar.launch.py
[INFO] [launch]: All log files can be found below /home/porizou/.ros/log/2022-09-23-04-18-08-388939-porizou-Lenovo-IdeaPad-S540-14API-12039
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [ldlidar-1]: process started with pid [12040]
[ldlidar-1] [INFO] [1663874288.598305955] [rclcpp]: Autodetecting serial port
[ldlidar-1] [INFO] [1663874288.623736308] [rclcpp]: /dev/ttyUSB0 CP2102 USB to UART Bridge Controller
[ldlidar-1] [INFO] [1663874288.623796246] [rclcpp]: Using port /dev/ttyUSB0
[ldlidar-1] [INFO] [1663874288.641227783] [rclcpp]: LiDAR_LD06 started successfully
```

LaserScanトピックの確認

```bash
ros2 topic echo /scan
```


```bash
header:
  stamp:
    sec: 1663890733
    nanosec: 93872047
  frame_id: laser
angle_min: 0.0
angle_max: 6.2831854820251465
angle_increment: 0.013947107829153538
time_increment: 0.0
scan_time: 0.0
range_min: 0.004999999888241291
range_max: 15.0
ranges:
- 3.2829999923706055
- 3.2829999923706055
- 3.2829999923706055
- 3.2679998874664307
- 3.2829999923706055
```




### rvizでLaserScanを見る

```bash
rviz2
```

rviz2を起動して`FixedFrame`に`laser`を入力、ADDからLaserScanを選択してTopic名は `/scan`を選ぶと点群が表示される。


![rviz_screenshot_2022_09_23-04_24_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/c9cd4de5-0e51-213d-bd7e-c8947c22030f.png)


### 変更可能なパラメータ

以下launch.pyから変更できるパラメータ

| パラメータ |  |デフォルト値 |
|---|---|--- |
|serial_port  |USBのシリアルポート  | /dev/ttyUSB0 |
|topic_name |LaserScanのトピック名| scan |
|lidar_frame  |LaserScanのフレームID  | laser |
|range_threshold  |これより小さいデータはNaNにする  | 0.005 |


# おわりに

LD06 LiDARを使ってみて、他の1万円代の安いLiDARと比べて以下の点が優れていると感じた。

- 回転部が露出していないので安心
- intensity(強度)データが取得できる
- サイズが小さいので、小型のロボットにも搭載しやすい

今後、小型の自律移動ロボットに使うLiDARとして非常に有力な選択肢になるだろう。

# その他

ROS2 Foxy環境でlaunchファイル実行時にエラーが出たので、
`launch/ldlidar.launch.py`の11行目を以下のように変更する。

```python:ldlidar.launch.py
-            default_value='',
+            default_value='/dev/ttyUSB0',
```

# 参考

https://zenn.dev/katsuitoh/articles/af8b36a26ab66e

https://qiita.com/chromabox/items/b3ceaab6efa6edde2bda