2021年9月20日月曜日

MAVSDKとMavLink

 今日わかった大切なことを記録しておく。

PX4というのは、複雑なシステムで、例えば https://slideplayer.com/slide/17893046/ からお借りした図を貼り付けると、



こんな感じになるようだが、ぱっと見わかりにくい。フライトコントローラーをどうやってコンピュータから制御するのかというのがポイントだが、QGroundControllerからでも一部できたりするし、MAVSDKにはより詳しいコマンドが掲載されている。しかし、今日わかったのは、MAVSDKとかQGroundControllerよりも基礎的なコマンドシステムになっているということだ。

今日までは、まあ、詳しいリファレンスのあるシステムである、MAVSDKで必要なプログラムを書こうとしていた。まあ、実際書くことはできる。しかし、たとえば、フライトモードの変更は、MAVSDKではできないと思う。散々調べてもできそうになかった。

フライトモードの変更は、PixHawkを使う上ではとても大事だ。もちろん、プロポやQGroundContoroller(以下QGCと略す)を使えば、簡単にできるのだが、それでは納得いかないのだ。QGCを使うためには、その間、PixHawkとUSB接続しておかなければならない(Wi-fiでもできるものもあるのだろうが)。プロポを使わなくてもいいシステムを考えているので、これもだめだ。そうなると、いまのフライトモードがなんであり、別のフライトモードにセットするのはどうしてやりのだということになる。QGCができるということは、どこかにそのコマンドがあるはずなのだ。QGCのソースを調べればその辺りはわかるのだと思うがそれはやっていない。

それで、今日調べたら、また、MavLinkでそれができるのだ。というか、MavLinkでは、PixHawkにMAVSDK以上に、詳細なコマンドを送ることができるのだ。それは、

https://mavlink.io/en/mavgen_c/example_c_uart.html

ここにあるサンプルを見てわかった。これは、実際に、PixHawkにUSBのシリアルポートを通してつながっているRaspberryPIでコンパイルできて、PixHawkにコマンドを送ることができたのだ。

Mavlinkライブラリというのは、ヘッダーファイルしかないという一見変なものなのだが、それは、整数値を持つコマンドが定義されていて、それを使ってすぐにコマンドをシリアルポート経由で送ることができるということなのだ。

それがわかって、なるほどと思った。MAVSDKを使うのはやめて、MavLinkでシステムを作ろうということになったわけだ。

2021年9月12日日曜日

Node.jsのSocket.ioによる接続とC++の呼び出し(2)

 基本は、先の記事の後者の方、つまりNode.jsからC++を呼び出すシステムを基礎に、そこに前者のSocket.ioのシステムをかぶせる方法にしている。

(1)projectの作成

npm init -y

でプロジェクトを作成し、モジュールをインストールするが、そのときにSocket.ioをかぶせるときに必要になる、socket.isとNodeによるウェッブサーバーのexpressのモジュールもインストールするとよい。

npm install node bindings node-addon-api socket.io express

となる。ただし記事では、上記のようにnodeのモジュールも入れることになっているが、これを入れるとモジュールがバカでかくなる。先にnode.jsをしっかりインストールしてあれば、これを入れなくても動くはず(私は入れていない)。

まず、解説の例をしっかり動かしてみることが大事だ。そうすると、一体何が効いているかが見えてくる。



Node.jsのSocket.ioによる接続とC++の呼び出し(1)

 iPhoneやAndroidによるドローンへの接続をやめた。アプリストアに媚びるよりも、webをつかって自由にドローンをコントロールできたほうが良いと考えた。また、そうすれば、4Gあるいは5Gによる接続も簡単になる。

ドローンにRaspberryPIを積んでいるので、wifiの届く範囲でスマホやパソコンとつなげることは簡単だ。ただ、ドローンのコントローラーはPixhawkを使うので、それをコントロールするためのMAVSDKはC++のプログラムで書かなければならない。MAVSDKのマニュアルにはSwiftやJavaも使えるということが書いてあったが、どう使うかがわからないし、MAVSDKはC++で書いてあるので、結局はそのwrapperに依存した限界が出てきそうだから、C++で制御プログラムを書くべきだと思った。

webのJavascriptから単に、C++のコマンドを発するのは、Ajaxなどの方法を使えばできるが、コマンドを発するたびにいちいちPixhawkに接続するのは、ドローンの細かい制御をする上で困難な方法となる。要するに、一旦接続したら、その接続が維持される必要があるのだ。

こう考えたとき、RobotのNaoのことを考える。Naoは、何年も使っているが、これを実現しているのだ。自分で、C++のライブラリを使って、それをJavascriptから呼び出すインターフェイスが提供されている。何年も使っているのに、どうやってこれを実現しているのかがわからなかった。どうも、Javascriptのファイルの中にその秘密があるとわかったのだが、そのファイルはテキストファイルだが、圧縮されているので、簡単には読み出せない。

あらためて、それを一瞥するとSocket.ioという単語が取れた。SocketというとC++などのSocket接続が思い出され、常時接続状態にできる。ということで、調べると、Socket.ioというのは、Node.jsのライブラリであることがわかった。あとは、Node.jsとC++がつながれば、目的としているものが実現できる。

そして、Node.jsとC++は、見事に接合できるのである。

結局、Node.jsによるSocket接続については、以下のサイトの記事。

https://blog.katsubemakito.net/nodejs/socketio/realtime-chat1

さらに、Node.jsからC++を呼び出すための方法については、以下のサイトの記事。

https://qiita.com/NA_simple/items/27999c8c0a605ef3314b

この2つの記事で、ほぼ実現できた。後者については3つの記事に分かれていて、それをすべて理解しなければならない。で、最後の記事にある共有ライブラリを使って接続する方法を採用した。

作成したシステムについての説明は次の記事(2)に書く。


2021年9月11日土曜日

離陸高度のパラメータ変更

 屋内ドローンにとって離陸するときの高度はとても大事だ。Pixhawkはデフォルトで、2.5mになっていて、この部屋でそれだけ飛ばれたら、天井にぶち当たってしまう。Mavsdkの中にこのデフォ流値を変更する関数があるか何度も調べたが見つからない。となるとQGroundControlとなる。このパラメータの中を結構何度も調べたのだが数がありすぎて見つからなかったが、パラメータ検索で、"altitude"としたら見つかった。MIS_TAKEOFF_ALTである。そしてようやく1mに変更できた。


2021年9月9日木曜日

RaspberryPI4のWifi固定アドレス設定について

 RaspberryPI4は、最初からネットワーク、特にWifi設定で苦労している。ドローンに乗せている状態では、wifiのアドレス固定は必須なので、いい加減にできない。

問題は、IPを固定しないと、うまく行くのだが、固定するとrouteで、ネットワークすら出てこなくなって接続不能になるという現象だ。

固定IPにするには、(1)/etc/dhcpcd.confにマニュアルで設定するのと、(2)右上の無線ランのアイコンを左クリックして、セッティングする方法と2つある。いろいろ苦労をしたが、いま、現状でうまく行った方法だけを書いておこう。

それは、(2)の方法で、interfaceのwlan0にIPアドレスと、ルーターとDNSを設定するとともに、SSIDの方にも”Automatically configure empty options”のチェックを外した状態で、同じ情報を入れて、適応をクリックすることだ。すぐにリブートすると、ifconfigでも、routeでも正しい情報が表示される。そして、当然だが、ネットワークにも正常に接続される。

現状で、/etc/dhcpcd.confには、次の設定が書かれている。

interface wlan0
static routers=192.168.10.1
static domain_name_servers=192.168.10.1
SSID ecostation
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

つまり、両方書かれているということだが、なぜか、このSSIDのほうが、以下何度も繰り返されている。理由は不明だ。今後も状況をチェックしていきたい。

2021年9月8日水曜日

ESCのキャリブレーションとMotor Test Deniedにへの対応

安全テストを飛ばして、強制的に離陸コマンドを送っても一つのモーターが動かなかった。結局、ESCの問題というところまでは切り分けたが、ESCを変えるしか思いつかなかった。しかし、色々調べたら、ESCのキャリブレーションが必要ということがわかった。もしかしたらと思ってやってみた。

やり方は、QGroundControlで、バッテリーを出すと、そこにESCキャリブレーションと出るので、指示どうりやればすぐに終わる。

また、その後に、QGroundControlでモーターテストをやろうとしたらMotor Test Deniedがでてきた。これにはウェッブでGPSを認識していないようだということがわかり、設置の後にsecurity switchを押すことが必要だとあった。

https://discuss.px4.io/t/motor-test-command-denied/19168

その後離陸コマンドを送ったら、見事全プロペラが回転した。


2021年9月1日水曜日

Raspi4 から PixHawkにコマンドを発給できた

 先の記事で示した離陸コマンドをフライトコントローラーをラズパイにつなげて送信させる。

そのためには、両者をUSBのシリアルポートを使って送信しなければならない。またそのためには、USBシリアルポートを有効化しなければならないのだが、この有効化の手順については、以下のサイトを参考にさせていただいた。

https://tomosoft.jp/design/?p=24354

こののち、作成したプログラムの引数にポートを次のように指定して送信。

$ ./takeoff_and_land serial:///dev/ttyACM0

指定の仕方が複雑だ。USBポートの /dev/ttyACM0 は有効化する前は見えていなかったものだ。
この様子は、ツイッターに以下のように投稿しておいた。


これでシステムの太い道が開けた。

RspberryPi 4 によるPixHawkの制御

 この間、DJIのMobileSDKに翻弄されて、iPhoneからAndroidoに変えようと思ったが、また、同じようなことは起きそうなので、そういうアプストア系のやつを頼らないことにした。そのためさしあたってドローンを自作する。コントローラーまで自作できないので、これはPixHawkを使い、機上に載せたRaspberryPi (以下 Raspi)で制御する。という道筋を考えた。

ただ、このPixHawk用ののSDKでRaspiのプログラムを開発するのがとても面倒。まず、開発ツールの全体構成が複雑で、広範囲で何がどうなっているのかがわからない。

まず、PixHawkに乗っているシステムの全体は、

https://docs.px4.io/master/en/

ここに掲載されている。そして、このPixHawkと、OnBoardコンピュータとの接続はMavLinkというシステムが担っている。

https://mavsdk.mavlink.io/main/en/index.html

どちらにも開発者が何をやるべきかが書かれているが、これから自分にとって必要なのはなんであるかを理解するために2日くらいかかった。

更に最も頭を悩ませたのは、これらのシステムの開発でLinux系のライブラリが作られているCPU周りのアーキテクチャとRaspiのアーキテクチャが異なっていることだ。

そのため、Raspiから、簡単なコマンドを作成して、Pixhawkに贈ろうとしても、プレコンパイル済みのライブラリを使おうとすると、エラーになって実行できない。簡単な離陸コマンドのコンパイル方法は以下にある。

https://mavsdk.mavlink.io/main/en/cpp/quickstart.html

結局、ライブラリから作り直さなければどうにもならない。

その過程で、Raspiを諦めようかとも思った。

しかし、ライブラリのソースがコンパイルできることがわかった。そのことの書いてある場所が分かりづらい。

こんなところにあった。

https://mavsdk.mavlink.io/main/en/cpp/guide/build.html

まず、ここからライブラリを作成して、インストール。ただし、公開する前はデバック用のライブラリにしておきなさいと書いてあったのでそうしておいた。また、いつかリリース版のライブラリをコンパイルし直さなければならない。

それで、先の簡単な離陸コマンドをコンパイルした。そして無事にRaspi上で、動いた。


PixHawkとつなげてないので、つなげなさいというメッセージが表示されている。
つなげる部分は、それはまたそれで面倒なので、また別の記事にしたい。今日は、コンパイルできたことの喜びに浸る。これができればいろいろ展望が開けるのだ。


DJI MAVIC MINIのFPVライブ動画をiOSのVisionframeworkで顔認識させるという話

 iOSでは、他の方法もあるが、Visionframeworkは、いろんなことができるので、これでなんとか顔認識させようとここ2,3日没頭していた。ようやく、 こんな感じで、緑の枠で認識画像をリアルタイムで表示できるようになった。 (プログラムの全体は、最下段に掲げてある) 途中...