2021年11月10日水曜日

C++ forkとパイプ

 フライトコントロールの制御ループは、ミリ秒単位の周期になる。C++のスレッドで簡単にできそうだったが結局うまくいかず、forkコマンドで子プロセスを作って動かしている。


途中、親から子プロセスのパラメータを変更するときにパイプ機能を使うことになった。一つハマったのが、パイプはforkする前に作らなければならないことだ。

2021年10月11日月曜日

ESCを経由したモーター制御

 ドローンを制御する一番基礎はモーターのコントロールだ。

ということで、この間かなり徹底的に、ラズパイからのモーター制御を試みてきた。そして、その細かいところまで要約できたようなので、次の姿勢制御の問題に移っている。

そこで、モーター制御のポイントをここに書いておこう。ラズパイから、I2C経由で、PCA9685を制御し、そこでPWM信号を生成しESCを制御するというのが基本的流れだ。PCA9685は、ハード的にパルス信号を生成する。

このパルスの周波数を指定しなければならないが、オシロスコープでしらべると、PixHawkは400Hzを使用していることがわかった。したがって、周期は2.5msである。2500マイクロ秒ということになる。この周期の中で、パルスのONの期間の長さがモータの強さとなる。これは、PixHawkの場合、1000マイクロ秒までが、モーターが動かないパルスはちょうとなている。そして、1250マイクロ秒が出力0%で、2000マイクロ秒が最大である。

このことをESCに記憶させなければならないが、これがキャリブレーションである。

このあたりのことは、

https://team432.jpn.org/?p=272

で、勉強させていただいた。

周波数などはPCA9685に設定できる。

実際は1250マイクロ秒が0%出力ではなく、1300マイクロ秒にするとようやく起動する。

2021年10月1日金曜日

RaspberryPIとMPC23S17の接続

 距離センサーを5個、raspiに接続しようとして、GPIO拡張用のMPC23S17に繋げようとして時間がかかったので、ここに記録しておこう。








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に変更できた。


ピコをudevを制御して区別する

 システムで、dshot信号を作るのをpicoでやらせていた。UARTの使用の関係で、pico1台で、2つのモータに信号を送っていたので、2つのpicoを使っていた。それまでは、pico二信号を送って、あなたはどちらのpicoですかと問い合わせして、その答えを聞いて /dev/t...