いろいろと振り返って、改善ポイントをまとめると以下のとおりです。
本体
- 重心は車軸の上に。出来るだけ重心上にものを集めて、重量物なモーターや電池は軸下に配置し、モーターが出来るだけ軽い力で制御できるようにする
センサー
- 生データのドリフトやばらつきは、しっかりフィルターで除去する
- あまりフィルターかけすぎると、遅延が発生するので精度と応答速度のバランスが重要
モーター
- DCモーターは、電圧をかけてからトルクが出るまでに時間を要する(200-300ms)
- 電池の状態は、常に気にしないと充電したてと放電してからでは制御パラメータが異なる
制御プログラム
- 単一ループでセンサー読み取り→モーター駆動するとモーター駆動間の待ち時間に処理が止まる。センサー読み取りとフィルター処理部分とモーター駆動処理は別のタスクにした方がうまくいくかも(未確認)
まずは、センサーの見直しというか、他のセンサーはどんな動きなのかというのを調べるために2つ新たに購入しました。
左はKXSD9-2050(秋月で720円)、右はMPU-6050(Amazonで320円)とAmazonの方がお安いですが、カメラやビデオの手ブレ補正に使われてるらしく数が出ているものだと思います。
まずは端子を半田付けします。
接続はI2CなのでVCC,GNDとSDA,SCLの4線です。レギュレーター内臓なので、VCCは5V,3.3VいずれでもOKです。
まずはMPU6050から動作確認のためESP32と接続します。
micropythonのライブラリを探して、出力されているところまでは確認しました。
あとは、師匠に教えてもらったMadgwickフィルターを調べて、LPFと動きの違いを検証してみたいと思います。
micropythonとArduinoコンパイラの速度を簡易的に比較してみました。単純ループの比較なので、プログラムの内容如何では、違った結果になると思います。この比較では、約30倍程度の差が出ました。参考まで、、、
返信削除---------------------------------------------
ESP32 micropython
---------------------------------------------
>>> import time
>>> for i in range(10):
... start = time.ticks_us()
... delta =time.ticks_us()- start
... print (delta)
...
109
30
30
29
30
30
30
29
30
30
----------------------------------------------
ESP32 Arduino
----------------------------------------------
iint i;
int start ;
int delta;
void setup() {
Serial.begin(115200);
}
void loop() {
for (i = 0; i < 10; i++) {
start = micros();
delta = micros() - start;
Serial.println (delta);
}
while (1);;
}
2
1
1
1
1
0
1
1
0
1
なるほど、インタプリタはやはり処理に時間かかるのですね。センサー調べたらその辺も検討します。
返信削除