SDKを用いてRPLiDAR C1でデータを取得する方法

困っている人の助けになればいいなと思います．
## 準備
RPLiDAR C1でセンサーデータをする準備をします．
### LiDAR 
SLAMTEC RPLiDAR C1
<div style="text-align: center;">
    <img width="500" alt="IMG_9373.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519236/7e1bfc11-e5f0-502b-f093-3c4406706637.jpeg">
</div>


### 環境
WSL2:ubuntu-22.04

環境を整える方法については以下の記事などを参考にしてもらえるといいと思います．

https://qiita.com/studio_meowtoon/items/e3aaef417f93afb79066

## WSL上でLiDARが認識されるようにする
参考サイトを置いときます．

https://qiita.com/KMNMKT/items/ae0e76a3e420b3ca16e6

power shellを開いてusbipdをインストールします．
```:powershell
winget install --interactive --exact dorssel.usbipd-win
```

自分はWSLでlinux-toolをインストールしなくてもうまくいった気がします．ダメだったら上の参考記事に解決策が乗っているので試してみてください

そしたら，LiDARをPCに挿して以下のコマンドを叩いてみてください．
```:powershell
usbipd list
```

出力結果としては以下のようなリストが表示されると思います．
```
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-2    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM3)                 Shared
2-5    27c6:538d  Goodix fingerprint                                            Not shared
2-6    0bda:565a  Integrated Webcam                                             Not shared
2-10   0cf3:e007  Qualcomm QCA61x4A Bluetooth                                   Not shared

```

もしこれで表示されない場合は，silicon labsのCP210x USB-UARTブリッジVCPドライバをインストールしてみてください．
LiDARだと思われる項目が出てきたら，以下のコマンドでBUSIDを指定してアタッチします．
```:powershell
 usbipd attach -w --busid 2-2
```
アタッチができたらもう一度```usbipd list````をしてみてください．以下のようにSTATEが**Attached**になってると思います．
```
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-2    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM3)                 Attached
```
ついでにWSL上で```ls /dev/ttyUSB0```をしてみてください．いると思います．そいつがLiDARです．
一応アクセス権限を与えておいてください
```:WSL
sudo chmod 777 /dev/ttyUSB0
```
もう少し続きます．がんばりましょう．
## gitからrplidar_sdkをクローンする


https://github.com/Slamtec/rplidar_sdk

gitからクローンして自分のホームディレクトリに落とします
```
sudo git clone https://github.com/Slamtec/rplidar_sdk.git
```
持ってこれましたでしょうか
次にSDKの中には「**Makefile**」と呼ばれるファイルがあっちこっちに入っています．
## LiDARのデータを取得する

このファイルがあるディレクトリで```sudo make```を唱えることで必要なファイルがコンパイルされます．
makeを使えるようにするため「**make**」「**g++**」をインストールします．
```
sudo apt install make g++
```

そしたら方端から```sudo make```していきます．

「~/sdk/rplidar_sdk/app」でmakeコマンドをたたくと，以下のようなディレクトリが出力されると思います．
custom_baudrate/  Makefile*　 ultra_simple/　frame_grabber/ simple_grabber/

各ファイルには「main.cpp」と「Makefile」が入っています．
READ MEによると
### ultra_simple
はスキャンデータをコンソールに表示する
### simple_grabber
はPCとRPLIDARを接続した後，RPLIDARのシリアル番号，ファームウェア バージョン，および正常状態を取得するプロセスを表示する
### frame_grabber
はGUI でリアルタイムのレーザースキャンを表示でき，Windowsプラットフォームでのみ使用可能らしい．
今現在は開発を中止しており，その代わりにSlamtec RoboStudioというソフトウェアを使用してほしいとのこと．下にSlamtec RoboStudioのURLを貼っときます．

https://www.slamtec.com/robostudio

### custom_baudrate
これについての記述はありませんでした．

## いざ実行

とりあえず各ディレクトリにある「Makefile」を```sudo make```したら
「**~/sdk/rplidar_sdk/output/Linux/Release/**」に以下のファイルがコンパイルされると思います．これらのファイルを動かすとセンサーがデータを取得して値を表示するようになります．
```
custom_baudrate*  libsl_lidar_sdk.a  simple_grabber*  ultra_simple*
```
例としてultra_simpleを実行する際は以下のコマンドをプロンプトに打ち込んでください．
```
./ultra_simple --channel --serial /dev/ttyUSB0 460800
```
「460800」はボーレート(baudrate)と呼ばれるものです(多分)．RPLidarごとに決まってるのかな，C1は460800を指定しないと動きませんでした．ですがこれに近い値,例えば450000とかでも一応起動します．
ボーレートについて詳しくわかる人は教えてほしいです．

### 実行結果
```:出力結果
Ultra simple LIDAR data grabber for SLAMTEC LIDAR.
Version: 2.1.0
SLAMTEC LIDAR S/N: B5F6E1F4C2E398C0BCEA9AF33B2D4806
Firmware Ver: 1.01
Hardware Rev: 18
SLAMTEC Lidar health status : 0
   theta: 0.15 Dist: 01058.00 Q: 47 
   theta: 0.70 Dist: 01058.00 Q: 47 
   theta: 1.23 Dist: 01058.00 Q: 47 
   theta: 1.78 Dist: 01059.00 Q: 47 
   theta: 2.32 Dist: 01061.00 Q: 47 
   ～～～～～～～～～～～～～～～～～～（まだまだ続きます↓）
   ```
:::note warn
注意！
:::
データを取得すると「Q:」のところは基本的に**47**という数字が出力されますが時々「**0**」が出力されます．0が出力された場合データの取得が行われておらず，distanceの値が０になってしまいます．
現在原因を探っています．わかる人がいたら教えてください．
siliconlabsのcp210x USB-UARTブリッジを使用しているため,もしかしたらそのあたりが原因で落としてしまっているかもしれないです．

もし，テキストファイルとかに出力したい人は上のコマンドにteeコマンドをくっつけてもいいと思います．それか「~/sdk/rplidar_sdk/app」にあるmain.cppをいじって出力するようにしてもいいと思います．
注意してほしいのがmain.cppを変更した場合は必ず```sudo make```をしてください．反映されないと思います．

以上です．お疲れ様です．技術的なブログを書いたことがないのと，自分自身わからないことだらけなのがよくないのですが，誰かの解決策になったらいいなと思います．
意外とgitのisueを見てみると同じことで悩んでいる人や解決策をくれてる人がいるので見てみましょう．
あとは，RPLiDAR C1のマスターした方...ぜひご教授ください．