2025年7月3日木曜日

RaspberryPi5にQtCreatorをインストールした

 RaspberryPi4には、3で使っていたSDカードを援用していたので、QtCreatorをどうインストールしたか忘れていた。ときどき、さらのSDカードを使って、Qtを入れようとしたが、ことごとく失敗した。

今回、4号機の、電源配線をミスして、ラズパイそのものやIMU、無線ユニットなどを全て壊してしまった。数万円の損をした。色々考えた末、期待の乗せるラズパイを5にすることにした。グラフィックユーザーインターフェイスは、QtをあきらめてJAVAにしようかとも思った。JAVAは、よほど使い慣れている。だが、期待の基本システムはすべてC++で書いていて、メインのシステムはそのライブラリになっている。JAVAからC++のライブラリを呼び出すのはとてもとても面倒くさい。やはり、Qtでなければならないと、最新のQtをソースからコンパイルして、言い訳できないようにしようと考えた。

参考にするサイトは、かかっこさんの

https://note.com/bsoft/n/nadcad4db7454 Qt開発環境をソースコードからビルド(ラズパイ5)

にした。参考といういよりも、これそのものを実行すれば良いと判断した。QtWebEngineは、コンパイルに一週間かかるということなので、当然スキップなど、6のサンプルなど省略できるものは省いた。

このサイト通り行かなかったところだけは以下に示しておく。

(1)qt-everywhere-src-6.7.0.tar.xzは、なぜか消えていた。ので、qt-everywhere-src-6.9.1.tar.xzという、この時点で最新のものにした。サンプル絡みでエラーが出たので、それを排除してコンパイルした。

(2)qt-creator-opensource-src-13.0.0.tar.gzをダウンロードして、コンパイルしていたら、createという関数のリターン値が不整合というエラーで止まってしまった。細かいことなので、大きなところは間違っていないようだったが、コンパイルできなければ話にならない。6のバージョンを最新のものにしたからだと思った。だから少し古いものを入れ直そうかと、一瞬思ったが、あのコンパイル時間の長さをもう一度体験する気にならなかったので、creatorの方を最新のqt-creator-opensource-src-17.0.0.tar.gzにした。これでうまくコンパイルがしのげた。

(3)これが最も重要なものかもしれない。いざ全て整って、プロジェクトを作成しようとしたとき、非Qtのプロジェクトは難なく作成して、実行できたが、WidgetのGUIプロジェクトを作成しようとしたら、キットが見つかりませんというエラーになった。このエラーには何度も出会って、インストールを諦めた経緯がある。今回は、先の参考サイトを基本的になぞってきたので、そうかんたんには諦めるわけには行かなかった。色々やった結果、Qtのバージョン設定をやったら、解決した。

設定は、まず、編集のPrfferenceから、キットの設定画面を開く。Qtバージョンのタブで、追加をクリック。ここでは、Qt5とQt6の2つのバージョンが使えるようになっているので、それぞれを追加する。追加の仕方は、追加のボタンを押すとファイルの選択になるので、Qtがインストールされているフォルダにある、binフォルダのqmakeを選択すると、そのバージョンが追加される。追加した後に、キットのタブで、Qtバージョンのドロップダウンリストに、それぞれのバージョンが選択できるようになるので、必要なバージョンを選べばよい。これで、キットがないというエラーは消えた。

 ただし、上記以外の方オフでインストールした場合は、この方法は役立たない。

2025年5月30日金曜日

プロペラ回転面の方向を直接変化させ機体を安定させる

 複数プロペラドローンの機体の安定は、PID制御などによってプロペラ相互の回転速度を変化させることで実現してきた。ここでは、回転速度は一定のまま、プロペラの回転面の方向を変えることによって実現できないかを少し考えてみたい。

とは言っても、ヘリコプターは、実質回転面を変化させているので、すでになじみの方法なのかもしれない。そこで、まず、プロペラが一個にして状況を単純化しこのことを考えてみたい。

次の図を見ていただきたい。


ここで、OMは、長さLの質量を無視できる房であるとしよう。ドローンの機体を抽象化したものだ。機体は、位置が固定しているO点を支点として回転するのみである。Mにモーターとプロペラがありがあり、プロペラの回転面はMを支点に自由に動かすことができるとして、その回転面は直線PQで表されている。プロペラの回転面は、機体に対して垂直な状態が基準である。機体OMは垂直に立っている状態が基準となる。そこからの機体の傾きを図の$\theta$ で表される。また、機体のプロペラ面の基準状態からの傾きは、$\varphi$で表されている。

機体の質量は点Mに全て代表して存在し$m$で表される。重力加速度をgとしよう。M点の運動方程式を考える。プロペラの回転数は一定で、そのスロットルは一定の力$T$で表されるとしよう。

また、二つの角度$\varphi$と$\theta$は図の方向が正の方向であるとする。

$mL\frac{d^{2}\theta}{dt^{2}}=mg\sin\theta-T\sin\varphi$

となる。今、プロペラ面の角度を制御するスキームとして、次の式を考える。

$\varphi=\delta\theta$

つまり、機体の傾き角度に応じて一定の係数$\delta$をかけてプロペラ面を制御するというものである。このとき、運動方程式にこの式を代入し変形すると、次のようになる。

$\frac{d^{2}\theta}{dt^{2}}=-(\frac{T}{mL}\sin\delta\theta-\frac{g}{L}\sin\theta)$

今$\theta$が微小にのみ変化すると仮定すると、次のように近似できる。

$\frac{d^{2}\theta}{dt^{2}}=-\frac{1}{L}(\frac{T\delta}{m}-g)\theta$

すなわち、$\delta$が右辺の括弧内を正にする大きさであれば、これは単振動になる。逆に小さければ、重力に負けて落下する。

この制御では、機体の傾きを十分補正するようにプロペラ面の傾きを与えれば、機体は一定の揺れを繰り返した状態で定常状態になるわけだ。しかし、それでは安定しているとは言えない。

安定させるためにどうすればいいか考えよう。

傾きの角度に対する微分制御を加えたスキームに変更しよう。すなわち、

$\varphi=\delta\theta+\eta\frac{d\theta}{dt}$

である。運動方程式は、次のように変形できる。

$\frac{d^{2}\theta}{dt^{2}}=-(\frac{T}{mL}\sin(\delta\theta+\eta\frac{d\theta}{dt})-\frac{g}{L}\sin\theta)$


右辺のカッコ内の第1項を三角関数の加法定理を使って変形すると次のようになる。

$\frac{d^{2}\theta}{dt^{2}}=-(\frac{T}{mL}(\sin(\delta\theta)\cos(\eta\frac{d\theta}{dt})+\cos(\delta\theta)\sin(\eta\frac{d\theta}{dt}))-\frac{g}{L}\sin\theta)$

今、$\theta$が微小な範囲でのみ変化するとして、$\sin\beta\sim\beta, \cos\beta\sim 1$という近似を持ちいると、

$\frac{d^{2}\theta}{dt^{2}}=-(\frac{T}{mL}(\delta\theta+\eta\frac{d\theta}{dt})-\frac{g}{L}\theta)$

単振動にはならないので、二階同次微分方程式の形にしておこう。

$\frac{d^{2}\theta}{dt^{2}}+\frac{\eta T}{mL}\frac{d\theta}{dt}+(\frac{\delta T}{mL}-\frac{g}{L})\theta=0$

この微分方程式は、同次式になっているので解析的に解くことができるが、煩雑かつそれほど必要でもないのでやめておこう。

はっきりしているのは、$\delta$が十分な大きさを持つことを前提にすると、これは簡単に言えば速度に比例した摩擦が発生する錘のついたバネの振動になり、一方的にか、振動しながら元の状態に収束する。つまり、機体を安定させることができるわけである。

結論的に、プロペラ平面を制御する適切なスキームを与えれば、機体を安定させることができる。

2025年3月2日日曜日

向かい風によってドローンの頭が上げるpitching moment に関する論文を読む

 Reduction of the head-up pitching moment of small quad-rotor unmanned aerial vehicles in uniform flow (2018, Hikaru Otsuka, Daisuke Sasaki and Keiji Nagatani, International Journal of Micro Air Vehicles 10-1)

https://journals.sagepub.com/doi/epub/10.1177/1756829317745318

という論文を読んだ。中身は、飛行体に対して向かい風が吹いてきた時に発生するpitch方向のhead up不安定性がドローンのローターの傾きを変えた時にどうなるかを調べている。

さまざまな実験を行った結果として、結論的に、モーターの向きを外側に向けて開くことによってその不安定性を低減できると主張している。

"Based on the experimental results, we conclude that rotor tilting to the outer side reduces pitching moment generation."

私の書いた前の記事の議論と整合的であるので嬉しい。

モーター平面をV型(inward tilt)にするとドローンの安定性は増大するか?

 概要

ドローンのモーター平面をV型に傾けるとより安定するといわれているようだが、理論的には、逆Vにした方が安定することを示す。


本文

あるYouTube動画を見ていたら、モーター平面を内側に傾ける(inward tiltというらしい)とドローンの安定性は増すのだという説明があった。聞いた一瞬はとても納得して、既存の大型のドローンのモーター平面がそうなっている理由がわかった気がした。しかし、理論的に考えて、本当にそうなのかと思った。

自分なりに考えてみた結果一概にそんなことは言えないような気がした。その理由を説明しよう。





図を見て考えみよう。単純化して、AOBで表されるのが、ドローンの機体を一方向から見た状況だと考えよう。機体の垂直方向は、Vで機体は右に少し回転した状態で、傾いている。モーターの平面は、内側に折れるように傾いていて、その傾き角度はβである。
両翼の長さは、それぞれ$l$である。

この状態で、復元力が、このモーター平面の傾きによって発生すれば良いわけである。
面倒なので、一番単純に考えてみる。
(1)機体の中心Oは、固定されている。ただし、自由に画面と水平に回転できる。
(2)機体の片側の重さ$m$は、モーターの場所に集約されている。
(3)モータの上昇力、スラスト$t$は、重さで測られ片側の重さと釣り合っている。
すなわち、$$t=m$$である。
今、A点における力のバランスを見てみよう。
動画では、復元力が発生する理由を、A点では、傾いているせいで、そこにかかる重力に比べて、上昇力が$$t\cos\beta<t=m$$となってしまっていて、下向きの力が大きくなっているからだと説明していた。
だが、それは、傾いているが故に発生する右向きの力を無視している。さらにmが働いている腕の長さも短くなってしまっていることを忘れているのではないだろうか。
そこで、A点において、左向きに回転する力(傾きを復元しようとする力)と、右向きに回ろうとする力(傾きをさらに増大させようとする力)のバランスを調べてみよう。
左向きに回転しようとする力と、腕の長さを掛け合わせたトルクは、
$$(m-t\cos\beta)l\cos\beta$$
である。
一方、さらに右向きに回転しようとするトルクは、
$$t\sin\beta l\sin\beta$$
である、
左向きの回転力から右向きの回転力を差し引く
$$ (m-t\cos\beta)l\cos\beta-t\sin\beta l\sin\beta$$
$$ = ml\cos\beta-tl\cos^{2}\beta -tl\sin^{2}\beta$$
$$ = ml\cos\beta-tl$$
$$ = l(m\cos\beta -t)$$
$$ = lm(\cos\beta-1)$$
$$ < 0$$
(ただし、ここで$t = m $を使っている)
この結果は、安定化するどころか、不安定性を増加させるという結論だ。
どこか、考え方が間違っているだろうか?

簡単な練習問題になるが、モーター平面が、逆に、下に開いたVの形をしていると、安定性が増すようなバランスになることがわかる。式の変形はそのままで良い。ただ、下向きの場合は上の式が負になるのは、復元力が働く、右回転することを意味するからだ。

ここで、もしかすると今までの議論が、ドローンの腕そのものが傾いていることに依存しているのではないかと疑問が湧いてきたので、さらに調べてみた。

次の図のように、腕そのものは傾いていず、まっすぐで、モーターだけが傾いている状況を考えてみよう。
今、モーターの傾きは、$\alpha$で、機体が$\beta$だけ傾いている状況を考えてみよう。他、腕がまっすぐになった以外は、前と同様の条件である。

次のような単純化を行おう。
(1)モーターの傾きと、機体の傾きがちょうど同じになった状態を考慮する
(2)その状態で、B点のスラストと重さのバランスは釣り合っている。すなわち相変わらず、$t=m$を想定する。
この状態で、左回転のトルクが発生すれば復元力があることになる。

ただ、これは計算をするまでもなく、先の機体の腕が傾いている状況の分析で$\beta$を$2\beta$にしただけで、計算過程は同じである。従って、結論も同じである。

機体の傾きが、前のモデルと同じでも、モーターが傾いているだけ、不安定性は増す可能性がある。また、逆向きにモーターが傾いていると、安定性は増加する。

2025年2月15日土曜日

3号機、ホバリングのログ解析

 3号機のホバリングの様子は、以下のYoutubeに投稿した。

https://youtu.be/ZYVSvt3-ws4

3回、試みているが、それぞれ様子が違う。ログを見てみる。まず、コントローラーから送っているスロットル値とPID制御によって与えられたスロットル値の様子は、以下のようになっている。


1回目は、全体が安定しているが、2回目と3回目は、後半が不安定になっている。

1回目の離陸では、1600くらい、80%で離陸している。そして、PID制御によるスロットルの変動の最大幅は、400前後である。合計すれば2000前後である。スロットルの最大値は、2047だからぎりぎりなのである。

次のグラフは、機体の傾き、ROLLとPITCHの様子と、PID制御のスロットル値の様子が、2回目と3回目は、機体の傾きに対して、極端なPID制御値が必要になってい。ので無理が表れている。




これでは見にくいかもしれないので、第1回目の離陸だけを取り出して詳しく見てみる。


太い青の線がROLLで、太い緑の線がPITCHだ。それぞれの目盛りは右側に示されていて、値は度である。モーターの番号は、前が北として、北西がモーター1(細い青線)、南東がモーター2(オレンジ細線)、南西がモーター(灰色)、北東がモーター4(黄色)である。赤で囲ったところを見てみよう。ロールが正で、ピッチが負である。ロールが正なので、2と4のスロットルを上げる必要がある。一方、ピッチが負なので、2と3のスロットルを上げ、4はスロットルを落とさなければならない。結局、しっかりスロットルを上げる必要があるのは、2で、しっかり落とす必要があるのは、1という事になる。図はその通りになっている。PIDは、よく反応しているのだ。


2024年12月7日土曜日

立ち上がらないraspberrypiのネットワーク

 raspberrypiのネットワークが立ち上がらなくなってしまっていた。差し当たって必要ないのでほっておいたが、今日、いろいろ調べてみた。

結局、raspi-confgで、network Configure をdhcpcdから、networkmanagerに変更したら立ち上がるようになった。理由は、わからない。

2024年8月15日木曜日

起動しないraspberrypiの修復

 前日の終了の仕方が悪かったのか、raspberrypi が起動しなくなった。You are in emergency mode・・・・・・を限りない感じで繰り返している。

https://www.jh4vaj.com/archives/26989

このサイトを参考にした。

WindowsにいれたVirtualboxのraspberryで問題のSDカードを認識させて上記サイトの最後の方にある、e2fsckをbootではなくファイルシステムの方に実行した。全てyesで、終了させる。再度起動させたら、正常起動した。ほっと胸を撫で下ろした。

RaspberryPi5にQtCreatorをインストールした

 RaspberryPi4には、3で使っていたSDカードを援用していたので、QtCreatorをどうインストールしたか忘れていた。ときどき、さらのSDカードを使って、Qtを入れようとしたが、ことごとく失敗した。 今回、4号機の、電源配線をミスして、ラズパイそのものやIMU、無線ユ...