s-nakaoka / choreonoid

An integrated graphical robotics application framework
http://choreonoid.org
Other
94 stars 58 forks source link

Poseへの接触点情報の追加 #221

Closed kindsenior closed 4 years ago

kindsenior commented 5 years ago

Pose::LinkInfoとPoseSeqファイルに接触リンクの接触点に関する情報を追加しました

コミットの概要は以下のようになっています

s-nakaoka commented 4 years ago

確認が遅くなってしまい申し訳ありません。 変更内容については概ね理解できたと思うのですが、念の為以下について確認させてください。

kindsenior commented 4 years ago

ご確認ありがとうございます

s-nakaoka commented 4 years ago

対応が遅くなってしまい申し訳ありません。ご回答いただきありがとうございます。 マージしておきました。

修正の意図については了解です。

また、処理速度の面で、先の書き込みでは私自身まだ十分把握できていなかったのですが、再度コードを確認したところ、この修正では軌道生成やバランス補正において処理が重くなる要素は無いようですね。LinkInfo作成時に情報を入れているだけで、その後の参照においては特に追加の処理はないようですので。面倒な指摘をしてしまいましてすみません。

s-nakaoka commented 4 years ago

以下参考までにお知らせします。上記のようにコード自体に重くなる要素はほぼないのですが、念の為コード修正による軌道生成やバランス補正の処理時間の差を計測してみました。データとしては某二足歩行人型ロボットのおよそ3分のダンスデータをバランス補正計算回数3回として試してみました。環境はUbuntu 18.04でRyzen 3900Xです。

この条件で、軌道生成におよそ3秒ほどかかります。それで、修正前はだいたい3秒なのですが、プルリク適用後は3.1秒〜3.2秒程度に処理が遅くなりました。割合で言うとざっくり5%くらい遅くなる感じです。

vector<Vector3> contactPoints_ が追加されていることでキャッシュヒットに影響があるのかと思い、そこを除去して適当にビルドできるようにしたコードで試してみたのですが、結果は同じでした。

そこで予測するに、どうもこの修正によるコード追加でコード量が増えた分、プログラムコードのメモリ内での配置が少し変わって、それがプログラムコードのキャッシュのヒットに影響を与えた可能性があるかなと思っています。この判断の材料として、CMakeLists.txt内で.cppの順番を適当に変えて試したところ、処理速度の差が2%程度に縮まったりもしました。これはDLL内での各コードの配置が変わったことによるものだと思います。

というわけで、Kojimaさんのコードが悪いわけでは全く無いのですが、ちょっとしたコード量の変化で処理速度が数パーセント変わることもあるという事実が分かりました。以前も同様のことがあったので、そういうものなのだと思います。コードを修正して遅くなったからと言って、そのコード自体が悪いとは限らないということを、覚えておく必要がありますね。

あとはオブジェクトファイルのリンクの順番でも実行速度が変わるようなので、その部分を最適化してくれるツールがあったりするとよいですよね。実際順序を変えるだけで数パーセントのレベルではけっこう変わるので、どう並べたらよいものか気になるところではあります。

以上本件とは直接関係ありませんが、本件のマージ中に気づいたことなので、参考までにコメントしました。

s-nakaoka commented 4 years ago

あと今回の修正と直接関係する事柄として、以下の点が若干気になりましたので、念の為書いておきます。

s-nakaoka commented 4 years ago

@kindsenior

このプルリク(マージ済み)のコードに問題があり、修正したのでお知らせします。 1a1e10d1c9afade463dd826e2255201c3a12a2fd

Poseオブジェクトのrestoreにおいて、ikLinkに関してこのプルリクで新たに追加された "contactPoints" が記述されていないと、ikLinkの接触情報が(全て)取り込まれないようになっていました。このため、この改良がなされる以前に作成された動作データ(キーポーズ列ファイル)を読み込む場合に、作成時の動作が正常に再現しないという不具合が発生していました。

具体的には、ZMP軌道の自動生成に影響があり、自動バランス補正が正しく機能しない状態となっていました。例えば、サンプルとしてバンドルされているsample/PoseSeq/GR001.cnoid のプロジェクトでも、サンプルの動作データでZMP軌道が正しく生成されず、生成された動作をシミュレーションすると転倒してしまっていました。

そこでPoseオブジェクトのrestore関数について、contactPointsノードがない場合でも、接触情報(isTouching等の情報)は読み込んで反映されるように修正しました。この場合空のcontactPointsが設定されます。

後は関連する部分のコードを少し整理しておきました。

これでGR001のサンプルも含めて、私の手持ちの既存の動作データも正常に動かせるようになりました。

ただしこの修正でcontactPointsの処理にまずい部分がひょっとすると入っているかもしれませんので、そちらについて問題がないかご確認いただければと思います。

というわけなのですが、修正においてはなるべく既存データとの互換性も考慮していただけるとうれしいです。(と言いつつ私も互換性をなくす修正をちょくちょくしてしまっているとは思いますが・・・。)

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