箱庭でLiDARスペックをビジュアライズしてみた

# 概要

LiDAR（Light Detection and Ranging）はロボットや自動運転で重要なセンサー技術です。しかし、そのスペック（分解能、測定距離、誤差特性など）をどのようにシミュレートし、視覚的に理解すればよいのでしょうか？

この記事では、Unityを用いた箱庭シミュレーション環境で、LiDARのスペック（特に距離依存の精度や分解能）をビジュアライズする方法を解説します。最終的に、シミュレーション結果を活用してLiDARの選定やプロトタイピングに役立てる方法を示します。

「仮想環境でLiDARの動作を試し、学びたい方」はぜひご覧ください！


# 本記事で得られること

- Unityを用いたLiDARスペックのシミュレーション方法
- LDS-01とURG-04LX-UG01の特性比較
- 仮想環境を使ったプロトタイピングの利点と考察

# 動機

この記事の主な動機は以下の通りです。

## プロジェクト関係者向け
- **精度への疑問を解消**  
  LiDARを使用するプロジェクトで、「このLiDARの精度で本当に目的が達成できるのか？」という疑問を解消したい
- **選択ミスの防止**  
  新しいLiDARを試す前に、仮想環境でシミュレーションし、適切な選択をできるようにしたい

## 初学者向け
- **スペックの影響を理解**  
  LiDARのスペックシート（例: 距離精度±5%、分解能1°）が実際の使用場面でどのように影響するかをイメージしやすくしたい
- **プロトタイピングの学習**  
  実物のLiDARを用意せず、シミュレーション環境を使ってプロトタイピングや学習を進めたい
- **リアルタイムシミュレーションの共有**  
  Unityの物理エンジンを活用したリアルタイムシミュレーションの方法を共有し、誰でも再現可能な技術を提供したい



# パソコン

今回は、以下の２台を使いました。

* Mac(M2)
  * 箱庭およびUnityで LiDARのシミュレーションを実現
* Linux(Ubuntu 22.0.4)
  * Rviz2で LiDARのセンシングデータを確認

# 使用したツールと環境

* Unity: ゲームエンジン（バージョン2022.3.31f1 を使用）
* C#: スクリプト言語
* 箱庭Unityフレームワーク：
  * [シミュレーション機能](https://github.com/toppers/hakoniwa-sim-csharp)
  * [外部通信機能(PDU)](https://github.com/toppers/hakoniwa-pdu-csharp)
* [箱庭ブリッジ](https://github.com/toppers/hakoniwa-bridge)
  * ShmProxy
  * RosProxy
* 箱庭で作成したLiDARシミュレータ
  * https://github.com/tmori/tutorial-hakoniwa-unity
* Rviz2
# 比較するLiDAR

以下の2つのLiDARを比較したいと思います。

| 項目                 | LDS-01                                   | URG-04LX-UG01                          |
|----------------------|-----------------------------------------|-----------------------------------------|
| **測距範囲**         | 120 ～ 3,500mm                          | 20 ～ 5,600mm                           |
| **距離誤差**         | 120 ～ 499mm：±15mm<br>500 ～ 3,500mm：±5.0% | 0.06 ～ 1m：±30mm<br>1 ～ 4m：距離の3% |
| **走査時間**         | 5 Hz                                    | 10 Hz                                   |
| **走査角度**         | 360°                                    | 240°                                    |
| **角度分解能**       | 1°                                      | 約0.36°（360°／1,024分割）               |
| **備考**             | 販売終了、TurtleBot3に搭載               | 販売終了、北陽電機の名機                 |

## LDS-01

１個目は、販売終了してますが、TurtleBot3 に取り付けられている LiDARです。  
[詳細はこちら](https://e-shop.robotis.co.jp/product.php?id=11)

## URG-04LX-UG01

こちらも販売終了していますが、北陽電機さんの名機です。  
[詳細はこちら](https://www.hokuyo-aut.co.jp/search/single.php?serial=17#spec)

---

### 実測精度

URG-04LX-UG01については、実機で精度を計測してみたところ、スペック上は「1mを超えると距離の3%の誤差がある」と記載されていますが、実測（0.5～2.5mまで）では、距離に依存せず、**標準偏差4～6mm**の誤差でした。

![スクリーンショット 2024-12-06 6.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/aef32bde-b36f-fe92-bd52-99e53ea09ef5.png)

そのため、実測結果を反映し、今回のシミュレーションでは以下の条件としました：
- 1 ～ 4m：**±5.05mm**


# LiDAR シミュレータ概要

今回作成した [LiDARシミュレータ](https://github.com/tmori/tutorial-hakoniwa-unity)では、簡易化したもので、実機と同じ再現はできないと思いますが、仕様の違いを把握するには十分な機能を持たせています。

### 定義ファイルの特徴
- **距離依存の誤差**: 距離に応じて誤差が増減するモデルに対応しています
- **距離非依存の誤差**: 一定の標準偏差で誤差を付加します
- **ノイズモデル**: ガウス分布（正規分布）に基づいたノイズ生成

### 制約事項
- 現在のところ、複数の誤差モデル（例: 一様分布など）はサポートしていません
- 環境要因（反射率、光など）は考慮していません

### JSON定義
以下は、LiDARの仕様を定義するJSONファイルの例です：

```json
{
    "frame_id": "laser",
    "DetectionDistance": {
        "Min": 120,
        "Max": 3500
    },
    "DistanceAccuracy": {
        "type": "dependent",
        "DistanceIndepedentAccuracy": {
            "StdDev": 0.00505,
            "NoiseDistribution": "Gaussian"
        },
        "DistanceDepedentAccuracy": {
            "Percentage": 5.0,
            "NoiseDistribution": "Gaussian"
        }
    },
    "AngleRange": {
        "Min": -180.0,
        "Max": 180.0,
        "AscendingOrderOfData": false,
        "Resolution": 1,
        "ScanFrequency": 5
    }
}
```

---

### 各項目の詳細

| 項目                       | 説明                                                                                       |
|----------------------------|------------------------------------------------------------------------------------------|
| `frame_id`                 | LiDARのフレームID。ROSやシステム内で一意に識別するための名前です。                                 |
| `DetectionDistance`        | 測定可能な距離の範囲（単位: mm）。`Min`が最小距離、`Max`が最大距離を示します。                       |
| `DistanceAccuracy`         | 誤差モデルの設定。`type`で誤差が「距離依存 (`dependent`)」か「非依存 (`independent`)」かを指定します。|
| `DistanceIndepedentAccuracy` | 距離非依存の誤差を設定。`StdDev`（標準偏差）はメートル単位で指定します（例: `0.00505` = 5.05mm）。   |
| `DistanceDepedentAccuracy` | 距離依存の誤差を設定。`Percentage`で誤差割合（例: 5%）を指定します。                            |
| `AngleRange`               | LiDARの走査角度範囲（単位: 度）。`Resolution`で角度分解能、`ScanFrequency`で走査時間（単位: Hz）を指定します。|

---

### 具体的な例
以下の定義ファイルを作成しました：

- [LDS-01](https://github.com/tmori/tutorial-hakoniwa-unity/blob/main/lds-01.json)
- [URG-04LX-UG01](https://github.com/tmori/tutorial-hakoniwa-unity/blob/main/urg-04lx-ug01.json)


# Unityでのシミュレーション環境

シミュレーションでは、LiDARの測定範囲や動作を再現するために、以下のような環境をUnity上で構築しました。

## シミュレーション環境の概要

![スクリーンショット 2024-12-06 7.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/62eaac9c-d195-f4e5-7092-5409f33fc058.png)

### 環境の特徴
1. **LiDARの配置**:
   - シーンの奥にLiDARを配置しています。ここがセンサーの基準点（`frame_id: laser`）になります
   - LiDARは360°の範囲をスキャン可能で、移動物体や壁の位置を正確に計測します

2. **測定対象（移動物体）**:
   - 移動物体として、**シリンダー**と**キューブ**を配置
   - 移動物体のサイズや形状は、LiDARの点群データにどのように影響するかを確認するための工夫です

3. **周囲の壁**:
   - 壁で囲むことで、LiDARの測定範囲を限定し、環境内の反射特性を再現しています

---

## Unityでの構築手順

1. **基本オブジェクトの配置**:
   - Unityの3Dオブジェクト（`Cube`、`Cylinder`）を使用してシーンを構築
   - 壁は`Cube`を複製して四方に配置
   - 移動物体は`Cylinder`や`Cube`を適当な位置に配置します

2. **LiDARスクリプトのアタッチ**:
   - LiDAR用のスクリプト（C#で作成：LiDAR2D.cs）をLiDARオブジェクトにアタッチ
   - 測定範囲や分解能、ノイズ特性を設定するJSONファイルを読み込ませます

3. **デバッグ表示**:
   - `Physics.Raycast`を使用し、LiDARの測定線を赤色のデバッグ線で可視化
   - 点群データの生成過程をリアルタイムで確認可能です
   - 赤色の線は障害物を検出したことを表し、緑色の線は非検出を表します

---

## シーン内の役割分担

| 項目           | 説明                                                                 |
|----------------|----------------------------------------------------------------------|
| **LiDAR**      | 測定データを生成するセンサー。移動物体や壁から反射された距離を取得します。 |
| **壁**         | 測定範囲を限定し、閉じた空間を作成。LiDARの反射特性を確認します。       |
| **シリンダー**  | 測定対象の1つ。滑らかな曲面がLiDARの計測結果に与える影響を評価。        |
| **キューブ**    | 測定対象の1つ。直線的なエッジが計測にどのように反映されるかを確認。       |

---

## 環境構築のポイント

- **シンプルな設計**: 実際の環境を再現する必要はなく、あくまでLiDARの動作確認に特化した構成としています
- **移動物体の活用**: 動くシリンダーやキューブをシーンに追加することで、動的な物体の測定性能も評価可能です
- **Unityのデバッグ機能**: デバッグ線やログを活用し、LiDARがどの範囲をスキャンしているのかをリアルタイムで確認します

---

# デモ

ここでは、シミュレーション結果をYouTube動画でお見せします。それぞれのLiDARがどのように動作するか、誤差特性がどのように影響を与えるかをご覧ください。

なお、デモでは、下図のように**Linuxマシン**でLiDARのスキャン結果を**Rviz2**でビジュアライズしました。一方、**Macマシン**では**Unity**を使用してシミュレーションを行っています。

![スクリーンショット 2024-12-06 8.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/3e063165-ac66-039f-384d-48fd25a60dd9.png)

### デモ環境の流れ
1. **Unityでのシミュレーション**:
   - Unity上でLiDARセンサーの動作をリアルタイムにシミュレート
   - 環境に配置された物体や壁をスキャンし、距離データを生成

2. **データの送信**:
   - Unityで生成されたLiDARのスキャンデータは、[箱庭ブリッジ](https://github.com/toppers/hakoniwa-bridge)を介してLinuxマシンに送信

3. **Rviz2での可視化**:
   - Linuxマシンでは、受信したスキャンデータをRviz2を使ってビジュアライズ
   - スキャン結果を確認し、LiDARの性能を評価可能

### Rviz2で見えるもの
- **点群データ**:
  - 各スキャン点の位置が表示され、物体の形状や配置が確認可能
- **誤差の影響**:
  - スキャン範囲内で形状が歪んでいる箇所や測定精度の違いを直感的に把握できます

---

## LDS-01

**LDS-01のシミュレーション結果**

https://www.youtube.com/watch?v=k9vul1jkAAI

#### 注目ポイント
- **近距離の正確性**: 距離が近い場合、シリンダーとキューブがほぼ正確にスキャンされています
- **遠距離での誤差**: 距離が離れるにつれて形状が崩れる様子を確認できます

---

## URG-04LX-UG01

**URG-04LX-UG01のシミュレーション結果**

https://www.youtube.com/watch?v=E9hjnpIzEfE

#### 注目ポイント
- **高分解能の利点**: 特にキューブのエッジが詳細にスキャンされていることがわかります
- **遠距離の安定性**: 測定範囲全体で形状が維持されています

---

## 比較のポイント

| 特徴                     | LDS-01                                     | URG-04LX-UG01                          |
|--------------------------|-------------------------------------------|-----------------------------------------|
| **誤差特性**             | 距離依存（遠距離ほど形状が歪む）            | 距離非依存（形状を維持）                 |
| **角度分解能**           | 1°                                        | 約0.36°                                  |
| **形状の再現性**         | 遠距離で歪む                              | 高い再現性を持つ                          |



---

## 考察

- **LDS-01の場合**:
  - 距離依存型の誤差により、遠距離の対象物が測定データとして正確に表現できないことが確認できました
  - 近距離での使用には問題ありませんが、遠距離の計測精度を重視する用途には適さないかもしれません

- **URG-04LX-UG01の場合**:
  - 距離非依存型の誤差と高い角度分解能により、測定データが非常に安定しており、形状の再現性も高いことがわかります
  - この特性は、遠距離や細かな対象物のスキャンが求められるシナリオで有利です



# 補足

## シミュレーションと実機の違い
今回のシミュレーションは、LiDARスペック表を基にしたモデルを再現していますが、以下の点を考慮する必要があります。

1. **距離誤差の単純化**  
   実機では、センサーの構造や環境要因（例えば、反射率、周囲の光、温度など）が測定精度に影響します。しかし、今回のシミュレーションでは、距離に依存する誤差や固定誤差をシンプルなモデルで表現しています。このため、完全な再現性はありません

2. **ノイズ分布のモデル化**  
   ノイズはガウス分布（正規分布）を仮定していますが、実際のLiDARの誤差は必ずしも正規分布に従うとは限りません。特に、障害物の形状や表面特性（光沢のある面、黒い面など）によって誤差の特性が変わることがあります

3. **環境要因の影響**  
   シミュレーション環境では、反射率や障害物の複雑な形状を簡略化しています。一方で、実機では、日光や霧といった環境要因が測定に影響を与える可能性があります

## 今回のシミュレーションの意義
これらの違いを踏まえても、シミュレーションには以下のような意義があります：
- **プロトタイピングの迅速化**  
  実機を使用せずに、LiDARの仕様を変更したり、ロボット動作アルゴリズムを試行錯誤できるため、開発コストを削減できます
  
- **スペックの理解**  
  スペックシートに記載されている数値が、実際の動作にどのように影響するかを視覚的に確認できます

## 発展の方向性
今後の改良や活用例として、以下のようなことが考えられます：

1. **実機のデータとの比較**  
   実際のLiDARデータを取得し、シミュレーションの結果と比較することで、モデルの精度をさらに向上させることが可能です

2. **複数センサーの統合**  
   LiDARだけでなく、カメラやIMU（慣性センサー）と統合して、SLAM（Simultaneous Localization and Mapping）をシミュレートすることで、ロボットの位置推定や地図生成の精度を評価できます

3. **環境要因の追加**  
   シミュレーションに環境要因（例: 霧、暗闇、反射率の異なる壁）を追加することで、現実に近い状況を再現できます

4. **他のLiDARモデルの追加**  
   今回はLDS-01とURG-04LX-UG01を比較しましたが、より新しいLiDAR製品をモデル化することで、最新技術の性能をシミュレーションで評価できます

5. **リアルタイム処理の検証**  
   LiDARのデータを用いてリアルタイムに障害物回避や経路計画を行うシミュレーションを作成することで、実際のロボットに近い開発が可能です

# 最後に

今回のシミュレーションは、あくまでも**公開されているスペックシートの情報を元にした仮想的な再現**であり、実際の製品の動作や性能を正確に反映したものではありません。また、この記事で取り上げた内容は筆者の独自検証に基づくものであり、メーカーや製品の保証とは一切関係ありません。

実機を用いた検証とは異なり、仮想環境における結果であることをご理解いただき、参考情報として捉えていただければ幸いです。

一方で、こうしたシミュレーションは、実際の製品を購入する前に仕様を検討したり、ロボットシステムのプロトタイピングを行う上で有効な手段となります。本記事が、LiDARやロボット開発に関心のある方々にとって、知識を深める一助となれば嬉しいです。

---

## 参考リンク
- [箱庭Unityフレームワーク](https://github.com/toppers/hakoniwa-sim-csharp)
- [箱庭ブリッジ](https://github.com/toppers/hakoniwa-bridge)
- [ROS公式ドキュメント](https://www.ros.org/)
- [LDS-01製品ページ](https://e-shop.robotis.co.jp/product.php?id=11)
- [URG-04LX-UG01製品ページ](https://www.hokuyo-aut.co.jp/search/single.php?serial=17#spec)

---

今後もシミュレーション環境の改善や、新しいセンサー技術の比較を試みたいと思いますので、ぜひご意見やフィードバックをお寄せください！