More than 1 year has passed since last update.

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


概要

ドローンの本体の作成からドローンの制御までの一連をやってみました。

drone.JPG


用意したもの


部品類

商品
品数
購入先

RaspberryPi 3
1
adafruit

リチウムポリマー電池
1
hobbyking

PXF Mini
1
erle robotics

ブラシレスモーター(時計回り)
2
hobbyking

ブラシレスモーター(反時計回り)
2
hobbyking

プロペラ(時計回り)
2
hobbyking

プロペラ(反時計回り)
2
hobbyking

カーボンパイプ ⌀12
1000mm
kkhobby

モーターマウント
4
販売中止

パイプマウント
16
販売中止

ネジ(M2.6,M3)
多数
秋葉原のパーツ店

ナット(M2.6,M3)
多数
秋葉原のパーツ店

ワッシャー(M2.6,M3)
多数
秋葉原のパーツ店

機材類

商品
購入先

3Dプリンタ
Amazon

3Dプリンタのフィラメント
Amazon


ドローンの構成

今回作ったドローンは下の図のような仕組みで動いています。一般に売られているドローンはこの仕組みに色々なセンサーを付加したものです。


drone_system (2).png


制御系


ドローンの運動モデル

制御系をつくるためにはどのような運動をするのか理解しなければなりません。


下の図がドローンの簡略図です。M1〜M4はモーターで、矢印の方向がモーターの回転方向を表しています。


4つのモーターの推力を変化させることによって姿勢を変化させます。ホバリング時は隣り合うモーターが反トルクを打ち消し合っています。


drone_control.png


姿勢制御の方法 (平行移動の例)

下の図のようにモーターの出力を変化させます。


drone_control_roll.png


これによって、下の図のようにモーターの推力が変化します。そしてドローンが回転し、推力の方向が変化し、左方向に進むことができるのです。


drone_pose (1).png


制御の詳細

自己位置推定系から得られた姿勢と、外部から入力された制御目標の差を元に出力を変化させます。


具体的な制御はPID制御を使用しています。PID制御の説明はここでは割愛します・・・。

今回の制御の対象となる物理量:

\theta,\phi,\psi, \frac{d\theta}{dt}, \frac{d\phi}{dt},\frac{d\psi}{dt}

今回の制御の対象外となる物理量:

x, y, z, \frac{dx}{dt}, \frac{dy}{dt}, \frac{dz}{dt}

但し、各物理量は以下のように定義します。

axis_quadrotor.jpg


自己位置推定

姿勢角のみの制御なので、姿勢推定も角度のみで行います。加速度、角速度、地磁気センサを入力し、ARHSフィルターにかけて、姿勢角を推定します。


カメラを取り付けることによって速度や位置の推定も行えますが、その場合は拡張カルマンフィルタなどで姿勢推定をします。


筐体

メインのフレームはCADで設計し、3Dプリンタで印刷しました。モーターと本体をつなぐロッドはカーボンパイプを使用しています。


コンピュータ

Raspberry Pi3 を使用。センサー類、PWM出力ドライバは拡張ボードPXFMiniに搭載されているものを使用。


付録:ROS について

ROSはロボット用のミドルウェアです。ロボットはセンサ、コンピュータ、アクチュエータで構成されています。そのセンサ→ コンピュータ→ アクチュエータの流れに沿って情報が送られていきます。


そのためのソフトウェアを一つの実行ファイルに全て押しこむことはもちろん可能です。しかし、センサやアクチュエータの変更、センサーの読み値を知りたい、ということは頻繁に起きます。

ひとつの実行ファイルで行った場合、プログラムの一箇所だけを書き換えることによってセンサを変更する。センサーを読みたいときはシリアル通信でコンソールに表示されるようにする、ということはもちろん可能です。

しかし、ROSを使うとこのようなことをとても簡単に行うことができます。

まず、ROSはセンサやアクチュエータのドライバ、制御を司るものはすべて別のプロセスで動きように構成します。そしてそのプロセスの間の通信をメッセージという形でやりとりをするのです。


こうすることによって、必要なセンサのドライバのプロセスのみを起動したり、最初から用意されている、メッセージを読み取るアプリケーションを利用すれば、プロセス間の通信も人間に読み取れる形で簡単に出力できるのです。

また、ROSの開発コミュニティーは非常に大きいです。ロボットの開発に便利なツールや、ロボットの制御に必要な自己位置推定からプラニングまでの幅広いロジックが提供されています。

このように、ROSはロボット開発者にとってつよーい味方なのです。