お世話様です。
PythonScriptで、
AGXSimulatorItem = Item.find("AGXSimulator")
ItemTreeView.instance.selectItem(AGXSimulatorItem)
AGXSimulatorItem.startSimulation()
…
… シミュレーション処理で、正常に[実行される
…
AGXSimulatorItem.stopSimulation() の後に以下のコードで、
# get the object of cnoid.BodyPlugin.BodyMotionItem class
bodyMotionItem = Item.find("AGXSimulator-XXX")
# get the object of cnoid.Body.BodyMotion class
bodyMotion = bodyMotionItem.getMotion()
# get frameRate on the cnoid.Body.BodyMotion.getFrameRate()
frameRate = bodyMotion.getFrameRate()
# get getNumFrames on the cnoid.Body.BodyMotion.getNumFrames()
numFrames = bodyMotion.getNumFrames()
# get getNumParts on the cnoid.Body.BodyMotion.getNumParts()
numParts = bodyMotion.getNumParts()
# get the object of cnoid.Util.MultiValueSeq class
MVSeq = bodyMotion.jointPosSeq --> ここで RuntimeError: Access violation - no RTTI data! となる!
原因が分からず困っております。 どなたか詳しい方、原因と対策を教えて貰えないでしょうか。。。。
以上、宜しくお願い致します。
yosuke
January 11, 2019, 1:13am
2
Python連携はおそらくpybind11を使った実装の方を使っているのではないかと思うのですが、コードを見ると以下のようになっていますね。
// deprecated
.def("getSigCollisionsUpdated", &WorldItem::sigCollisionsUpdated)
;
PyItemList<WorldItem>(m, "WorldItemList");
py::class_<BodyMotionItem, BodyMotionItemPtr, AbstractSeqItem>(m, "BodyMotionItem")
.def(py::init<>())
.def_property_readonly("motion", [](BodyMotionItem* item){ return item->motion(); })
.def_property_readonly("jointPosSeqItem", (MultiValueSeqItem*(BodyMotionItem::*)())&BodyMotionItem::jointPosSeqItem)
.def_property_readonly("jointPosSeq", &BodyMotionItem::jointPosSeq)
.def_property_readonly("linkPosSeqItem", (MultiSE3SeqItem*(BodyMotionItem::*)())&BodyMotionItem::linkPosSeqItem)
.def_property_readonly("linkPosSeq", &BodyMotionItem::linkPosSeq)
.def_property_readonly("numExtraSeqItems", &BodyMotionItem::numExtraSeqItems)
.def("extraSeqKey", &BodyMotionItem::extraSeqKey)
.def("extraSeqItem", (AbstractSeqItem*(BodyMotionItem::*)(int))&BodyMotionItem::extraSeqItem)
.def("updateExtraSeqItems", &BodyMotionItem::updateExtraSeqItems)
// deprecated
.def("getMotion", [](BodyMotionItem* item){ return item->motion(); })
.def("getJointPosSeqItem", (MultiValueSeqItem*(BodyMotionItem::*)())&BodyMotionItem::jointPosSeqItem)
エラーを見るとpybind11がjointPosSeqの型情報にアクセスできていないような症状ですが、jointPosSeqの情報を取ることができるjointPosSeqItemというプロパティがあり、こちらの方はより手厚く型情報が設定してありそうな雰囲気です。
MVSeq = bodyMotion.jointPosSeqItem
でやってみるとどうなりますでしょうか?
yosukeさんへ HiroWadaです。 ご返答、ありがとうございます。
jointPosSeqItemの方からも試してみましたが、同じ現象でした。 どうもシミュレーションの開始が正しく動作していないようです。 AGXSimulatorItemのstartSimulation() ではなく、
SimulationBar.instance.startSimulation(bool doReset) を使用して、とりあえずクリアしました。
ただ、2度目のシミュレーション開始を連続して行うと、
ItemTreeView.selectItem(AGXSimulatorItem) の後にSimulationBar.startSimulation(True)
を実行しているのですが、以下のところで落ちます。
void BodyMotion::setFrameRate(double frameRate)
{
linkPosSeq_->setFrameRate(frameRate);
jointPosSeq_->setFrameRate(frameRate); <--ここで落ちる
for(ExtraSeqMap::iterator p = extraSeqs.begin(); p != extraSeqs.end(); ++p){
p->second->setFrameRate(frameRate);
}
}
やはり、開始動作が正しくできていないようです。
とりあえず、きれいではありませんが、プロジェクトを削除、再ロードしてから
シミュレーションを再度開始することで切り抜けました。
ありがとうございました。