3DプリンタでROSドローンを作ってみた

こんにちは、eeic2017の@kentegrateです。今回はドローンの制作をしたので、その紹介をします。

## 概要
ドローンの本体の作成からドローンの制御までの一連をやってみました。
![drone.JPG](https://qiita-image-store.s3.amazonaws.com/0/113446/325051c0-c191-9663-f98e-723db0bb71d5.jpeg)


## 用意したもの
#### 部品類
|商品|品数| 購入先 |
|:--|:-:|:--|
|RaspberryPi 3  | 1  |[adafruit](https://www.adafruit.com/products/3055)
|リチウムポリマー電池  | 1  | [hobbyking](https://hobbyking.com/en_us/turnigy-bolt-2400mah-3s-11-4v-65-130c-high-voltage-lipoly-pack.html)
|PXF Mini   |  1 |[erle robotics](http://erlerobotics.com/blog/product/pxfmini/)
|ブラシレスモーター(時計回り) | 2  |[hobbyking](https://hobbyking.com/en_us/black-widow-2212-18a-12d-cw-1000kv.html)
|ブラシレスモーター(反時計回り) | 2  |[hobbyking](https://hobbyking.com/en_us/black-widow-2212-18a-12d-ccw-1000kv.html)
|プロペラ(時計回り)| 2  |[hobbyking](https://hobbyking.com/en_us/gws-style-slowfly-propeller-9x4-7-black-cw-4pcs.html)
|プロペラ(反時計回り)| 2  |[hobbyking](https://hobbyking.com/en_us/gws-style-slowfly-propeller-9x4-7-black-ccw-4pcs.html)
|カーボンパイプ ⌀12| 1000mm  |[kkhobby](http://www.kkhobby.com/SHOP/FS033.html)
|モーターマウント| 4  |販売中止|
| パイプマウント|16|販売中止|
|ネジ(M2.6,M3)| 多数  |秋葉原のパーツ店
|ナット(M2.6,M3)| 多数  |秋葉原のパーツ店
|ワッシャー(M2.6,M3) | 多数 |秋葉原のパーツ店 |

機材類

| 商品 | 購入先 |
|:-:|:-:|
| 3Dプリンタ  |  [Amazon](https://www.amazon.co.jp/dp/B018VA2AZI/) |
| 3Dプリンタのフィラメント  |  [Amazon](https://www.amazon.co.jp/dp/B00I56IRTC)  |

## ドローンの構成                                                                                                                                                                                                                                       
今回作ったドローンは下の図のような仕組みで動いています。一般に売られているドローンはこの仕組みに色々なセンサーを付加したものです。                                                                                                                      
![drone_system (2).png](https://qiita-image-store.s3.amazonaws.com/0/113446/d58d7186-b6f4-da0c-dec1-ab84ad5ce917.png)
                                                                                                                                                                                                                                                      
### 制御系
#### ドローンの運動モデル
制御系をつくるためにはどのような運動をするのか理解しなければなりません。   
下の図がドローンの簡略図です。M1〜M4はモーターで、矢印の方向がモーターの回転方向を表しています。                                                                                                                                                                            
4つのモーターの推力を変化させることによって姿勢を変化させます。ホバリング時は隣り合うモーターが反トルクを打ち消し合っています。                                                                                                                                                          
![drone_control.png](https://qiita-image-store.s3.amazonaws.com/0/113446/d14e8859-1288-56e4-d2d1-615a5623ed6f.png)                                                                                                                                      
#### 姿勢制御の方法  （平行移動の例）                                                                                                                                                                                                                                                      
下の図のようにモーターの出力を変化させます。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
![drone_control_roll.png](https://qiita-image-store.s3.amazonaws.com/0/113446/1ef74486-55b1-3efb-53cb-9410381bf9b2.png)                                                                                                                                 
これによって、下の図のようにモーターの推力が変化します。そしてドローンが回転し、推力の方向が変化し、左方向に進むことができるのです。                                                                                                                    
![drone_pose (1).png](https://qiita-image-store.s3.amazonaws.com/0/113446/85507702-72a4-532b-8859-103d8ef7ea36.png)                                                                                                                                     
#### 制御の詳細                                                                                                                                                                                                                                          
自己位置推定系から得られた姿勢と、外部から入力された制御目標の差を元に出力を変化させます。                                                                                                                                                              
具体的な制御はPID制御を使用しています。PID制御の説明はここでは割愛します・・・。                                                                                                                                                                        
                                                                                                                                                                                                                                                        
今回の制御の対象となる物理量:

```math:
\theta,\phi,\psi, \frac{d\theta}{dt}, \frac{d\phi}{dt},\frac{d\psi}{dt}
```
今回の制御の対象外となる物理量：

```math:
x, y, z, \frac{dx}{dt}, \frac{dy}{dt}, \frac{dz}{dt}
```
但し、各物理量は以下のように定義します。
![axis_quadrotor.jpg](https://qiita-image-store.s3.amazonaws.com/0/113446/5c146587-18e4-464f-7e7e-c000679ff69c.jpeg)
                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                        
### 自己位置推定                                                                                                                                                                                                                                        
姿勢角のみの制御なので、姿勢推定も角度のみで行います。加速度、角速度、地磁気センサを入力し、ARHSフィルターにかけて、姿勢角を推定します。                                                                                                                
カメラを取り付けることによって速度や位置の推定も行えますが、その場合は拡張カルマンフィルタなどで姿勢推定をします。                                                                                                                                      
                                                                                                                                                                                                                                                        
### 筐体                                                                                                                                                                                                                                                
メインのフレームはCADで設計し、3Dプリンタで印刷しました。モーターと本体をつなぐロッドはカーボンパイプを使用しています。                                                                                                                                 
                                                                                                                                                                                                                                                        
### コンピュータ                                                                                                                                                                                                                                        
Raspberry Pi3 を使用。センサー類、PWM出力ドライバは拡張ボード[PXFMini](http://erlerobotics.com/blog/product/pxfmini/)に搭載されているものを使用。                               

## 付録：ROS について                                                                                                                                                                                                                                         
[ROS](http://www.ros.org/)はロボット用のミドルウェアです。ロボットはセンサ、コンピュータ、アクチュエータで構成されています。そのセンサ→　コンピュータ→　アクチュエータの流れに沿って情報が送られていきます。                                            
そのためのソフトウェアを一つの実行ファイルに全て押しこむことはもちろん可能です。しかし、センサやアクチュエータの変更、センサーの読み値を知りたい、ということは頻繁に起きます。                                                                          
                                                                                                                                                                                                                                                        
ひとつの実行ファイルで行った場合、プログラムの一箇所だけを書き換えることによってセンサを変更する。センサーを読みたいときはシリアル通信でコンソールに表示されるようにする、ということはもちろん可能です。                                                
                                                                                                                                                                                                                                                        
しかし、ROSを使うとこのようなことをとても簡単に行うことができます。                                                                                                                                                                                     
                                                                                                                                                                                                                                                        
まず、ROSはセンサやアクチュエータのドライバ、制御を司るものはすべて別のプロセスで動きように構成します。そしてそのプロセスの間の通信をメッセージという形でやりとりをするのです。                                                                         
こうすることによって、必要なセンサのドライバのプロセスのみを起動したり、最初から用意されている、メッセージを読み取るアプリケーションを利用すれば、プロセス間の通信も人間に読み取れる形で簡単に出力できるのです。                                        
                                                                                                                                                                                                                                                        
また、ROSの開発コミュニティーは非常に大きいです。ロボットの開発に便利なツールや、ロボットの制御に必要な自己位置推定からプラニングまでの幅広いロジックが提供されています。                                                                               
                                                                                                                                                                                                                                                        
このように、ROSはロボット開発者にとってつよーい味方なのです。