owhinata / etrobo_tr_ex3

Other
0 stars 0 forks source link

PIDのD制御を実装する #12

Closed owhinata closed 1 year ago

owhinata commented 1 year ago

@KodoRisei さん featureブランチができていたので、コメントです。 D制御の実装は、 #25 の対応が入った fedd2b8 をベースにしたほうがいいです。 git rebase fedd2b8 でリベースできると思います。

スクリーンショット 2023-08-14 18 33 39
KodoRisei commented 1 year ago

@owhinata さん リベースは完了したのですが、リベースしたものがシミュレータで動きませんでした。

またD制御を、 steeringAmount = P制御 + kd * (今回のdiff - 前回のdiff) / 処理周期 といった形で実装しようと思うのですが、処理周期に当たる部分がわかりません(そもそも必要ですか?) よろしくお願いします。

owhinata commented 1 year ago

@owhinata さん リベースは完了したのですが、リベースしたものがシミュレータで動きませんでした。

またD制御を、 steeringAmount = P制御 + kd * (今回のdiff - 前回のdiff) / 処理周期 といった形で実装しようと思うのですが、処理周期に当たる部分がわかりません(そもそも必要ですか?) よろしくお願いします。

@KodoRisei さん 動かないのは、どのレベルで動かない、ですかね? 例えば特に死んだりはしないけどスタートできないとか。。。 コンソールのログとかつけてもらえると何かわかるかもです。

処理周期は基本10msで、結構綺麗に10ms周期で動いているようです。 一定周期であれば kd に含めることもできるので不要ですね。 https://github.com/owhinata/etrobo_tr_ex3/blob/main/monitor/Uptime.h のgetUptime()でプログラム起動からの経過時間[us]を取得できるようにしています。 一旦 処理周期は無視して動かすことを目標にしてもらえると、どこかのタイミングでDriver経由でUptimeから経過時間を取得できるようにしておきますが、、、

owhinata commented 1 year ago

ちなみに steeringAmount = P制御 + kd * (今回のdiff - 前回のdiff) / 処理周期 はdouble精度で計算していますが、floatにしたほうがいいかもです。 上記以外にも全体的にdouble→floatとする必要があるかもしれません → #29

KodoRisei commented 1 year ago

@owhinata さん 言葉足らずで申し訳ありません。

Powered by TOPPERS/ASP3 RTOS of Hakoniwa Initialization is completed.. [ l_app runner: EV3RT is booted up ] [ l_app runner: EV3RT boot time: 0 secs. ] DEVICE_CONFIG_VIRTFS_TOP = __ev3rtfs 0x7ff7d04 Error: fopen(scenario.json) = 0 Initialize Start Scene 0 Walker: nil Detector: nil [ launcher: UIHttpServer start detected ] [ launcher: connected to UIcomm ] [ launcher: EV3RT is booted up, got it ] [ launcher: ready to start on left course ] [ launcher: waiting for calibration ] [ launcher: Go to the start, Ready? ] [ launcher: 3...2...1... ] [ launcher: Go!!!!!!!! ]

上記がログで、スタート位置から動きませんでした。

KodoRisei commented 1 year ago

@owhinata さん

cd workspace/simdist/etrobo_tr_ex3/__ev3rtfs ln -f ../../../etrobo_tr_ex3/scenario.json

すみません。こちらを失念しておりました。 動作確認できました。

KodoRisei commented 1 year ago

一旦 処理周期は無視して動かすことを目標にしてもらえると、どこかのタイミングでDriver経由でUptimeから経過時間を取得できるようにしておきますが、、、

承知しました。 まずは係数を調整して動くようにします。

owhinata commented 1 year ago

一旦 処理周期は無視して動かすことを目標にしてもらえると、どこかのタイミングでDriver経由でUptimeから経過時間を取得できるようにしておきますが、、、

承知しました。 まずは係数を調整して動くようにします。

とりあえず #30 作っておきました。

owhinata commented 1 year ago

@KodoRisei さん 時刻の取得ですが #32 で Walker::getUptime()で起動時間を取得できるようにしておきました。

ただしusをsecに変換しようとして↓のようなことをすると、謎な結果になるので注意してください。

スクリーンショット 2023-08-15 9 10 47

整数をdoubleにキャストすると変なことになるみたいです。 ↓のようにいったんfloatにキャストしてdoubleにしてあげれば大丈夫みたいです。

スクリーンショット 2023-08-15 9 17 42

シミュレータ固有の問題だと思いますが注意してください。

owhinata commented 1 year ago

ちなみに同じことですが double duration = duration_us * 1e-6 はNGで、 double duration = duration_us * 1e-6f はOKです。

最初のほうは1e-6がdoubleなので、duartion_usをdoubleに暗黙的にキャストしているのでNG. 二つめのほうは1e-6fがfloatなので、duration_usをfloatに暗黙的にキャストしているのでOK.

owhinata commented 1 year ago

@KodoRisei さん

カーブの入り口のところ、かなり安定しましたね!

ちなみにI制御もやります? https://github.com/owhinata/etrobo_tr_ex3/blob/feature/d_control/%2312/walker/LineWalker.cpp#L94

ダブルループのループのところとか、黒部分にめり込んで走行していたりするのでそれなりに効果はあるかと思います。

KodoRisei commented 1 year ago

@owhinata さん

カーブの入り口のところ、かなり安定しましたね!

実機でもカーブの安定感が増したように感じます!

ちなみにI制御もやります?

作業の進捗的に問題なければチャレンジしたいなと思っています。