OpticalFlow
ArduPilotのマニュアルページが解りにくい&情報が古いので、備忘録
http://ardupilot.org/copter/docs/common-px4flow-overview.html
ファームウェアをダウンロード
ArduPilotでPX4FLOWを使うには、APM版のPX4FLOWファームウェアが必須。
http://download.ardupilot.org/downloads/wiki/advanced_user_tools/px4flow-klt-06Dec2014.zip
(解凍後のファイル:px4flow-klt-06Dec2014.px4
)
ファームウェアをPX4FLOWへアップロード
- PX4FLOWをPCのUSBポートに接続
- PixhawkとPX4FLOWをつなぐI2Cケーブルを抜いておく(I2C経由でPixhawkに電源が供給され、Pixhawkが起動しようとするが、電力が足りなく落ちてしまうため)
- QGroundControlでPX4FLOWに上でダウンロードしたファームウェアをロード
NOTE: 古いバージョンのQGroundControlはカスタムファームをアップロードするメニューがないので、v2.8.0以降を使用。v2.8.0にはPX4FLOW専用のビデオ画面があり、下記のフォーカス調整を行う際に便利。古いバージョンのQGroundControlを使うのであれば、2.5.2以前にはカスタムファームをロードするメニューが存在する。
QGroundControlの全てのリリースバージョンはこちら
レンズフォーカス調整
NOTE: 以下のステップは機体に搭載する前に済ませておくと楽
- QGroundControlを立ち上げ、USB経由でPX4FLOWを接続
- v2.8.0以降のQGroundControlの場合、PX4FLOWのオプティカルセンサー(グローバルシャッターの高速カメラ)からのビデオが自動でストリーム&表示され、PX4FLOW専用の設定画面が表示される
- パラメーターメニューから、VIDEO_ONLY=1を設定することで高解像度のビデオが得られ、フォーカス調整時に便利
- フォーカスリングを回して、ホバリングする距離(またはOpticalFlowでよく使う高度)で対象物のエッジがシャープになるように調整。ArduPilotのサイトでは3mと書いてあるが、利用目的に合わせて調整する。自分の場合は屋内の低高度で飛ばすことが多いので、1mに設定
- フォーカスが決まったら、リングのイモネジを回してロック
- VIDEO_ONLYパラメーターを0に設定(今のところPX4FLOWは再起動時にパラメーター保存しないので本来は不要)
PX4FLOWをPixhawk/PXF/PixRacer等に接続
レンズフォーカスの調整が終わったら、機体の下側にPX4FLOWをマウント。
- 画像フレームの差分でフローの計算をするので、画像がぶれないようにバイブレーション対策は必須
- DF13の4ピンコネクターを使って、PX4FLOWのI2CポートとPixhawkのI2Cポートを繋ぐ
- 機体から見たマウント方向は、PX4 Native StackとArduPilotで違うので、ドキュメントを確認
レンジファインダーを設定
PX4FLOWにかぎらず、オプティカルフローは、対象物との距離がわからなければ自機がどれだけ動いたか計算できない(1mの高度で1ピクセル動いた場合と、100mの高度で1ピクセル動いた場合では、全く違う数値になる)ので、正確なレンジファインダーは必須
PX4FLOWのソナーを使う場合(非推奨)
- ほぼ全てのケースでLIDARを使ったほうがよい結果が得られる
- どうしてもPX4FLOWのソナーを使いたい場合は、ソナーのみ、PixhawkのADC入力に接続し、単体のソナーとして扱う(PX4FLOWのファームはソナーの値も読むが、ArduPilotもPX4 Native Stackも、姿勢制御の計算には使わない)
- 3DR製のPX4FLOWはLV-MaxSonar-EZ4 (MB1040、回路図情報) またはHRLV-MaxSonar-EZ4 (MB1043、3DRサイト情報)
- MB1040は、低解像度のインペリアル版で、1インチの解像度と6 ~ 254インチ(152mm ~ 6,450mm)のレンジ
- MB1043は、高解像度のメートル法版で、1mmの解像度と、300mm ~ 5,000mmのレンジ
- 以下はMB1043を前提とする
ソナー接続
- EZ4のアナログ出力はピン3
- GNDはピン7.
- アナログシグナルのレンジはレシオメトリックなので、0.0vから、ソナーに供給されているVccの電圧、つまり、3.3 Vccを入力した場合、最大距離は3.3Vとして出力され、5Vを入力した場合、最大距離は5Vとして出力される
- PX4FLOWはソナーに5Vを供給するので、ピン3からの出力は最大で5V(実際には5Vより少し下がる)
- 電源の品質によって左右されるので注意。高品質の安定化電源推奨。USB経由で電源供給した場合、5Vよりも低い
ソナー注意事項
- ソナーのアナログアウトはPixhawkの6.6V ADC入力に接続すること
- 前述のように、出力は5Vを越える可能性があるので、3.3V ADCには入力しないこと
- Pixhawkの6.6V ADC入力ソケットは3ピンのDF13。Pixhawkを上から見てセンターピンがアナログ入力、右側がGND。Pixhawkの上面にあるDF13コネクターは、全て上から見て左側のピンがVcc
- 5VピンはPX4FLOW上のソナーには接続しない
詳細はこちらを参照
- http://copter.ardupilot.com/wiki/common-rangefinder-maxbotix-analog/
- http://copter.ardupilot.com/wiki/common-pixhawk-overview/#pixhawk_analog_input_pins
- https://pixhawk.org/modules/pixhawk
ソナー設定
# Analog=1, I2C=4
RNGFND_TYPE=1
# EZ4のアナログアウトプットはリニア
RNGFND_FUNCTION=0
# ADC 6.6Vソケットのアナログインプットピンはバーチャルピン15にマッピングされている
# レベルシフター(電圧変換ボード等)を使って、ADC 3.3Vに繋いだ場合は、バーチャルピン13か14になる。(ADC 3.3Vソケットはアナログ入力ピンが2つある)
RNGFND_PIN=15
# EZ4はレシオメトリック
RNGFND_FUNCTION=0
RNGFND_RMETRIC=1
# ストップピンは接続しない(ソナーは常時オン。複数ソナーを使う場合は干渉を防ぐためにタイミング調整が必要になる)
RNGFND_STOP_PIN=-1
# 公式ドキュメントでは、EZ0とEZ4の場合これを7mに設定するとの記述があるが、XL-MaxSonarの話。PX4FLOWのHRLV-Max-Sonar-EZ4は5mまでしか測定しない
RNGFND_MAX_CM=500
# PX4FLOWのEZ4は、30cm以下の距離では正確な数値は得られないので、無視する
RNGFND_MIN_CM=30
# 以降はPaul Risenboroughのコメントに従って調整する
# http://diydrones.com/forum/topics/optical-flow-discussion-thread?commentId=705844%3AComment%3A2137979
# 着陸時のPX4FLOWのレンズから地上までの距離
RNGFND_GNDCLEAR=2
# PX4FLOWのEZ4ソナーは、Vcc = 5Vの場合、理論上の電圧は0.293Vから4.885V (300mm ~ 5000mm)なので、オフセットを設定
RNGFND_OFFSET=0.293
# データシートによると、EZ4はVcc = 5Vの場合、5mの距離で4.885Vを返すはずなので、スケーリングを設定する
# 5m / 4.885v
RNGFND_SCALING=1.02354
ソナーテスト
- レンジファインダーを接続した状態でARMする前に、機体を50cm以上、2m以下の高さに持ち上げることでPre-armingチェックをクリアする
- センサーエラーやスパイクなどが原因で50cm以下の値や、200cm以上の値が一度でも出た場合はpre-armチェックがエラーになったままなので、再起動しない限りARMできないので注意
- ソナーが地面に近すぎる場合、EZソナーの出力が瞬間的に最大値になることがあるので、この場合も再起動しない限りARMできない
アナログMaxSonarを単体で使用する場合
- 手順はPX4FLOWに付属するソナーとほぼ同じ
- 電源のみ、PX4FLOW上のソナーはPX4FLOWから電源が供給されるため接続しなかったが、単体ソナーを接続する場合はPixhawkの6.6V ADCソケットのVcc (5V)に接続する
- PixhawkのADCは3チャンネルしかないので、複数ソナーを使う場合はI2C版のMaxSonarを使ったほうが楽(詳細to be filled)
その他のレンジファインダー
- LIDARページ参照
ArduPilot Copterファームウェアをアップデート
- オプティカルフローを使える最低バージョンはCopter v3.3.1にこちらのパッチをあてたもの https://github.com/diydrones/ardupilot/commit/9b80ab18ae57dc38f1b91ae5946b4b3c317ac7c8
- Copter v3.3.2-rc2以降では上記が含まれる
- ベータ版のバイナリが提供されるまでは、自分でファームウェアをコンパイルする必要がある(ベータ版の3.3.3がでてるはず)
PX4FLOW関連のパラメーターを設定
APM Planner 2.0 / Mission Plannerを使って設定
- Initial Setup -> Optional Setup -> Optical Flow -> “Enable”にチェックを入れる
- Config/Tuning -> Full Parameter List
以下を変更
# EKFを使用している場合
AHRS_EKF_TYPE=1
EKF_ENABLE=1
EKF_GPS_TYPE=3
# 気圧計の代わりにレンジファインダーを使用
EKF_ALT_SOURCE=1
# EKF2を使用している場合
AHRS_EKF_TYPE=2
EK2_ENABLE=1
EK2_GPS_TYPE=3
# Copter 3.4は、0に設定しておくとGPSが失われた場合、OpticalFlowへ自動へ切り替える
EK2_GPS_TYPE=0
# 気圧計の代わりにレンジファインダーを使用
EK2_ALT_SOURCE=1
FLOW_ENABLE = 1
FLOW_FXSCALER = 0
FLOW_FYSCALER = 0
FLOW_ORIENT_YAW = 0 # PX4FLOWのX軸を機体前方に向けてマウントした場合(xyz軸はPX4FLOWのPCB基盤裏に印刷されている)。値は-18000 ~ 18000 centidegrees。
# GPSのpre-armチェック回避
GPS_HDOP_GOOD -> 9999
# Pre-ARMロギングを有効にする(All + FastATT, including pre-arm logging)
LOG_BITMASK -> 131071
Master版を使っている場合
2016年2月時点でmasterを飛ばしている場合、Paul Riseboroughのパラメーターリスト参照.
設定&テスト
プリフライト
ドキュメントに従って、PX4FLOWのマウント方向をチェック、パラメーター設定
テレメトリーログではなく、必ずデータフラッシュログを確認し、以下を確認:
- OF.flowX, OF.flowY, OF.bodyX, OF.bodyYが機体の動きに合わせて変化すること
- EKF5.meaRngがフラットではなく、高度変化に追従すること
- EKF5.FIXと、EKF5.FIYがフラットではなく、変化していること(フラットラインはオプティカルフローのデータがEKFに反映されていないことを示唆)
- EKF4.SS bit 7がfalseであること(trueの場合、constant position modeになっている)
- EKF4.SS bit 3がtrueであること(trueの場合、relative position modeになっている)
NOTE: OF.flowX and OF.flowYはテレメトリーログではアップデートされないので、必ずデータフラッシュログを確認すること NOTE: OF_LOITERモードは、かなり以前に無くなったモードで、APM Planner 2.0には残っているが、実際には使えない
既知の問題
- ARM後すぐに1m程度の高度まで離陸しないと、EKFはオプティカルフローの値を異常とみなして無視してしまうため、マニュアルモードと同じ挙動になる
- 飛行中、オプティカルフローの値が大きく変化すると、突然使えなくことがある。ワーニング等はないため、あとでデータフラッシュログを見ない限り原因も、OpticalFlowが無効になっていたことすらわからない
- 設定が完璧出なかったり、振動が多かったりすると、時間の経過とともにエラーが蓄積されていき、位置がずれていく
- オプティカルフローを使ったLoiterモードは反応が鈍くなることがあり、ノーコンと間違えてパニックになりやすい
- データフラッシュログにオプティカルフロー関連のログが何も残っていない場合、NSH経由でNuttXにログインし、
px4flow status
コマンドを使ってモジュールが検出されているか、ドライバーがロードされているかチェックできる。正常に動いている場合はセンサーの値、そうでない場合はエラーメッセージが表示される - 中国製のPX4FLOWクローンは、I2C経由では動作しなかった(サーフェスマウントのI2Cコネクターの極性が逆に取り付けられていた)が、USB経由では正常に動作するため、非常に紛らわしい。3DRの正規品が入手できるのであれば、そちらで検証することを強く推奨
不明点
- PosHoldで使えるのか(現状では不可)
- オプティカルフローとGPSを同時使用できるか?(現状では不可。Fusionモードはまだ開発中)
- Can the sonar on PX4FLOW can be used as range-finder?
その他
- APM版のPX4FLOWファームウェアのソースコードは、普通にコンパイルしただけでは動かない。理由は不明
- アップストリームのPX4FLOWファームウェアも、ソースからビルドしてもAPM Copterでは動かない。OPTICAL_FLOW.flow_comp_m_x等の値が違っている
- 上記どちらも、APM側のOpticalFlow関連データがおかしいので、定義が変わったか、計算式が違うものと思われる(要ソースコード確認)。ただ、PX4FLOW単体のデータを見た場合は問題なさそうなので、余計不明
PX4FLOWファームウェアをソースからビルドする場合
NOTE: 以下はあくまでも参考まで。すくなくともAPM版はこの手順ではリリースと同じバイナリは得られない
git clone https://github.com/priseborough/px4flow/tree/klt_flow
# 又は
git clone https://github.com/PX4/Flow
make
make upload-usb
レファレンス
- http://copter.ardupilot.com/wiki/common-px4flow-overview/
- http://copter.ardupilot.com/wiki/arducopter-parameters/#log_bitmask_arducopterlog_bitmask
- http://ardupilot.com/forum/viewtopic.php?f=111&t=13672&sid=f3326958ca3891ee33c106abb1d139ed
- https://groups.google.com/forum/#!topic/drones-discuss/VgHuSh7Yjuo
- https://github.com/diydrones/ardupilot/issues/2832
- https://github.com/diydrones/ardupilot/issues/1672
- https://pixhawk.org/modules/px4flow
- https://pixhawk.org/dev/px4flow
- https://groups.google.com/forum/#!searchin/px4users/px4flow/px4users/GHsqunk3Pt4/a7szeP7vXDwJ