BLOGY-modifyは、ものづくりを楽しむ学生達のコミュニティです。各メンバーの得意な分野をかけあわせ、世の中にテクノロジーで変化をもたらします。Y-modifycoord.eです。忘れそうなので進捗より先にこっち書きます。この記事の至るところにバグと書いていますが、あながちバグといったものではないのかもしれません。望んだ動作が得られないことは確かなので、とりあえずバグと書いています。タイトルに「Gazeboの」と書きました。正確には、このバグが起きる条件は・GazeboのJoint::SetPosition関数を_preserveWorldVelocityをtrueにせずに呼んだときです。・ROSとの連携で"position_controllers/PositionJointController"をpid_gainsを指定しないで使用した場合です。Bulletを直接使うようになる前(Gazeboを使っていた時)、私達はこの地雷を見事に踏んでいました。調査したので、ここにまとめてみようと思います。どのような問題なのかhttp://answers.gazebosim.org/question/18684/mobile-arm-simulation-behaves-strangely-when-adding-ros_control-plugin/上の質問・回答が一番わかり易いと思います。ros_controlプラグインを使ったときに落下がおかしいよってことです。詳しく言うと、Joint::SetPosition関数が今回の地雷なのですが、それを呼び出すのが"position_controllers/PositionJointController"です。(ここら)上のページでは、ワークアラウンドとして次の2つが挙げられています。EffortJointInterface/VelocityJointInterfaceを使う/gazebo_ros_control/pid_gains/を設定する実際どちらでも治ります。どちらでもSetPositionは呼ばれません。2.)ですが1.はサーボを位置制御しているYamaXでは論外ですし2.もPID制御なしの純粋な位置制御をしたいときに困ります。位置制御しながら解決する方法は?ではどうしたら良いのでしょう。Gazebo8ぐらいまではどうしようもなかったのですが、Gazebo9からJoint::SetPositionに_preserveWorldVelocity引数が追加されました。PRに書いてあります。2.)ですが、どうも今までの挙動にも使いどころがあるらしく、設定を変えずに挙動が変わっては困るということで_preserveWorldVelocityフラグが導入されることになったようです。これをtrueにすると修正されると。(3.)まあそこまではいいんですが、_preserveWorldVelocity、デフォルトがfalse。これをURDFやroslaunchなどから設定する術はなさそうです。(http://answers.gazebosim.org/question/18708/how-can-i-set-the-preserveworldvelocity-flag-in-gazebo-9-hopefully-through-roslaunch-and-urdf/)つまり、自前でビルドしろと言うことですね★ソースから修正するそこで必要な修正をこのパッチに書きました。true);このようにデフォルト値をTrueにしています。どこかから明示的にfalseを投げてられていることがあったので、下のような修正も施しました。true);}人として最低な変更ですね。動きゃいいんだよ精神です。いうことでこのパッチを使用する際は細心の注意を払ってください。何気に他のバグを誘発するようなことしてます。治った...?https://blog.y-modify.org/wp-content/uploads/2018/03/bug.out_.webm先日の記事にもあったこの動画です。左が改造前、右が改造後です。落下のおかしさはこれで治りました。