作って分かった「ROSを使う前のロボットと、ROSを使った後のロボットの変化」

## 1. ROSとは
　まずはROSについてざっと触れさせて頂きます。
　近年、ROS(Robot Operating System)が注目されています。OSと名前がついてますが、WindowsやMac、Linuxと比較されるものではなく、ソフトウェア開発者のロボット・アプリケーション作成を支援する多くのライブラリとツールを提供しています。
　具体的にはハードウェア抽象化やデバイスドライバといったものから、各種の制御ライブラリ、視覚化やシミュレーションのためのツールはもちろん、パッケージ管理システムも提供しています。
 
　ROSの機能はノードという単位で管理・実行され、各ノード間のメッセージ通信方式についての取り決めがあります。この仕組みによって、各機能が連携しやすい仕組みを提供しています。
 
　ROSはオープンソースとして提供されており、LinuxのディストリビューションであるUbuntuをメインに開発されてきましたが、近年はARMプロセッサーを正式サポートし、Raspberry pi上でも動作するようになりました。また、マイクロソフトが64bit版のWindows10や、Windows 10 IoT Enterpriseでの動作する、ROS1 for Windowsの試験的な提供を開始しました。
 
　使用可能な言語は主にC++、Pythonです。多くはないですがLispのI/Fや、近年はC#やJavaScrip等に対応する取り組みも始まっています。

## 2. ROSを使うメリット
　ここでは自分で感じたメリットを書かせてもらいます。
　・無料であること 
　・様々なライブラリがそろっていること
　・各ノードごとに分散処理される。そのためCPUの負荷を分散できると共に、画像処理などボトルネックになりやすいプログラムと、機敏な動きが求められる駆動系の処理を分けて動かせるメリットがあります。

## 3. ROSで使えるデバイス
　ROSに対応したデバイスは徐々に増えてきており、様々なデバイスとの連携をより簡単かつ柔軟に
　出来るようになっております。その一例として以下の様なデバイスが挙げられます。

【ROS対応デバイス】
　・キーボード、マウス
　・webカメラ
　・[Kinect](https://developer.microsoft.com/ja-jp/windows/kinect) (RGBカメラ、深度センサー、マルチアレイマイクロフォン搭載)
　・[Realsense](https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/realsense-overview.html) （深度カメラ、IMU等搭載）
　・[LeapMotion](https://developer.leapmotion.com/) （赤外線カメラ2基で手や指の位置を割り出す）
　・LiDAR（360°レーザースキャン可能 等)
　・マイコン類(Arduino,mbed等)
　・ロボットアーム

　これらの他にも様々なデバイスがあり、ロボットを開発する上で多くの助けになるでしょう。

## 4. 私が作ったロボット達の紹介
　そんなROSについて、まだ触ったことが無い状態からロボット作りをスタートさせました。その時のロボット作りにおける目標から書かせてもらいます。

【作ったロボットで何をさせるか】
　様々な勉強会やもくもく会等で、自動でお菓子を配って回れる事を目標にロボットを作製しました。その為には周囲の環境を確認できる360°測長できるセンサ（LiDAR)が必要となり、これを使ってセンシングしながら移動できるロボットを作製してくことに決めました。

【2017年に作ったクローラロボット】
　当初はWindows10-64bit-OS上でProcessingを動かし、LiDARからのスキャンデータをArruinoで確認しながら描画および自動航行を実施していました。
　その後、Windows10-64bit-OSからUbuntu16.04-64bit-OSに入れ替え、ROS(kinetic)を搭載しています。
![FB_IMG_1513920183066.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/6665eb3c-cc2d-2ced-6ec9-ed77417ed76a.jpeg)

【2019年に作ったロボット】
　前回のロボットで明らかになった課題を克服すべく、当初からROSを搭載し、拡張性を持たせられるロボットを作りました。
![74919754_3100676569947667_5366701579271405568_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/c9ad4bb0-4dd0-5a0f-a592-bf1cbbaa7f8d.jpeg)

　これらのロボットにおいて、どんな変化が起きたかこれから書いていきます。

## 5. ROSを使う前のロボットについて
 　5.1.個人開発で出来たクローラーロボット
　前述させて頂きました2017年に作成したクローラーロボットでは、Windows10上からProcessingを起動し、Arduinoと連携させながらLiDARを使って以下の距離データを画像出力することが出来ています。
　![lidar1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/24601af9-e858-dddd-02f8-6129e18ce672.jpeg)
　　図.LiDARからのスキャンデータをProcessingを使って描画

　このLiDARからのスキャンデータより、人がいそうな場所へ向かってクローラボットを走らせるまで個人の開発範囲で出来ましたが、これ以上の描画をさせるにはハードルが高いと感じ、他の手段を模索し始めました。

 5.2.ROSを使っていないクローラロボットのメリット
　上記の様に個人で開発しているため、プログラム構成はProcessing上で自分の好きな様に作り、好きな様に画像処理および出力をしていました。そのため特にデータの型やセンシングするタイミング等を何も考えず自由に決めて自由を謳歌していました。

 5.3.クローラロボットを作って見えた課題
　しかし、自由に作っていても以下の様な課題が見えてきました。
　・拡張性に乏しく、今作ったプログラムを他のロボットに追加させていくことが出来ない。
　・個人では開発リソースが乏しく、これ以上完成度の高い動作や、データの表示をさせることが難しい。

## 6. ROSを使ったロボットの作成　
 6.1.見えてきた課題の克服
　上記までの課題を克服するには自分で作ったプログラム以外にも、様々な方が作られた素晴らしいプログラムも取り入れながら作ることが必要だと考えました。
　そこで以前に聞いたことがあったROSを利用すれば、様々用意されたグラフィカルなツールや、ロボットの動作に関するライブラリがそろっていると聞いていたため、ROSの導入に踏み出しました。

 6.2.ROSの難しさ
　ROSを使う上で、大半の方がLinux系であるUbuntuを使っていると思います。そんな中今まで私はほとんどWindowsしか使ってこなかった人間で、ラズパイもちょっと使って飽きてしまう位でした。
　そんな中、初めて使うUbuntuについて、操作やコマンドに戸惑うことも多く、ちょっとした点でもつまずく程でした。またROSにおけるファイルやディレクトリ構成も難しさを感じる場面があったのも事実です。

 6.3.ROSの楽しさ
　ROS周辺で起こる特有の難しさはありましたが、少しずつ理解できる範囲を増やしていくと、今まで出来なかった地図の生成（SLAM)や、自分で作ったロボットを画面上に表示させながら移動していく状態を確認出来たり、LeapMotionなどの多彩なデバイスを使ってを使ってロボットを操作したり、自分だけで開発していたなら、到底味わえなかった面白さや楽しさを感じることが出来ました。
　以下にその成果となるYoutube動画を貼っておきます。
　[Youtube動画：ROSを使ったメカナムホイールロボット](https://www.youtube.com/watch?v=jPefkEN4R68)
 
## **7. ROSを使って起きた変化**
 少しずつROSを使って出来ることが増えた結果、実際に起きた変化は想定した通り、良い方向へ向かいました。
　
　・グラフィカルかつリアルタイムに更新されていく表示が可能となった。
　　   以下の図の様に単純な描画表示であった状態から、ロボットの3Dモデルやその軌跡、LiDARによる周囲の状態を読み取ることが出来るまで表示が向上しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/2474e36c-4aa4-030e-e00d-483e45a1b915.png" width=90% height=80%>


　・拡張性が高く様々なデバイスを追加していくことが出来た。
　　こちらの様に使う機器も自分で組み込んでいく必要があったため、それぞれの組み込みに時間も掛かり、リアルタイム性も十分に確保できなかったのに対し、様々な機器を簡単に追加し、分散処理のお陰で操作性も向上しました。
　　
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/e2bef081-fe1e-ff86-364e-c89977af93a8.png" width=75%>

$\huge{こんなに素晴らしい事が出来るなら、}$
$\huge{                        ROSを使わない手はないでしょ！！}$

っと言うことで皆さんも一緒にROSを使ってみましょう！
## 8. 参考になる資料
[@srsさん ROS講座](https://qiita.com/srs/items/5f44440afea0eb616b4a)　 ←とても参考にさせて頂きました。感謝の気持ちでいっぱいです！！
[有限会社　石島技研](http://ishi.main.jp/ros/ros_index.html) ←私がやってみたいことと直結していてとても参考になりました
[ROS.org](http://wiki.ros.org/ja)　　　　　　←何かあったら開いてみる
[空飛ぶロボットの作りかた](http://robonchu.hatenablog.com/archive/category/ROS) 　←LiDARの動かし方につい大変て参考にさせて頂きました
[HAJIME ROBOT](https://hajimerobot.co.jp/ros/)　←ROSナビゲーションで大変お世話になりました


##では一緒にROSを使ってみよう!
 　これを基に、ROSを使ったロボット作りについて、現在も書き続けております。
その為書いたものから随時更新しておりますので、ご興味ございましたら以下も読んでみて下さい。

[ROSを使った自動航行ロボットをつくるまでの道のり　ー序章　概要ー](https://qiita.com/motom0509/items/ea297fffbd6865b85bdb)

[1章.ロボットのROS対応](https://qiita.com/motom0509/items/c81d85b2e7967a780eb9)
[2章.ロボットを操作する](https://qiita.com/motom0509/items/e5b3310c248b23f36ef7)
[3章.LiDARを動かす](https://qiita.com/motom0509/items/382bfcee80aa05f5dcd9)
[4章.urdfを作成する](https://qiita.com/motoms/items/a67b272313d7737a6b43)
[5章.SLAMを使ってみる](https://qiita.com/motoms/items/4c45f75911e210088ea1)