ROS を用いたラジコン作成：要件定義編

# 概要
この記事は[RaspberyPi , Arduino , ROS を用いたラジコン作成](https://qiita.com/take4eng/items/0b21c4927d42b3d7cd62)の要件定義編です。
全体の概要や流れに関しては、本編をご覧ください。

[ROS を用いたラジコン作成：本編 (全体まとめ)](https://qiita.com/take4eng/items/0b21c4927d42b3d7cd62)
[ROS を用いたラジコン作成：要件定義編](https://qiita.com/take4eng/items/916fbbc68e2f7e34e384) **← 今ここ**
[ROS を用いたラジコン作成：ROS環境構築編](https://qiita.com/take4eng/items/70f167320ede46e4139c)
[ROS を用いたラジコン作成：Arduino制御編](https://qiita.com/take4eng/items/527793c9a1f902a0a62c)
[ROS を用いたラジコン作成：コントローラー制御編](https://qiita.com/take4eng/items/e067628971fa171d6d5a)
[ROS を用いたラジコン作成：ハードウェア設計編](https://qiita.com/take4eng/items/271924b986e072378439)
[ROS を用いたラジコン作成：ソフトウェア設計編](https://qiita.com/take4eng/items/1d5007ab623c3f7d3ad4)
[ROS を用いたラジコン作成：ソフトウェア制作編](https://qiita.com/take4eng/items/99df06b0e28d7c601632)
[ROS を用いたラジコン作成：ハードウェア制作編](https://qiita.com/take4eng/items/21d34d5bf56f99aba54e)
![S__24641539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634805/b0d59ec3-4226-c14b-6730-acd771a44b9d.jpeg)

## 今回やること

- **何を実現したいのか考える**
- **自分自身や身の回りについて現状を把握する**
- **実現するために必要な機能を考える**

# 要件定義

## 実現したいこと
今回の開発で最も実現したいことは、**『ROSを使って何かしらのハードウェアを作成したい！！』**です。  

せっかくロボットに関する内容を学んでいるのなら、ロボット作っちゃおうぜ！！っていうのが将来の目標となりました。
しかし本編にも記載しているように、個人でROSの学習を行うには成果物がなかなか見られず、ちょっとモチベーションを維持し辛いことがあります。

そこで、今回のコンセプトとして表明しているのが**『できる限り安くROSで遊ぼう！！』**です。
まずは超簡単な内容でいいから、1つの成果物を制作してみることが重要だと考えました。

## 何を制作するのか
さて、それでは何を作りましょうか？
超簡単な内容とは言っても、人によって制作の難易度は異なります。

ROS初学者ですから、構想時点で**『できること』『できないこと』**の区別も必要ですね。
できないことの中には、**『技術的にできない』**のか、**『ハードが足りないからできない』**のか、**『どんな要素があればできるようになる』**のか・・・
などなど、この辺も考える必要があります。

一旦、自身の学習状況や利用できそうなものをまとめてみました。

### できること
- ROSの基本的な操作 (パッケージや各プログラムの作成)
- ROSの簡単なシミュレーション
- ROSを用いたジョイスティックコントローラーの操作
- Arduinoを用いた電子工作

### できないこと
- ROSの本とかに載ってる、高価なハードの制御
- いっぱい

### 知っていること
- ROSでArduinoを制御することができること
- 複数のPC間でROSを用いた通信ができること
- 画像処理関連のパッケージがあること
- 自動運転や自己位置推定など、SLAM関連のパッケージがあること

### 使えそうなもの
- RaspberryPi
- ラスパイのカメラモジュール
- WSL内のROS
- Arduino
- 電子工作関連のパーツ、道具
- ジョイスティックコントローラー

## ラジコンを制作する！！
上記の内容を一通り考えた結果、**『電子工作の延長線上としてROSを用いて制御を行う』**ことに落ち着きました。

今の私には十分な課題でしょう。
(電子工作すら初心者レベルですので・・・)

とりあえずモーターを回しておけば動きそうなラジコンカーを題材としました。

簡単すぎますかね？
いいんです。まずは土台を固めていきましょう！！
難しくしたいなら、この後に色んなオプションを付けていけばよいでしょう。

## 機能要件
上記の内容により、制作するものが決まりました。
では次に、その条件を満たすために**『必要な機能』**を考えましょう。
また同時に、**『無くてもいいけどあったらいい機能』**も挙げていくと、本当に必要な機能が絞れて本質を見極めやすくなります。

### 必須項目
『ラジコンカー』を満たすための項目を考えてみます。
これさえあれば成り立つ！といった、最低限の内容を挙げてみます。


- **車体、タイヤ、動力源がセット**
- **前後左右の移動が可能**
- **無線で操作可能**


こんなもんでしょうか？
私にはこれくらいしか思いつきません。
逆に、これだけを満たせばラジコンカーとして成り立つワケです！！

### 任意項目
次に、『あったらいいな』という機能を挙げていきます。
こんなもん考えだすと無限に出てくるので、余力があれば実装できそうなものに留めておきます。

- **スピード調節機能**
- **バック時のブザー**
- **自動ブレーキシステム**
- **ハザードランプやウインカー**

市販のラジコンにある機能といえばこれくらいでしょうか？
制作時に余力があれば実装したいですね。

### 不要項目
最後に、今回は不必要な項目について考えます。
任意項目と似てはいますが、**『何を捨てるのか決める』**ことは非常に重要です。

- **見た目、外装**

今回は見た目に関しては完全に捨てます。
機能や制御システムに関与してこない部分は無視していきます。

# 完成したもの
こちらはネタバレにはなるのですが、最終的に盛り込んだ機能について説明していきます。

## 実装した機能
- **車体、タイヤ、動力源がセット**
- **前後左右の移動が可能**
- **有線での操作**
- **ハザードランプやウインカー**

必須項目の『無線操作』が入ってねぇじゃん！！
と思った方々、すみません… 技量不足により実装することができませんでした…

ROSを用いた複数PC間の通信を試してみたのですが、どうも上手くいかず断念しました。
Arduinoや無線モジュールを使用すれば無線操作は可能でしょうが、ROS学習という今回の趣旨と外れるために実装しておりません。

近日中にリベンジします！！

## 実装していない機能
- **無線での操作**
- **スピード調節機能**
- **バック時のブザー**
- **自動ブレーキシステム**

無線操作以外の項目は任意項目ですね。
実装自体は可能でしたが、ROSの学習ではなく電子工作のオマケにしかならないと判断し、今回は実装を断念しました。

それこそ余力があれば、上記の機能も盛り込んだものを制作していきます！！