Raspberry Pi で姿勢制御する飛ばさないドローンの試験記録
前回、Raspberry Piで姿勢制御するドローンを製作して検証試験を試みたが、20,000回転のプロペラの脅威に負けて、検証途中で中止。今回は、脅威となるプロペラを回さず、Raspberry Piによる姿勢制御の動作を検証し、その一連の記録をまとめたもの。
●姿勢制御の検証試験の部品構成
ドローンの4軸を、それぞれ釣糸(φ0.47mm、強度13kg)で吊り上げる。釣糸は300mm高さの支柱に付けた巻上げ用ホイール(φ60mm)で巻き上げる。巻上げ用ホイールの回転には、PWM信号で動作するサーボモーター(DS3218MG)を使い、PWMデューティ比2.5%~12.5%で、0度~270度回転し、各軸とも最大140mm上昇させることができる。4つのサーボモーターの感度の違い、釣糸の張力の違いから、同じPWM信号を出しても、上昇高さは異なり、また上昇速度も異なっている。実際のドローンも、各軸のDCモーターの特性が違うので、シミュレーション上は好都合となる。
・巻上げ用ホイールの製作
巻上げ用ホイールは、φ60mm(板厚3mm)のアクリル円板を、φ70mm(板厚3mm)のアクリル円板2枚で挟み、アクリルサンデーで接着して作った。円板の中心が一致するように、写真に示すようにタミヤのユニバーサルプレートを用いて位置合わせを行った。
・実際のドローンと確認試験用ドローンの相違点
プロペラを回転させないので、ESCとDCモーターを使わず、PWM Controller(PCA9685)からのPWM出力を直接デジタルサーボモーター(DS3218MG)に送り、各軸の高さをコントロールする。
●確認試験用ドローンの部品構成
PCからの操作指令をWiFiでRaspberry Piに飛ばし、その指令データをRaspberry Piで解釈し、PWMコントローラー(PCA9685)にPWM生成信号を送り、そのPWM信号でデジタルサーボモーターを回転させる。ドローンの姿勢は、MPU-9250の9軸センサーの加速度、ジャイロデータからRoll角(θx)、Pitch角(θy)を計算し、水平になるように、PID制御により各軸の高さを制御する。今回は高さデータを取るために、レーザー測距センサー(VL53L0X)をドローンの底面に取付け、PID制御で指定高さになるようにコントロールした。
バッテリーは、LiPoバッテリー(2200mAh,11.1V,30C)を用い、DC-DCコンバーターで12Vから5Vに変換して、サーボモーターに電源を供給した。Raspberry Pi用の電源は、スマホ充電Liバッテリー(5V, 3000mAh)を用いた。
●姿勢制御の確認試験用ドローンの組立
前回製作したラズドローンの底面に、レーザー測距センサー(VL53L0X)を取付けた。PWM Controllerからの出力は、延長ケーブルを用いて、支柱の上部に取り付けたサーボモーターに接続した。
●試験用ドローンのプログラム構成
Raspberry PiをWiFiでPC(Windows10)と接続して、VNCでリモート操作。ドローンの操作指示はPC(pythonプログラム)で行っている。PCとRaspberry Piはsocket(UDP)接続して、PCから送信される操作指示(自動・手動・停止、パラメーター)をRaspberry Piで受信して、処理をしている。
・PC(Windows10)側の操作指示画面
・サーボモータに送るPWM信号の仕様
PWM Controller(PCA-9685)に設定するパラメータとして、インターナルクロックを25MHz、サーボモータ(DS3218MG)の仕様から PWM周波数は50Hz、Duty比は2.5%~12.5%(サーボモータ回転角0度~270度)を使った。
●PID制御のプログラム
①高さH補正、②Roll角θx補正、③Pitch角θy補正の順で、修正量を計算する。
ある時点nにおける操作量は、次の様に求めることができる。
\(MV_{n} = MV_{n-1} + \Delta MV_{n}\)
\(\Delta MV_{n} = K_{p} \times\) 偏差 \(+ K_{i} \times\)偏差の累積値 \(+K_{d} \times\) 前回偏差との差
(比例項) (積分項) (微分項)
\(= K_{p} \times (e_{n} – e_{n-1}) + K_{i} \times e_{n} + K_{d} \times{(e_{n} – e_{n-1}) – (e_{n-1} – e_{n-2})}\)
ここで、
\(MV_{n}, MV_{n-1}\):今回、前回の操作量
\(\Delta MV_{n}\):今回の操作量差分
\(e_{n}, e_{n-1}, e_{n-2}\):今回、前回、前々回の偏差
\(K_{p} = 0.5 \sim 1.5, K_{i} = 0.2 \sim 0.4, K_{d} = 0.1\)
高さHの操作量をMHn、Roll角θx、Pitch角θyの操作量をMTXn、MTYnとすると、各軸の操作量は、MHn + MTXn + MTYnとなる。但し、Roll角θx、Pitch角θyを、+側またはー側に姿勢補正する場合には、各軸(A~D軸)の修正方向は次の表のように、軸によって方向が異なる。
●PID姿勢制御試験の結果
0.1秒ごとに、設定値と実測値を記録して、グラフに表したのが次の図。高さHの実測値が振れているのは、ドローン自体の揺れによるものであるが、Roll角、Pitch角の変動は少ない。設定値を変化させた時には、若干のオーバーシュートが見られるが、直ぐに設定値に収束している。
パラメータKp,Ki,Kdを変化させることで、チューニングは可能。
ここで使ったPIDのパラメータは、
高さH :\(K_{p} = 1.1, K_{i} = 0.3, K_{d}= 0.3\)
角度θ :\(K_{p} = 1.3, K_{i} = 0.3, K_{d}= 0.3\)
PIDのパラメータKp,Ki,Kdを次のように変えた結果では、オーバーシュートの収束に少し時間がかかっている。
高さH :\(K_{p} = 0.3, K_{i} = 0.2, K_{d}= 0.2\)
角度θ :\(K_{p} = 0.5, K_{i} = 0.2, K_{d}= 0.2\)
プロペラを回さず、PID制御が機能しているかを検証した。実際のDCモーターで回すプロペラによる揚力と今回のサーボモータによる浮上力では、制御に対する応答感度が異なるので、実際にドローンを飛ばして、姿勢制御できるかどうか分からないが、これでRaspberry piを使ったドローンの製作を終えることとした。