Closed kindsenior closed 4 years ago
以下の3つの変更です
from cnoid import Body, Base, BodyPlugin body = Base.ItemTreeView.instance.selectedItem(BodyPlugin.BodyItem).body jp = Body.getCustomJointPath(body, body.rootLink, body.link("joint name")) J = numpy.ndarray((6,jp.numJoints)) jp.calcJacobian(J)
https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html#pass-by-reference によるとEigen::Refを用いる今回の修正で正しいような気はするのですが,以前のコードでも参照渡しできていたような記憶があるので使い方等を間違えているようでしたらご指摘いただけると幸いです
あと懸念事項としては,データ保持形式がEigen(Column Major)とnumpy(Row Major)で異なっていた(https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html#storage-orders) ので,pythonからアクセスするときだけEigenをRow Majorに変換するようにしていますが,こちらもpythonからJ = np.ndarray((6,6), order='F')などすれば不要ではあるので実装方法は要検討かもしれません.
J = np.ndarray((6,6), order='F')
修正ありがとうございます。 Eigenの参照渡しや要素の並びの問題についてこれまで把握できていませんでした。参照の件はpybind11のマニュアルの説明に従っているのでしたら大丈夫だと思いますし、要素の並びについてもPython側での記述は少ないほうがよいと思うので、これでよいのではないかと思います。
以下の3つの変更です
https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html#pass-by-reference によるとEigen::Refを用いる今回の修正で正しいような気はするのですが,以前のコードでも参照渡しできていたような記憶があるので使い方等を間違えているようでしたらご指摘いただけると幸いです
あと懸念事項としては,データ保持形式がEigen(Column Major)とnumpy(Row Major)で異なっていた(https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html#storage-orders) ので,pythonからアクセスするときだけEigenをRow Majorに変換するようにしていますが,こちらもpythonから
J = np.ndarray((6,6), order='F')
などすれば不要ではあるので実装方法は要検討かもしれません.