bodyMotion.jointPosSeqのアクセス時にAccess violation - no RTTI data!が出る現象の件


#1

お世話様です。

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! となる!

原因が分からず困っております。 どなたか詳しい方、原因と対策を教えて貰えないでしょうか。。。。

以上、宜しくお願い致します。


#2

Python連携はおそらくpybind11を使った実装の方を使っているのではないかと思うのですが、コードを見ると以下のようになっていますね。

エラーを見るとpybind11がjointPosSeqの型情報にアクセスできていないような症状ですが、jointPosSeqの情報を取ることができるjointPosSeqItemというプロパティがあり、こちらの方はより手厚く型情報が設定してありそうな雰囲気です。

MVSeq = bodyMotion.jointPosSeqItem

でやってみるとどうなりますでしょうか?


#3

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);
}

}

やはり、開始動作が正しくできていないようです。
とりあえず、きれいではありませんが、プロジェクトを削除、再ロードしてから
シミュレーションを再度開始することで切り抜けました。

ありがとうございました。