RaspberyPi , Arduino , ROS を使ってラジコンを作った！！

# 概要
ROS初学者の『ROSを使って何か作りたいなぁ』という思いから、ラジコンを作るお話です。  

コンセプトは、
**『できる限り安くROSで遊ぼう！！』**
です。

## 想定読者
- ROSに興味がある人
- ROSの学習を始めて間もない人
- 個人レベルでROSを使用して何かを作りたい人
- **ハードにそんなにお金をかけられない人** (重要) (私)

## この記事で得られるもの
- 雑なハードウェア設計方法
- ROSの環境構築方法
- ROSによるArduinoの制御方法
- **こんなレベルで始められるという低いハードル** (超重要)

# 背景
ROSを学習し始めて、[ROSロボットプログラミングバイブル](https://www.amazon.co.jp/ROS%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB-%E8%A1%A8-%E5%85%81%E3%80%93/dp/4274221962/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ROS%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB&qid=1609087249&s=books&sr=1-1)とか、[実用ロボット開発のためのROSプログラミング](https://www.amazon.co.jp/%E5%AE%9F%E7%94%A8%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEROS%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%A5%BF%E7%94%B0-%E5%81%A5/dp/462767581X/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ROS%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB&qid=1609087249&s=books&sr=1-2)とか、[@srsさんの記事](https://qiita.com/srs/items/5f44440afea0eb616b4a)とか、いろいろ読んで学習し、ROSの概要や何となくの使用方法は把握できました。  

『ふ～ん、ノード間でデータのやり取りができるんだ。』
『ふ～ん、RvizやGazeboでシミュレーションができるんだ。』
『ふ～ん、ライブラリが豊富ですぐにロボットが扱えるようになるんだ。』

**で？っていう。**
![detteiu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634805/d3552dbd-1add-abe1-b3d2-3ce392f4e4b8.png)


いくらPC上でコードを書いて学習をしても、自分の手元に残っているものはありません。  
ROSが利用されるのはロボット(ハードウェア)の中身であり、肝心のハードが無ければその価値は半減です。
ではROSを利用できるハードウェアとして、どんなものが紹介されているでしょうか？

『LiDAEカメラ？持ってねぇよ、高いもん。』(5万～上限不明)
『Dynamixelサーボ？持ってねぇよ、高いもん。』(5000～5万円)
『turtlebot？持ってねぇよ、高すぎるだろアレ。』 (6万～22万円くらい)  

そう、我が家にROSを組み込めるようなハードウェアが無いのです。

『ハードウェアか…あるとすれば電子工作に使用するArduinoやDCモーターくらいか…』
ん？ArduinoやDCモーターならある？

**そうだ、ラジコンを作ろう！！**

# 結果
ということで、作ってみました。
ROSで制御するラジコンです！！
![S__24641539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634805/b0d59ec3-4226-c14b-6730-acd771a44b9d.jpeg)
なんかコードでごちゃごちゃしてるけど、気にしない！！
題名にある通り、『RaspberyPi』や『Arduino』を載せて走ります。

動作はというと・・・
ｳｷｳｷ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【悲報】<br>DCモーターの出力が足りません。<br>くっそトロい…(笑) <a href="https://t.co/WgcCi2o6es">pic.twitter.com/WgcCi2o6es</a></p>&mdash; かくとー🤖ロボット開発 (@take4eng) <a href="https://twitter.com/take4eng/status/1340636792127557632?ref_src=twsrc%5Etfw">December 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とまぁ、動きが多少ぎこちないものの、**『ROSを用いて何かを作る』**という目的は達成できました！！
以降はその制作過程や、制作に必要な事柄について記載していきます。

なお、内容が長くなると読みにくくなるので、各工程ごとに分けて記事にしていきます。
また、基礎中の基礎と思われる内容については記載しないので、適宜ググってもらえればと思います。

**説明すること**

- 環境構築
- ラジコン作成過程
- 必要なパーツ
- プログラム内容

**説明しないこと**

- ROSの概要・基礎
- Arduinoの概要・基礎

基本的に、『ググってすぐ出ること』に関しては記載しません。
逆に、ググっても理解しにくかったところは簡単な内容でも記載していきます。

特に**『ラジコンを制作するにあたってどんな事を考えていたか』**を中心に記載しています。
人によって何を作りたいのかは千差万別なので、必要な道具や機能はバラバラです。
細かいテクニックは置いておいて、根本となる部分を説明できたらと思います。

では、宜しくお願い致します。

# 制作の流れ
## 1. 要件定義
ここでは**『何をするのか』**を決めていきます。  

初めにも書きましたが、今回の目的は『ROSを用いて何かを作る』です。
その何かはなんでもいいのですが、必要なもの、あればいいもの、いらないもの等を決めていきます。  

また、コンセプトは『できる限り安くROSで遊ぼう』なので、なるべくコンパクトに考えていきます。
具体的には『家にあるものを使う。無ければ安いのを買う。』です。  

[ROS を用いたラジコン作成：要件定義編](https://qiita.com/take4eng/items/916fbbc68e2f7e34e384)

## 2. ROS環境構築
ここでは**『ROSの環境構築の方法』**について記載しています。  

ROSは確実に使用するため、設計の前に環境構築をしてしまいます。
ROSの環境構築方法についてはググればいろいろ出てくるのですが、Ubuntu20.04STLに対応する『ROS Noetic』の構築方法はパっとするものが無かったため記載しておきます。  

[ROS を用いたラジコン作成：ROS環境構築編](https://qiita.com/take4eng/items/70f167320ede46e4139c)

## 3. ROSとArduinoの連携
ここでは**『ROSによるArduinoの制御方法』**について記載しています。  

ROSと同様、Arduinoも確実に使用するため、先に制御方法を確認しておきます。
ついでにラジコンに使用するコントローラーとの接続方法も確認します。  

[ROS を用いたラジコン作成：Arduino制御編](https://qiita.com/take4eng/items/527793c9a1f902a0a62c)
[ROS を用いたラジコン作成：コントローラー制御編](https://qiita.com/take4eng/items/e067628971fa171d6d5a)

## 4. ハードウェア設計
ここでは**『制作に必要なハード』**について記載しています。

『何をするか』と『何ができるか』の確認ができたら、いよいよ設計です。
要件定義がしっかり決まっていれば、特に苦戦することはありません。
必要なパーツや道具を考えていきましょう。  

[ROS を用いたラジコン作成：ハードウェア設計編](https://qiita.com/take4eng/items/271924b986e072378439)

## 5. ソフトウェア設計
ここでは**『ROSでのノード・トピックの関係』**について記載しています。

必要パーツが出揃ったら、何をどのように制御するのかを考えていきましょう。
制御に利用するのはもちろん『ROS』です。  

[ROS を用いたラジコン作成：ソフトウェア設計編](https://qiita.com/take4eng/items/1d5007ab623c3f7d3ad4)

## 6. ソフトウェア制作
ここでは**『実際にROSのコードを書く』**作業に入っていきます。

さぁ！いよいよROSプログラミングの始まりです！！
とは言っても、これまでの制御方法の確認を行いソフトウェア設計も済んでいるので、やることは決まっています。  

ROSプログラミングにおいては最も重要な工程ですが、ロボット制作においては一番簡単かもしれませんね。  

[ROS を用いたラジコン作成：ソフトウェア制作編](https://qiita.com/take4eng/items/99df06b0e28d7c601632)

## 7. ハードウェア制作
ここでは**『実際にラジコンを形にする』**作業に入っていきます。

ついに最後の工程です！！
ROSの母体となるハードウェアを作成し、これまでの成果を詰め込みましょう！！ 

こちらは全体の中でも最終工程ですので、制作結果に関する総評や改善点なども記載しています。

[ROS を用いたラジコン作成：ハードウェア制作編](https://qiita.com/take4eng/items/21d34d5bf56f99aba54e)

# まとめ
家にあるものを転用することで、ROSで制御できるラジコンを格安で制作することができました！！

全てを0から用意するとなると、なんだかんだで結構かかってしまいますね(汗)
RaspberyPi を買うと、それなりの額にはなってしまいます。
(ラズパイzeroを使えば安くてコンパクトにはなるでしょうが、少し難易度が上がります。)  

ただ、冒頭に紹介したハードに比べれば小さなものでしょう。
RaspberyPi や Arduino なんてものは、電子工作やロボット制作において多用されますし、今回の制作の中で使用することで勉強にもなりました。

個人で開発できる規模には限界がありますが、できることから実践し、楽しみながら学習を続けていきたいですね。

# あとがき
ROS学習中の身でいろいろ偉そうなこと書いてすみません。
ROSの通信技術、物理シミュレーション、豊富なライブラリ、どれも素晴らしいものです。
それぞれの奥が深く、私自身まだまだ理解が足りていないという事もあります。  

ただROSが活用されるのは大規模なロボットシステムが多く、**「個人レベルでは学習しにくいな」**と思ったのがこの記事の始まりです。
個人規模、特に初学者となれば、費用・期間・工数など、どれを考えても限りはあります。  

『ハード制作は分かるけどROSは初めて』の方もいれば、『ROSは分かったけどハード制作は初めて』という方もいると思います。
私はどちらでもなく全てが初めてなのですが、ロボット制作は考慮しなければならない点が多く、一筋縄ではいかないなと思ったのが正直な感想です。  

0から初心者がロボットを制作するのは、なかなかハードルが高いと感じましたね。
とは言え、動かないと何も始まりません。
小規模でもいいので、新しく生み出すことを始めてみましょう。
似たような記事はあるとは思いますが、そのうちの一つとしてROS初学者の参考になれば幸いです。  

ここまでお読みいただきありがとうございました。
では、良きクリエイティブライフを！！

# (追記) 改造しました
このままでは出来がショボすぎるので、この制作過程を基に改造しました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ラジコンできた🚗 <a href="https://t.co/ouLX9gT7jK">pic.twitter.com/ouLX9gT7jK</a></p>&mdash; かくとー🤖 (@take4eng) <a href="https://twitter.com/take4eng/status/1355780909862019078?ref_src=twsrc%5Etfw">January 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">動いたぁぁぁぁぁぁぁ！！！ <a href="https://t.co/VLL3D4UP4e">pic.twitter.com/VLL3D4UP4e</a></p>&mdash; かくとー🤖 (@take4eng) <a href="https://twitter.com/take4eng/status/1355782976173264898?ref_src=twsrc%5Etfw">January 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**改造内容**
- モーターをタミヤのギヤボックスに変更
- 3Dプリンターで車体作成
- ROS間で無線通信


これらにより**『トルク・見た目・通信方法』**が改善しました。
改造しまくった結果、ちゃんとラジコンと呼べそうなものに仕上がってくれました！！

この改造で初めて3Dプリンターを使用しましたが、案外できちゃうものですね。
家庭用の物だと3万円程度で購入できますし、個人的にはとしても良い買い物になりました。