Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[IMU]Frequencyを上げると値が不安定になる #156

Open
o-tatchan opened this issue Apr 18, 2024 · 8 comments
Open

[IMU]Frequencyを上げると値が不安定になる #156

o-tatchan opened this issue Apr 18, 2024 · 8 comments

Comments

@o-tatchan
Copy link
Contributor

o-tatchan commented Apr 18, 2024

連投失礼します。
岡本と申します。

IMUの不具合報告になります。

IMUのFrequencyパラメーターを100以上に設定すると、速度・角速度の値が実際の値よりも大きく、また不安定になりました。

ご確認お願いいたします。

(以下に、速度・角速度それぞれの再現方法と動画を追記します)

@o-tatchan
Copy link
Contributor Author

o-tatchan commented Apr 18, 2024

速度の具体的な再現方法と動画を追記します。

再現方法:
①Unity 標準のCubeオブジェクトを準備し、その中心部にIMU prefabを組み込む。
②IMUのFrequencyパラメーターの値を100Hz以上に設定する。
③Cubeに、一定速度で移動するようなスクリプトをアタッチする。

IMU_freq20_vel.mp4
IMU_freq100_vel.mp4
IMU_freq1000_vel.mp4

上の動画は、Cubeの速度をX軸正の向きに1[m/s]と設定したもので、IMUのFrequencyを上から順に20,100,1000と変化させたものです。

20Hzでは、IMUの速度のx成分はほぼ1[m/s]であり、期待通りの値といえます。
100Hzでは、IMUの速度のx成分はおよそ1[m/s]ですが、0.4[m/s]や3[m/s]のときもあり、値が安定しません。
1000Hzでは、6~10[m/s]と明らかに間違った値になります。

@o-tatchan
Copy link
Contributor Author

o-tatchan commented Apr 18, 2024

角速度の具体的な再現方法と動画を追記します。

再現方法:
①Unity 標準のCubeオブジェクトを準備し、その中心部にIMU prefabを組み込む。
②IMUのFrequencyパラメーターの値を100Hz以上に設定する。
③Cubeに、Y軸回り一定角速度で回転するようなスクリプトをアタッチする。

IMU_freq20_rad.mp4
IMU_freq100_rad.mp4
IMU_freq1000_rad.mp4

上の動画は、Cubeの角速度をY軸回りに3.14[rad/s]と設定したもので、IMUのFrequencyを上から順に20,100,1000と変化させたものです。

20Hzでは、Y軸回りの角速度はおよそ3.1[rad/s]で、本来の値に近くなっています。
100Hzでは、角速度は同じく3[rad/s]あたりですが、値がかなり不安定です。
1000Hzでは、角速度15[rad/s]あたりと、明らかに大きな値になっています。

@Autumn60
Copy link
Contributor

Autumn60 commented May 2, 2024

@o-tatchan

Issue報告ありがとうございます。
現在UnitySensorsを実行できる状況にないため確認は出来ませんが、現行(master, develop)のスクリプトにいくつかの問題点を見つけたため、ここに修正を記しておきます。

  1. https://github.com/Field-Robotics-Japan/UnitySensors/blob/develop/Assets/UnitySensors/Runtime/Scripts/Sensors/IMU/IMUSensor.cs#L61
    _rotation_tmpを使うべき計算が_rotationを用いている。

  2. https://github.com/Field-Robotics-Japan/UnitySensors/blob/develop/Assets/UnitySensors/Runtime/Scripts/Sensors/IMU/IMUSensor.cs#L51
    FixedUpdate()ではなくUpdate()に変更するべき。
    private void FixedUpdate()をprotected override void Update()に置き換え、関数内の最終行にbase.Update();を追記。

@o-tatchan
Copy link
Contributor Author

岡本です。

私の使用していたUnitySensorsは現行版ではないようでした。 (使用version: 2.0.0)
申し訳ございません。

現行版(2.0.4)で同様の実験をしたところ、次のような結果になりました。
 速度:どのfrequencyでもおおよそ期待通りの計測値を得る。
 角速度:frequency=20でも計測値が安定せず、さらに大きくすると計測値がzeroになってしまう。

また、2点の問題点(_rotation と FixedUpdate())の修正を試したところ、次のようになりました。
 速度:どのfrequencyでも本来の5分の1程度の値が出るが、ある程度安定している。
 角速度:どのfrequencyでも本来の5分の1程度の値が出るが、ある程度安定している。

なお、別issue (#155) の問題は継続して発生しています。

以上、よろしくお願いいたします。

@o-tatchan
Copy link
Contributor Author

岡本です。

上記の、本来の5分の1程度の値が出る問題は
IMUSensor.cs 51行目の関数をFixedUpdate()からUpdate()に変更したのに対して、
関数内部での時間変位dtの値をTime.fixedDeltaTime()で取得しているためでした。

以上を踏まえ、次のどちらかの修正を行った際に期待通りの動作が確認できました。

IMUSensor.cs 61行目: _rotation → _rotation_tmp
のみを修正する

IMUSensor.cs 61行目: _rotation → _rotation_tmp
IMUSensor.cs 51行目: private void FixedUpdate() → protected override void Update()
IMUSensor.cs ??行目: 上記関数内最終行にbase.Update();を追記
IMUSensor.cs 53行目: Time.fixedDeltaTime → Time.deltaTime

(私はFixedUpdateとUpdateの違いが理解できていないので、どちらの方が良いのか分かりません。)

以上、よろしくお願いいたします。

@Autumn60
Copy link
Contributor

@o-tatchan
検証大変助かります!
もしよければ 2. の修正を行ったものについてmasterブランチ宛にPRを出していただくことは可能でしょうか?

@o-tatchan
Copy link
Contributor Author

分かりました!!

@o-tatchan
Copy link
Contributor Author

2.の修正内容でPR を送りました。
github初心者なので、送り方が間違えていたらすみません。

また、先ほど触っていて発見したのですが、
IMUをアタッチしたオブジェクトをUpdate()で動かすと問題ない値が出るのですが、
FixedUpdate()で動かしていると、2.の修正では正常に動かないことがあるようでした。

1.の修正では、オブジェクトの動作がFixedUpdate()かUpdate()かにかかわらず問題ありません。

1.の修正版が必要であれば改めてPRを送り直します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants