Closed atinfinity closed 3 years ago
メカナムローバーのオドメトリは、メカナムローバー Ver 2.1 ROS制御モード取扱説明書の/rover_odoに関する説明(31ページ付近)にある通り、本製品のサンプルパッケージに含まれるノード「pub_odom」にて行われます。
/launch/vmecanumrover.launchを実行後、rosrun mecanumrover pub_odom
を実行すると、/odomにオドメトリがpublishされます。
@toshimori 説明が不十分で申し訳ありません。
このチケットで言及しているのは実機の系ではなく、Gazeboの系でrover_odoの値がおかしいのではないかということでした。rover_twistとrover_odoのtwistの値に大きな乖離があるのは意図通りでしょうか?
この質問の背景としては、Gazebo環境でvmegaroverを使ってgmappingを動かしてみたところ、車両をキー操作で動かす度にLRFのスキャンと地図がどんどんずれていくという現象がみられていて、その原因を探っていたところrover_odoの結果がおかしいのではないかということがわかりました(gmappingへ入力するodomへの変換はpub_odomで実施することは認識しています)。
vmegarover(メガローバー)ではGazeboから得られるodomをそのまま使っているようですが、vmecanumrover(メカナムローバー)ではホイール回転数をもとにvmecanum_odomでrover_odoを計算しているように見受けられます。
ご指摘につきまして把握しました。補足いただきありがとうございます。
メガローバーとメカナムローバーのオドメトリの差異につきまして、仕様上統一されておらず混乱を招き申し訳ありませんが、メカナムローバーのシミュレータでは実機がモータのエンコーダから得られた回転数からオドメトリを計算しているフローをそのまま再現しております。
そのため、誤差についてはメガローバーのシミュレータより顕著に見られると思われます。
ただ、ご提示いただいた数値より、実機の挙動からも割と大きめに乖離しておりましたので、こちらで検証いたしました。
/src/vmecanum_odom.cppの10行目をfloat w_rate=0.0625f;
に差し替えると、今よりも実機に近い挙動となります(まだ若干の差異はあります)。
@toshimori ご提示頂いた仮修正を適用したところlinear.xは近い値になっていること確認できました。一方でangular.zに関しては乖離が大きい問題がまだ残っているようです。
rostopic echo rover_odo
linear:
x: 0.994802176952
y: 0.010379716754
z: 0.0
angular:
x: 0.0
y: 0.0
z: -0.0271421035008
@toshimori 検証目的ですが指令値通りに動いたと仮定してvmecanum_odom.cppでrover_odoを計算する際stateでなく指令値のcommand値を直接使ってみましたが現状の計算式で得られるangular.zの結果が明らかにおかしいように見受けられるので、角速度の計算式が誤っているのではないと考えています。今の実装の元になっている情報源はありますか?
検証いただきありがとうございます。angluar.zを含め、実機(Arduino)で車輪のエンコーダ値からgeometry_msgs::Twistの各種数値を変換するロジックをそのまま移植しておりますが、何か反映し忘れている情報などが無いか見直してみます。
上記は、実機をご購入いただいた方であれば、DLいただけるサンプルソースに含まれております。
@toshimori 本件進展ありましたらお教え頂ければ幸いです。
@atinfinity 返答が遅くなり申し訳ありません。 原因について調査を進めておりますが、現時点では特定・改善出来ておりません。
根本的な解決ではありませんが、mecanumrover_samples/src/vmecanum_twist.cppの53行目
float mem_com_z = twist_last.angular.z*gain; //[rad/s]
について、
float mem_com_z = twist_last.angular.z*gain*1.25f; //[rad/s]
のように旋回の出力を補強することで、数値上は近い値に補正できます。
実機でも同様の現象が見られているように思います.
シミュレータの方では確認していませんが,vmecanum_twist内の
float dCenter2Wheel = sqrt(ROVER_D*ROVER_D + ROVER_HB*ROVER_HB);
について
float dCenter2Wheel = ROVER_D + ROVER_HB;
ではないでしょうか?
@nyomaron
ご指摘ありがとうございます。
確認しましたところ、
float dCenter2Wheel = ROVER_D + ROVER_HB;
が正しい値でした。
制御式に誤りがあり申し訳ございません。 実機のライブラリもあわせて更新させて頂きます。
vmecanumroverが発行するオドメトリ(
rover_odo
)を確認すると値がおかしいように見受けられます。再現手順
シミュレータ起動
rover_twist配信
odom購読
参考情報
姉妹プロジェクトのhttps://github.com/vstoneofficial/megarover_samplesだとodomの値は問題なさそうです。
シミュレータ起動
cmd_vel配信
odom購読